Merge "Fix round cap approximation to understand scale" into mnc-dev
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user