Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(290)

Unified Diff: src/gpu/batches/GrAAStrokeRectBatch.cpp

Issue 1359453002: Fix for degenerate stroke rect (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: handle degenerate stroke rects Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/gpu/batches/GrAAStrokeRectBatch.cpp
diff --git a/src/gpu/batches/GrAAStrokeRectBatch.cpp b/src/gpu/batches/GrAAStrokeRectBatch.cpp
index 4472b0125b74ea48fe9d968fa6b0d83eed876a3b..037f2f9d12026d5697edfccbd6a19f9e71ec5e12 100644
--- a/src/gpu/batches/GrAAStrokeRectBatch.cpp
+++ b/src/gpu/batches/GrAAStrokeRectBatch.cpp
@@ -54,13 +54,14 @@ public:
SkRect fDevInside;
GrColor fColor;
bool fMiterStroke;
+ bool fDegenerate;
};
static GrDrawBatch* Create(GrColor color, const SkMatrix& viewMatrix, const SkRect& devOutside,
const SkRect& devOutsideAssist, const SkRect& devInside,
- bool miterStroke) {
+ bool miterStroke, bool degenerate) {
return new AAStrokeRectBatch(color, viewMatrix, devOutside, devOutsideAssist, devInside,
- miterStroke);
+ miterStroke, degenerate);
}
const char* name() const override { return "AAStrokeRect"; }
@@ -81,7 +82,8 @@ private:
void initBatchTracker(const GrPipelineOptimizations&) override;
AAStrokeRectBatch(GrColor color, const SkMatrix& viewMatrix, const SkRect& devOutside,
- const SkRect& devOutsideAssist, const SkRect& devInside, bool miterStroke)
+ const SkRect& devOutsideAssist, const SkRect& devInside, bool miterStroke,
+ bool degenerate)
: INHERITED(ClassID()) {
fBatch.fViewMatrix = viewMatrix;
Geometry& geometry = fGeoData.push_back();
@@ -90,6 +92,7 @@ private:
geometry.fDevOutsideAssist = devOutsideAssist;
geometry.fDevInside = devInside;
geometry.fMiterStroke = miterStroke;
+ geometry.fDegenerate = degenerate;
// If we have miterstroke then we inset devOutside and outset devOutsideAssist, so we need
// the join for proper bounds
@@ -129,6 +132,7 @@ private:
const SkRect& devOutsideAssist,
const SkRect& devInside,
bool miterStroke,
+ bool degenerate,
bool tweakAlphaForCoverage) const;
struct BatchTracker {
@@ -211,6 +215,7 @@ void AAStrokeRectBatch::onPrepareDraws(Target* target) {
args.fDevOutsideAssist,
args.fDevInside,
args.fMiterStroke,
+ args.fDegenerate,
canTweakAlphaForCoverage);
}
helper.recordDraw(target);
@@ -351,6 +356,7 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
const SkRect& devOutsideAssist,
const SkRect& devInside,
bool miterStroke,
+ bool degenerate,
bool tweakAlphaForCoverage) const {
intptr_t verts = reinterpret_cast<intptr_t>(vertices) + offset;
@@ -386,9 +392,16 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
set_inset_fan(fan0Pos, vertexStride, devOutside, -SK_ScalarHalf, -SK_ScalarHalf);
// inner two
set_inset_fan(fan1Pos, vertexStride, devOutside, inset, inset);
- set_inset_fan(fan2Pos, vertexStride, devInside, -inset, -inset);
- // innermost
- set_inset_fan(fan3Pos, vertexStride, devInside, SK_ScalarHalf, SK_ScalarHalf);
+ if (!degenerate) {
+ set_inset_fan(fan2Pos, vertexStride, devInside, -inset, -inset);
+ // innermost
+ set_inset_fan(fan3Pos, vertexStride, devInside, SK_ScalarHalf, SK_ScalarHalf);
+ } else {
robertphillips 2015/09/21 17:12:44 // When the interior rect has become degenerate ..
joshualitt 2015/09/21 19:51:25 Acknowledged.
+ fan2Pos->setRectFan(devInside.fLeft, devInside.fTop,
+ devInside.fRight, devInside.fBottom, vertexStride);
+ fan3Pos->setRectFan(devInside.fLeft, devInside.fTop,
+ devInside.fRight, devInside.fBottom, vertexStride);
+ }
} else {
SkPoint* fan0AssistPos = reinterpret_cast<SkPoint*>(verts + 4 * vertexStride);
SkPoint* fan1AssistPos = reinterpret_cast<SkPoint*>(verts +
@@ -401,10 +414,17 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
// outer one of the inner two
set_inset_fan(fan1Pos, vertexStride, devOutside, inset, inset);
set_inset_fan(fan1AssistPos, vertexStride, devOutsideAssist, inset, inset);
- // inner one of the inner two
- set_inset_fan(fan2Pos, vertexStride, devInside, -inset, -inset);
- // innermost
- set_inset_fan(fan3Pos, vertexStride, devInside, SK_ScalarHalf, SK_ScalarHalf);
+ if (!degenerate) {
+ // inner one of the inner two
+ set_inset_fan(fan2Pos, vertexStride, devInside, -inset, -inset);
+ // innermost
+ set_inset_fan(fan3Pos, vertexStride, devInside, SK_ScalarHalf, SK_ScalarHalf);
+ } else {
robertphillips 2015/09/21 17:12:44 // When the interior rect has become degenerate ..
joshualitt 2015/09/21 19:51:25 Acknowledged.
+ fan2Pos->setRectFan(devInside.fLeft, devInside.fTop,
+ devInside.fRight, devInside.fBottom, vertexStride);
+ fan3Pos->setRectFan(devInside.fLeft, devInside.fTop,
+ devInside.fRight, devInside.fBottom, vertexStride);
+ }
}
// Make verts point to vertex color and then set all the color and coverage vertex attrs
@@ -421,7 +441,7 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
// scale is the coverage for the the inner two rects.
int scale;
robertphillips 2015/09/21 17:12:44 This hardens the inner/outer fan too
joshualitt 2015/09/21 19:51:25 Acknowledged.
- if (inset < SK_ScalarHalf) {
+ if (inset < SK_ScalarHalf && !degenerate) {
scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf));
SkASSERT(scale >= 0 && scale <= 255);
} else {
@@ -442,14 +462,18 @@ void AAStrokeRectBatch::generateAAStrokeRectGeometry(void* vertices,
}
}
- // The innermost rect has 0 coverage
+ // The innermost rect has 0 coverage, unless we are degenerate
verts += (outerVertexNum + innerVertexNum) * vertexStride;
+ scale = 0;
+ if (degenerate) {
+ scale = 0xff;
+ }
for (int i = 0; i < innerVertexNum; ++i) {
if (tweakAlphaForCoverage) {
- *reinterpret_cast<GrColor*>(verts + i * vertexStride) = 0;
+ *reinterpret_cast<GrColor*>(verts + i * vertexStride) = scale;
} else {
*reinterpret_cast<GrColor*>(verts + i * vertexStride) = color;
- *reinterpret_cast<GrColor*>(verts + i * vertexStride + sizeof(GrColor)) = 0;
+ *reinterpret_cast<GrColor*>(verts + i * vertexStride + sizeof(GrColor)) = scale;
}
}
}
@@ -461,9 +485,10 @@ GrDrawBatch* Create(GrColor color,
const SkRect& devOutside,
const SkRect& devOutsideAssist,
const SkRect& devInside,
- bool miterStroke) {
+ bool miterStroke,
+ bool degenerate) {
return AAStrokeRectBatch::Create(color, viewMatrix, devOutside, devOutsideAssist, devInside,
- miterStroke);
+ miterStroke, degenerate);
}
};
@@ -476,6 +501,7 @@ GrDrawBatch* Create(GrColor color,
DRAW_BATCH_TEST_DEFINE(AAStrokeRectBatch) {
bool miterStroke = random->nextBool();
+ bool degenerate = random->nextBool();
// Create mock stroke rect
SkRect outside = GrTest::TestRect(random);
@@ -489,7 +515,7 @@ DRAW_BATCH_TEST_DEFINE(AAStrokeRectBatch) {
GrColor color = GrRandomColor(random);
return GrAAStrokeRectBatch::Create(color, GrTest::TestMatrix(random), outside, outsideAssist,
- inside, miterStroke);
+ inside, degenerate, miterStroke);
}
#endif

Powered by Google App Engine
This is Rietveld 408576698