Index: src/gpu/GrDistanceFieldTextContext.cpp |
diff --git a/src/gpu/GrDistanceFieldTextContext.cpp b/src/gpu/GrDistanceFieldTextContext.cpp |
index d3b01703e484e686d8dfc28588f05cd635dabc0f..65e899960e16c3779ffd57ad4f3fc1ed10444a8e 100755 |
--- a/src/gpu/GrDistanceFieldTextContext.cpp |
+++ b/src/gpu/GrDistanceFieldTextContext.cpp |
@@ -374,8 +374,8 @@ static inline GrColor skcolor_to_grcolor_nopremultiply(SkColor c) { |
} |
static size_t get_vertex_stride(bool useColorVerts) { |
- return useColorVerts ? (2 * sizeof(SkPoint) + sizeof(GrColor)) : |
- (2 * sizeof(SkPoint)); |
+ return useColorVerts ? (sizeof(SkPoint) + sizeof(GrColor) + sizeof(SkIPoint16)) : |
+ (sizeof(SkPoint) + sizeof(SkIPoint16)); |
} |
static void* alloc_vertices(GrDrawTarget* drawTarget, |
@@ -443,12 +443,12 @@ void GrDistanceFieldTextContext::setupCoverageEffect(const SkColor& filteredColo |
flags, |
opaque)); |
#else |
- fCachedGeometryProcessor.reset(GrDistanceFieldNoGammaTextureEffect::Create(color, |
- fViewMatrix, |
- fCurrTexture, |
- params, |
- flags, |
- opaque)); |
+ fCachedGeometryProcessor.reset(GrDistanceFieldTextureEffect::Create(color, |
+ fViewMatrix, |
+ fCurrTexture, |
+ params, |
+ flags, |
+ opaque)); |
#endif |
} |
fEffectTextureUniqueID = textureUniqueID; |
@@ -600,36 +600,59 @@ bool GrDistanceFieldTextContext::appendGlyph(GrGlyph::PackedID packed, |
useColorVerts); |
} |
- SkFixed tx = SkIntToFixed(glyph->fAtlasLocation.fX + SK_DistanceFieldInset); |
- SkFixed ty = SkIntToFixed(glyph->fAtlasLocation.fY + SK_DistanceFieldInset); |
- SkFixed tw = SkIntToFixed(glyph->fBounds.width() - 2*SK_DistanceFieldInset); |
- SkFixed th = SkIntToFixed(glyph->fBounds.height() - 2*SK_DistanceFieldInset); |
- |
fVertexBounds.joinNonEmptyArg(glyphRect); |
+ int u0 = glyph->fAtlasLocation.fX + SK_DistanceFieldInset; |
+ int v0 = glyph->fAtlasLocation.fY + SK_DistanceFieldInset; |
+ int u1 = u0 + glyph->fBounds.width() - 2*SK_DistanceFieldInset; |
+ int v1 = v0 + glyph->fBounds.height() - 2*SK_DistanceFieldInset; |
+ |
size_t vertSize = get_vertex_stride(useColorVerts); |
+ intptr_t vertex = reinterpret_cast<intptr_t>(fVertices) + vertSize * fCurrVertex; |
- SkPoint* positions = reinterpret_cast<SkPoint*>( |
- reinterpret_cast<intptr_t>(fVertices) + vertSize * fCurrVertex); |
- positions->setRectFan(glyphRect.fLeft, glyphRect.fTop, glyphRect.fRight, glyphRect.fBottom, |
- vertSize); |
- |
- // The texture coords are last in both the with and without color vertex layouts. |
- SkPoint* textureCoords = reinterpret_cast<SkPoint*>( |
- reinterpret_cast<intptr_t>(positions) + vertSize - sizeof(SkPoint)); |
- textureCoords->setRectFan(SkFixedToFloat(texture->texturePriv().normalizeFixedX(tx)), |
- SkFixedToFloat(texture->texturePriv().normalizeFixedY(ty)), |
- SkFixedToFloat(texture->texturePriv().normalizeFixedX(tx + tw)), |
- SkFixedToFloat(texture->texturePriv().normalizeFixedY(ty + th)), |
- vertSize); |
+ // V0 |
+ SkPoint* position = reinterpret_cast<SkPoint*>(vertex); |
+ position->set(glyphRect.fLeft, glyphRect.fTop); |
if (useColorVerts) { |
- // color comes after position. |
- GrColor* colors = reinterpret_cast<GrColor*>(positions + 1); |
- for (int i = 0; i < 4; ++i) { |
- *colors = fPaint.getColor(); |
- colors = reinterpret_cast<GrColor*>(reinterpret_cast<intptr_t>(colors) + vertSize); |
- } |
+ SkColor* color = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint)); |
+ *color = fPaint.getColor(); |
+ } |
+ SkIPoint16* textureCoords = reinterpret_cast<SkIPoint16*>(vertex + vertSize - |
+ sizeof(SkIPoint16)); |
+ textureCoords->set(u0, v0); |
+ vertex += vertSize; |
+ |
+ // V1 |
+ position = reinterpret_cast<SkPoint*>(vertex); |
+ position->set(glyphRect.fLeft, glyphRect.fBottom); |
+ if (useColorVerts) { |
+ SkColor* color = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint)); |
+ *color = fPaint.getColor(); |
+ } |
+ textureCoords = reinterpret_cast<SkIPoint16*>(vertex + vertSize - sizeof(SkIPoint16)); |
+ textureCoords->set(u0, v1); |
+ vertex += vertSize; |
+ |
+ // V2 |
+ position = reinterpret_cast<SkPoint*>(vertex); |
+ position->set(glyphRect.fRight, glyphRect.fBottom); |
+ if (useColorVerts) { |
+ SkColor* color = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint)); |
+ *color = fPaint.getColor(); |
+ } |
+ textureCoords = reinterpret_cast<SkIPoint16*>(vertex + vertSize - sizeof(SkIPoint16)); |
+ textureCoords->set(u1, v1); |
+ vertex += vertSize; |
+ |
+ // V3 |
+ position = reinterpret_cast<SkPoint*>(vertex); |
+ position->set(glyphRect.fRight, glyphRect.fTop); |
+ if (useColorVerts) { |
+ SkColor* color = reinterpret_cast<SkColor*>(vertex + sizeof(SkPoint)); |
+ *color = fPaint.getColor(); |
} |
+ textureCoords = reinterpret_cast<SkIPoint16*>(vertex + vertSize - sizeof(SkIPoint16)); |
+ textureCoords->set(u1, v0); |
fCurrVertex += 4; |