Index: src/gpu/GrAADistanceFieldPathRenderer.cpp |
diff --git a/src/gpu/GrAADistanceFieldPathRenderer.cpp b/src/gpu/GrAADistanceFieldPathRenderer.cpp |
index e2cee650dc1fbf6b6ec020161b32a7ead3dd34a8..bcdbd8ed22799124a340ac2857e17dcc1e1af000 100755 |
--- a/src/gpu/GrAADistanceFieldPathRenderer.cpp |
+++ b/src/gpu/GrAADistanceFieldPathRenderer.cpp |
@@ -21,7 +21,6 @@ |
#define ATLAS_TEXTURE_WIDTH 1024 |
#define ATLAS_TEXTURE_HEIGHT 1024 |
- |
#define PLOT_WIDTH 256 |
#define PLOT_HEIGHT 256 |
@@ -37,6 +36,12 @@ static int g_NumFreedPaths = 0; |
#endif |
//////////////////////////////////////////////////////////////////////////////// |
+GrAADistanceFieldPathRenderer::GrAADistanceFieldPathRenderer(GrContext* context) |
+ : fContext(context) |
+ , fAtlas(NULL) |
+ , fEffectFlags(kInvalid_DistanceFieldEffectFlag) { |
+} |
+ |
GrAADistanceFieldPathRenderer::~GrAADistanceFieldPathRenderer() { |
PathDataList::Iter iter; |
iter.init(fPathList, PathDataList::Iter::kHead_IterStart); |
@@ -280,7 +285,6 @@ bool GrAADistanceFieldPathRenderer::freeUnusedPlot() { |
bool GrAADistanceFieldPathRenderer::internalDrawPath(const SkPath& path, |
const PathData* pathData, |
GrDrawTarget* target) { |
- |
GrTexture* texture = fAtlas->getTexture(); |
GrDrawState* drawState = target->drawState(); |
GrDrawState::AutoRestoreEffects are(drawState); |
@@ -293,8 +297,7 @@ bool GrAADistanceFieldPathRenderer::internalDrawPath(const SkPath& path, |
drawState->setVertexAttribs<gSDFPathVertexAttribs>(SK_ARRAY_COUNT(gSDFPathVertexAttribs), |
kSDFPathVASize); |
void* vertices = NULL; |
- void* indices = NULL; |
- bool success = target->reserveVertexAndIndexSpace(4, 6, &vertices, &indices); |
+ bool success = target->reserveVertexAndIndexSpace(4, 0, &vertices, NULL); |
GrAlwaysAssert(success); |
SkScalar dx = pathData->fBounds.fLeft; |
@@ -328,29 +331,24 @@ bool GrAADistanceFieldPathRenderer::internalDrawPath(const SkPath& path, |
SkFixedToFloat(texture->texturePriv().normalizeFixedY(ty + th)), |
vertSize); |
- uint16_t* indexPtr = reinterpret_cast<uint16_t*>(indices); |
- *indexPtr++ = 0; |
- *indexPtr++ = 1; |
- *indexPtr++ = 2; |
- *indexPtr++ = 0; |
- *indexPtr++ = 2; |
- *indexPtr++ = 3; |
- |
// set up any flags |
uint32_t flags = 0; |
const SkMatrix& vm = drawState->getViewMatrix(); |
flags |= vm.isSimilarity() ? kSimilarity_DistanceFieldEffectFlag : 0; |
GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kBilerp_FilterMode); |
- drawState->setGeometryProcessor(GrDistanceFieldNoGammaTextureEffect::Create(texture, |
- params, |
- flags))->unref(); |
- |
+ if (flags != fEffectFlags) { |
+ fCachedGeometryProcessor.reset(GrDistanceFieldNoGammaTextureEffect::Create(texture, |
+ params, |
+ flags)); |
+ fEffectFlags = flags; |
+ } |
+ drawState->setGeometryProcessor(fCachedGeometryProcessor.get()); |
vm.mapRect(&r); |
+ target->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); |
target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &r); |
target->resetVertexSource(); |
- target->resetIndexSource(); |
return true; |
} |