Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit da28c868 authored by Chris Craik's avatar Chris Craik Committed by Android (Google) Code Review
Browse files

Merge "Fix round cap approximation to understand scale" into mnc-dev

parents b3af4f43 ff29b5a5
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -152,13 +152,11 @@ public:
     */
    inline int capExtraDivisions() const {
        if (cap == SkPaint::kRound_Cap) {
            // always use 2 points for hairline
            if (halfStrokeWidth == 0.0f) return 2;

            // ROUND_CAP_THRESH is the maximum error for polygonal approximation of the round cap
            const float errConst = (-ROUND_CAP_THRESH / halfStrokeWidth + 1);
            const float targetCosVal = 2 * errConst * errConst - 1;
            int neededDivisions = (int)(ceilf(PI / acos(targetCosVal)/2)) * 2;
            return neededDivisions;
            float threshold = MathUtils::min(inverseScaleX, inverseScaleY) * ROUND_CAP_THRESH;
            return MathUtils::divisionsNeededToApproximateArc(halfStrokeWidth, PI, threshold);
        }
        return 0;
    }
+15 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@
#ifndef MATHUTILS_H
#define MATHUTILS_H

#include <math.h>

namespace android {
namespace uirenderer {

@@ -62,6 +64,19 @@ public:
        return scale;
    }

    /**
     * Returns the number of points (beyond two, the start and end) needed to form a polygonal
     * approximation of an arc, with a given threshold value.
     */
    inline static int divisionsNeededToApproximateArc(float radius,
            float angleInRads, float threshold) {
        const float errConst = (-threshold / radius + 1);
        const float targetCosVal = 2 * errConst * errConst - 1;

        // needed divisions are rounded up from approximation
        return (int)(ceilf(angleInRads / acos(targetCosVal)/2)) * 2;
    }

    inline static bool areEqual(float valueA, float valueB) {
        return isZero(valueA - valueB);
    }