Fix round cap approximation to understand scale

bug:19772120
Change-Id: I7b944faed1d1e8d5f55453802da57679217d9d9a
diff --git a/libs/hwui/PathTessellator.cpp b/libs/hwui/PathTessellator.cpp
index c1f61d6..7cafd7b 100644
--- a/libs/hwui/PathTessellator.cpp
+++ b/libs/hwui/PathTessellator.cpp
@@ -151,13 +151,11 @@
      */
     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;
     }
diff --git a/libs/hwui/utils/MathUtils.h b/libs/hwui/utils/MathUtils.h
index d89859b..9c3787c 100644
--- a/libs/hwui/utils/MathUtils.h
+++ b/libs/hwui/utils/MathUtils.h
@@ -16,6 +16,8 @@
 #ifndef MATHUTILS_H
 #define MATHUTILS_H
 
+#include <math.h>
+
 namespace android {
 namespace uirenderer {
 
@@ -62,6 +64,19 @@
         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);
     }