Index: src/gpu/GrAALinearizingConvexPathRenderer.cpp |
diff --git a/src/gpu/GrAALinearizingConvexPathRenderer.cpp b/src/gpu/GrAALinearizingConvexPathRenderer.cpp |
index 786378ba8410429ad929f6db94093855b4aa391d..5ded4d4b43de1888bcc16b8653f9919f5099370f 100644 |
--- a/src/gpu/GrAALinearizingConvexPathRenderer.cpp |
+++ b/src/gpu/GrAALinearizingConvexPathRenderer.cpp |
@@ -23,16 +23,11 @@ |
#include "SkGeometry.h" |
#include "SkString.h" |
#include "SkTraceEvent.h" |
-#include "SkPathPriv.h" |
#include "gl/GrGLProcessor.h" |
#include "gl/GrGLGeometryProcessor.h" |
#include "gl/builders/GrGLProgramBuilder.h" |
-static const int DEFAULT_BUFFER_SIZE = 100; |
- |
-// The thicker the stroke, the harder it is to produce high-quality results using tessellation. For |
-// the time being, we simply drop back to software rendering above this stroke width. |
-static const SkScalar kMaxStrokeWidth = 20.0; |
+#define DEFAULT_BUFFER_SIZE 100 |
GrAALinearizingConvexPathRenderer::GrAALinearizingConvexPathRenderer() { |
} |
@@ -45,21 +40,7 @@ |
const SkPath& path, |
const GrStrokeInfo& stroke, |
bool antiAlias) const { |
- if (!antiAlias) { |
- return false; |
- } |
- if (path.isInverseFillType()) { |
- return false; |
- } |
- if (!path.isConvex()) { |
- return false; |
- } |
- if (stroke.getStyle() == SkStrokeRec::kStroke_Style) { |
- return viewMatrix.isSimilarity() && stroke.getWidth() >= 1.0f && |
- stroke.getWidth() <= kMaxStrokeWidth && !stroke.isDashed() && |
- SkPathPriv::LastVerbIsClose(path) && stroke.getJoin() != SkPaint::Join::kRound_Join; |
- } |
- return stroke.getStyle() == SkStrokeRec::kFill_Style; |
+ return (antiAlias && stroke.isFillStyle() && !path.isInverseFillType() && path.isConvex()); |
} |
// extract the result vertices and indices from the GrAAConvexTessellator |
@@ -79,15 +60,16 @@ |
// Make 'verts' point to the colors |
verts += sizeof(SkPoint); |
for (int i = 0; i < tess.numPts(); ++i) { |
+ SkASSERT(tess.depth(i) >= -0.5f && tess.depth(i) <= 0.5f); |
if (tweakAlphaForCoverage) { |
- SkASSERT(SkScalarRoundToInt(255.0f * tess.coverage(i)) <= 255); |
- unsigned scale = SkScalarRoundToInt(255.0f * tess.coverage(i)); |
+ SkASSERT(SkScalarRoundToInt(255.0f * (tess.depth(i) + 0.5f)) <= 255); |
+ unsigned scale = SkScalarRoundToInt(255.0f * (tess.depth(i) + 0.5f)); |
GrColor scaledColor = (0xff == scale) ? color : SkAlphaMulQ(color, scale); |
*reinterpret_cast<GrColor*>(verts + i * vertexStride) = scaledColor; |
} else { |
*reinterpret_cast<GrColor*>(verts + i * vertexStride) = color; |
*reinterpret_cast<float*>(verts + i * vertexStride + sizeof(GrColor)) = |
- tess.coverage(i); |
+ tess.depth(i) + 0.5f; |
} |
} |
@@ -115,9 +97,6 @@ |
GrColor fColor; |
SkMatrix fViewMatrix; |
SkPath fPath; |
- SkScalar fStrokeWidth; |
- SkPaint::Join fJoin; |
- SkScalar fMiterLimit; |
}; |
static GrBatch* Create(const Geometry& geometry) { |
@@ -179,7 +158,7 @@ |
firstIndex, vertexCount, indexCount); |
batchTarget->draw(info); |
} |
- |
+ |
void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline) override { |
bool canTweakAlphaForCoverage = this->canTweakAlphaForCoverage(); |
@@ -202,6 +181,8 @@ |
SkASSERT(canTweakAlphaForCoverage ? |
vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr) : |
vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCoverageAttr)); |
+ |
+ GrAAConvexTessellator tess; |
int instanceCount = fGeoData.count(); |
@@ -212,8 +193,9 @@ |
uint8_t* vertices = (uint8_t*) malloc(maxVertices * vertexStride); |
uint16_t* indices = (uint16_t*) malloc(maxIndices * sizeof(uint16_t)); |
for (int i = 0; i < instanceCount; i++) { |
+ tess.rewind(); |
+ |
Geometry& args = fGeoData[i]; |
- GrAAConvexTessellator tess(args.fStrokeWidth, args.fJoin, args.fMiterLimit); |
if (!tess.tessellate(args.fViewMatrix, args.fPath)) { |
continue; |
@@ -305,7 +287,7 @@ |
GrColor color, |
const SkMatrix& vm, |
const SkPath& path, |
- const GrStrokeInfo& stroke, |
+ const GrStrokeInfo&, |
bool antiAlias) { |
if (path.isEmpty()) { |
return true; |
@@ -314,9 +296,6 @@ |
geometry.fColor = color; |
geometry.fViewMatrix = vm; |
geometry.fPath = path; |
- geometry.fStrokeWidth = stroke.isFillStyle() ? -1.0f : stroke.getWidth(); |
- geometry.fJoin = stroke.isFillStyle() ? SkPaint::Join::kMiter_Join : stroke.getJoin(); |
- geometry.fMiterLimit = stroke.getMiter(); |
SkAutoTUnref<GrBatch> batch(AAFlatteningConvexPathBatch::Create(geometry)); |
target->drawBatch(pipelineBuilder, batch); |