aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode/SampleCCPRGeometry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'samplecode/SampleCCPRGeometry.cpp')
-rw-r--r--samplecode/SampleCCPRGeometry.cpp33
1 files changed, 22 insertions, 11 deletions
diff --git a/samplecode/SampleCCPRGeometry.cpp b/samplecode/SampleCCPRGeometry.cpp
index a6a71af792..d1cb2b5b57 100644
--- a/samplecode/SampleCCPRGeometry.cpp
+++ b/samplecode/SampleCCPRGeometry.cpp
@@ -10,6 +10,7 @@
#if SK_SUPPORT_GPU
#include "GrContextPriv.h"
+#include "GrPathUtils.h"
#include "GrRenderTargetContext.h"
#include "GrRenderTargetContextPriv.h"
#include "GrResourceProvider.h"
@@ -155,7 +156,6 @@ void CCPRGeometryView::onDrawContent(SkCanvas* canvas) {
void CCPRGeometryView::updateGpuData() {
int vertexCount = num_points(fMode);
- int instanceCount = 1;
fGpuPoints.reset();
fGpuInstances.reset();
@@ -171,7 +171,7 @@ void CCPRGeometryView::updateGpuData() {
}
}
- instanceCount = chops.count() + 1;
+ int instanceCount = chops.count() + 1;
SkPoint chopped[10];
SkChopCubicAt(fPoints, chopped, chops.begin(), chops.count());
@@ -196,22 +196,33 @@ void CCPRGeometryView::updateGpuData() {
if (fMode >= Mode::kLoopInsets && SkCubicType::kLoop != type) {
fMode = (Mode) ((int) fMode - 2);
}
- } else {
- // Endpoints.
- fGpuPoints.push_back(fPoints[0]);
- fGpuPoints.push_back(fPoints[3]);
- // Control points.
- fGpuPoints.push_back(fPoints[1]);
- }
- if (4 == vertexCount) {
int controlPointsIdx = instanceCount + 1;
for (int i = 0; i < instanceCount; ++i) {
fGpuInstances.push_back().fCubicData = {controlPointsIdx + i * 4, i};
}
} else if (is_curve(fMode)) {
- fGpuInstances.push_back().fQuadraticData = {2, 0};
+ SkPoint P[3] = {fPoints[0], fPoints[1], fPoints[3]};
+ SkPoint chopped[5];
+ fGpuPoints.push_back(P[0]);
+ if (GrPathUtils::chopMonotonicQuads(P, chopped)) {
+ // Endpoints.
+ fGpuPoints.push_back(chopped[2]);
+ fGpuPoints.push_back(chopped[4]);
+ // Control points.
+ fGpuPoints.push_back(chopped[1]);
+ fGpuPoints.push_back(chopped[3]);
+ fGpuInstances.push_back().fQuadraticData = {3, 0};
+ fGpuInstances.push_back().fQuadraticData = {4, 1};
+ } else {
+ fGpuPoints.push_back(P[2]);
+ fGpuPoints.push_back(P[1]);
+ fGpuInstances.push_back().fQuadraticData = {2, 0};
+ }
} else {
+ fGpuPoints.push_back(fPoints[0]);
+ fGpuPoints.push_back(fPoints[3]);
+ fGpuPoints.push_back(fPoints[1]);
fGpuInstances.push_back().fTriangleData = {0, 2, 1}; // Texel buffer has endpoints first.
}