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

Commit ff29b5a5 authored by Chris Craik's avatar Chris Craik
Browse files

Fix round cap approximation to understand scale

bug:19772120
Change-Id: I7b944faed1d1e8d5f55453802da57679217d9d9a
parent 60bf94e3
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -151,13 +151,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);
    }