Index: src/utils/SkPatchUtils.cpp |
diff --git a/src/utils/SkPatchUtils.cpp b/src/utils/SkPatchUtils.cpp |
index 9d095ae5cfdaff33c9a483e120e1fc3ae4486219..cbaae39e8e9d851755c519ccd3843e1556b6a8c2 100644 |
--- a/src/utils/SkPatchUtils.cpp |
+++ b/src/utils/SkPatchUtils.cpp |
@@ -28,20 +28,20 @@ |
*/ |
class FwDCubicEvaluator { |
- |
+ |
public: |
- |
+ |
/** |
* Receives the 4 control points of the cubic bezier. |
*/ |
- |
+ |
explicit FwDCubicEvaluator(const SkPoint points[4]) |
: fCoefs(points) { |
memcpy(fPoints, points, 4 * sizeof(SkPoint)); |
- |
+ |
this->restart(1); |
} |
- |
+ |
/** |
* Restarts the forward differences evaluator to the first value of t = 0. |
*/ |
@@ -58,14 +58,14 @@ public: |
fFwDiff[1] = to_point(fCoefs.fA * h3 + fCoefs.fB * h2 + fCoefs.fC * h); |
fFwDiff[0] = to_point(fCoefs.fD); |
} |
- |
+ |
/** |
* Check if the evaluator is still within the range of 0<=t<=1 |
*/ |
bool done() const { |
return fCurrent > fMax; |
} |
- |
+ |
/** |
* Call next to obtain the SkPoint sampled and move to the next one. |
*/ |
@@ -77,11 +77,11 @@ public: |
fCurrent++; |
return point; |
} |
- |
+ |
const SkPoint* getCtrlPoints() const { |
return fPoints; |
} |
- |
+ |
private: |
SkCubicCoeff fCoefs; |
int fMax, fCurrent, fDivisions; |
@@ -115,29 +115,29 @@ static SkScalar bilerp(SkScalar tx, SkScalar ty, SkScalar c00, SkScalar c10, SkS |
} |
SkISize SkPatchUtils::GetLevelOfDetail(const SkPoint cubics[12], const SkMatrix* matrix) { |
- |
+ |
// Approximate length of each cubic. |
SkPoint pts[kNumPtsCubic]; |
SkPatchUtils::getTopCubic(cubics, pts); |
matrix->mapPoints(pts, kNumPtsCubic); |
SkScalar topLength = approx_arc_length(pts, kNumPtsCubic); |
- |
+ |
SkPatchUtils::getBottomCubic(cubics, pts); |
matrix->mapPoints(pts, kNumPtsCubic); |
SkScalar bottomLength = approx_arc_length(pts, kNumPtsCubic); |
- |
+ |
SkPatchUtils::getLeftCubic(cubics, pts); |
matrix->mapPoints(pts, kNumPtsCubic); |
SkScalar leftLength = approx_arc_length(pts, kNumPtsCubic); |
- |
+ |
SkPatchUtils::getRightCubic(cubics, pts); |
matrix->mapPoints(pts, kNumPtsCubic); |
SkScalar rightLength = approx_arc_length(pts, kNumPtsCubic); |
- |
+ |
// Level of detail per axis, based on the larger side between top and bottom or left and right |
int lodX = static_cast<int>(SkMaxScalar(topLength, bottomLength) / kPartitionSize); |
int lodY = static_cast<int>(SkMaxScalar(leftLength, rightLength) / kPartitionSize); |
- |
+ |
return SkISize::Make(SkMax32(8, lodX), SkMax32(8, lodY)); |
} |
@@ -210,12 +210,12 @@ bool SkPatchUtils::getVertexData(SkPatchUtils::VertexData* data, const SkPoint c |
} |
data->fColors = new uint32_t[data->fVertexCount]; |
} |
- |
+ |
// if texture coordinates are not null then create array for them |
if (texCoords) { |
data->fTexCoords = new SkPoint[data->fVertexCount]; |
} |
- |
+ |
SkPoint pts[kNumPtsCubic]; |
SkPatchUtils::getBottomCubic(cubics, pts); |
FwDCubicEvaluator fBottom(pts); |
@@ -225,10 +225,10 @@ bool SkPatchUtils::getVertexData(SkPatchUtils::VertexData* data, const SkPoint c |
FwDCubicEvaluator fLeft(pts); |
SkPatchUtils::getRightCubic(cubics, pts); |
FwDCubicEvaluator fRight(pts); |
- |
+ |
fBottom.restart(lodX); |
fTop.restart(lodX); |
- |
+ |
SkScalar u = 0.0f; |
int stride = lodY + 1; |
for (int x = 0; x <= lodX; x++) { |
@@ -238,9 +238,9 @@ bool SkPatchUtils::getVertexData(SkPatchUtils::VertexData* data, const SkPoint c |
SkScalar v = 0.f; |
for (int y = 0; y <= lodY; y++) { |
int dataIndex = x * (lodY + 1) + y; |
- |
+ |
SkPoint left = fLeft.next(), right = fRight.next(); |
- |
+ |
SkPoint s0 = SkPoint::Make((1.0f - v) * top.x() + v * bottom.x(), |
(1.0f - v) * top.y() + v * bottom.y()); |
SkPoint s1 = SkPoint::Make((1.0f - u) * left.x() + u * right.x(), |
@@ -255,7 +255,7 @@ bool SkPatchUtils::getVertexData(SkPatchUtils::VertexData* data, const SkPoint c |
+ v * ((1.0f - u) * fBottom.getCtrlPoints()[0].y() |
+ u * fBottom.getCtrlPoints()[3].y())); |
data->fPoints[dataIndex] = s0 + s1 - s2; |
- |
+ |
if (colors) { |
uint8_t a = uint8_t(bilerp(u, v, |
SkScalar(SkColorGetA(colorsPM[kTopLeft_Corner])), |
@@ -279,7 +279,7 @@ bool SkPatchUtils::getVertexData(SkPatchUtils::VertexData* data, const SkPoint c |
SkScalar(SkColorGetB(colorsPM[kBottomRight_Corner])))); |
data->fColors[dataIndex] = SkPackARGB32(a,r,g,b); |
} |
- |
+ |
if (texCoords) { |
data->fTexCoords[dataIndex] = SkPoint::Make( |
bilerp(u, v, texCoords[kTopLeft_Corner].x(), |
@@ -290,9 +290,9 @@ bool SkPatchUtils::getVertexData(SkPatchUtils::VertexData* data, const SkPoint c |
texCoords[kTopRight_Corner].y(), |
texCoords[kBottomLeft_Corner].y(), |
texCoords[kBottomRight_Corner].y())); |
- |
+ |
} |
- |
+ |
if(x < lodX && y < lodY) { |
int i = 6 * (x * lodY + y); |
data->fIndices[i] = x * stride + y; |