Index: src/gpu/batches/GrAALinearizingConvexPathRenderer.cpp |
diff --git a/src/gpu/batches/GrAALinearizingConvexPathRenderer.cpp b/src/gpu/batches/GrAALinearizingConvexPathRenderer.cpp |
index 20d93d8e9009935e7e8c70aee1559b3e5b26610e..c2873b6a404b4bf0dc52872ddbde41b0c5a4da6f 100644 |
--- a/src/gpu/batches/GrAALinearizingConvexPathRenderer.cpp |
+++ b/src/gpu/batches/GrAALinearizingConvexPathRenderer.cpp |
@@ -50,12 +50,17 @@ bool GrAALinearizingConvexPathRenderer::onCanDrawPath(const CanDrawPathArgs& arg |
return false; |
} |
const SkStrokeRec& stroke = args.fShape->style().strokeRec(); |
- if (stroke.getStyle() == SkStrokeRec::kStroke_Style) { |
+ |
+ if (stroke.getStyle() == SkStrokeRec::kStroke_Style || |
+ stroke.getStyle() == SkStrokeRec::kStrokeAndFill_Style) { |
if (!args.fViewMatrix->isSimilarity()) { |
return false; |
} |
SkScalar strokeWidth = args.fViewMatrix->getMaxScale() * stroke.getWidth(); |
- return strokeWidth >= 1.0f && strokeWidth <= kMaxStrokeWidth && |
+ if (strokeWidth < 1.0f && stroke.getStyle() == SkStrokeRec::kStroke_Style) { |
+ return false; |
+ } |
+ return strokeWidth <= kMaxStrokeWidth && |
args.fShape->knownToBeClosed() && |
stroke.getJoin() != SkPaint::Join::kRound_Join; |
} |
@@ -126,9 +131,11 @@ public: |
const SkMatrix& viewMatrix, |
const SkPath& path, |
SkScalar strokeWidth, |
+ SkStrokeRec::Style style, |
SkPaint::Join join, |
SkScalar miterLimit) : INHERITED(ClassID()) { |
- fGeoData.emplace_back(Geometry{color, viewMatrix, path, strokeWidth, join, miterLimit}); |
+ fGeoData.emplace_back(Geometry{ color, viewMatrix, path, |
+ strokeWidth, style, join, miterLimit }); |
// compute bounds |
SkRect bounds = path.getBounds(); |
@@ -229,7 +236,8 @@ private: |
uint16_t* indices = (uint16_t*) sk_malloc_throw(maxIndices * sizeof(uint16_t)); |
for (int i = 0; i < instanceCount; i++) { |
const Geometry& args = fGeoData[i]; |
- GrAAConvexTessellator tess(args.fStrokeWidth, args.fJoin, args.fMiterLimit); |
+ GrAAConvexTessellator tess(args.fStyle, args.fStrokeWidth, |
+ args.fJoin, args.fMiterLimit); |
if (!tess.tessellate(args.fViewMatrix, args.fPath)) { |
continue; |
@@ -309,6 +317,7 @@ private: |
SkMatrix fViewMatrix; |
SkPath fPath; |
SkScalar fStrokeWidth; |
+ SkStrokeRec::Style fStyle; |
SkPaint::Join fJoin; |
SkScalar fMiterLimit; |
}; |
@@ -324,6 +333,7 @@ bool GrAALinearizingConvexPathRenderer::onDrawPath(const DrawPathArgs& args) { |
"GrAALinearizingConvexPathRenderer::onDrawPath"); |
SkASSERT(!args.fDrawContext->isUnifiedMultisampled()); |
SkASSERT(!args.fShape->isEmpty()); |
+ SkASSERT(!args.fShape->style().pathEffect()); |
SkPath path; |
args.fShape->asPath(&path); |
@@ -335,8 +345,9 @@ bool GrAALinearizingConvexPathRenderer::onDrawPath(const DrawPathArgs& args) { |
SkAutoTUnref<GrDrawBatch> batch(new AAFlatteningConvexPathBatch(args.fPaint->getColor(), |
*args.fViewMatrix, |
- path, strokeWidth, join, |
- miterLimit)); |
+ path, strokeWidth, |
+ stroke.getStyle(), |
+ join, miterLimit)); |
GrPipelineBuilder pipelineBuilder(*args.fPaint); |
pipelineBuilder.setUserStencil(args.fUserStencilSettings); |
@@ -354,10 +365,29 @@ DRAW_BATCH_TEST_DEFINE(AAFlatteningConvexPathBatch) { |
GrColor color = GrRandomColor(random); |
SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random); |
SkPath path = GrTest::TestPathConvex(random); |
- SkScalar strokeWidth = random->nextBool() ? -1.f : 2.f; |
+ |
+ SkStrokeRec::Style styles[3] = { SkStrokeRec::kFill_Style, |
+ SkStrokeRec::kStroke_Style, |
+ SkStrokeRec::kStrokeAndFill_Style }; |
+ |
+ SkStrokeRec::Style style = styles[random->nextU() % 3]; |
+ |
+ SkScalar strokeWidth = -1.f; |
SkPaint::Join join = SkPaint::kMiter_Join; |
SkScalar miterLimit = 0.5f; |
- return new AAFlatteningConvexPathBatch(color, viewMatrix, path, strokeWidth, join, miterLimit); |
+ |
+ if (SkStrokeRec::kFill_Style != style) { |
+ strokeWidth = random->nextRangeF(1.0f, 10.0f); |
+ if (random->nextBool()) { |
+ join = SkPaint::kMiter_Join; |
+ } else { |
+ join = SkPaint::kBevel_Join; |
+ } |
+ miterLimit = random->nextRangeF(0.5f, 2.0f); |
+ } |
+ |
+ return new AAFlatteningConvexPathBatch(color, viewMatrix, path, strokeWidth, |
+ style, join, miterLimit); |
} |
#endif |