OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrDistanceFieldTextContext.h" | 8 #include "GrDistanceFieldTextContext.h" |
9 #include "GrAtlas.h" | 9 #include "GrAtlas.h" |
10 #include "SkColorFilter.h" | 10 #include "SkColorFilter.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 #else | 62 #else |
63 fEnableDFRendering = enable; | 63 fEnableDFRendering = enable; |
64 #endif | 64 #endif |
65 fStrike = NULL; | 65 fStrike = NULL; |
66 fGammaTexture = NULL; | 66 fGammaTexture = NULL; |
67 | 67 |
68 fCurrVertex = 0; | 68 fCurrVertex = 0; |
69 fEffectTextureUniqueID = SK_InvalidUniqueID; | 69 fEffectTextureUniqueID = SK_InvalidUniqueID; |
70 fEffectColor = GrColor_ILLEGAL; | 70 fEffectColor = GrColor_ILLEGAL; |
71 fEffectFlags = 0; | 71 fEffectFlags = 0; |
72 | 72 |
73 fVertices = NULL; | 73 fVertices = NULL; |
| 74 |
| 75 fVertexBounds.setLargestInverted(); |
74 } | 76 } |
75 | 77 |
76 GrDistanceFieldTextContext::~GrDistanceFieldTextContext() { | 78 GrDistanceFieldTextContext::~GrDistanceFieldTextContext() { |
77 this->flushGlyphs(); | 79 this->flushGlyphs(); |
78 SkSafeSetNull(fGammaTexture); | 80 SkSafeSetNull(fGammaTexture); |
79 } | 81 } |
80 | 82 |
81 bool GrDistanceFieldTextContext::canDraw(const SkPaint& paint) { | 83 bool GrDistanceFieldTextContext::canDraw(const SkPaint& paint) { |
82 if (!fEnableDFRendering && !paint.isDistanceFieldTextTEMP()) { | 84 if (!fEnableDFRendering && !paint.isDistanceFieldTextTEMP()) { |
83 return false; | 85 return false; |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlen
dCoeff()); | 220 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlen
dCoeff()); |
219 //drawState->setColor(fPaint.getColor()); | 221 //drawState->setColor(fPaint.getColor()); |
220 // We're using per-vertex color. | 222 // We're using per-vertex color. |
221 SkASSERT(drawState->hasColorVertexAttribute()); | 223 SkASSERT(drawState->hasColorVertexAttribute()); |
222 drawState->setColor(0xFFFFFFFF); | 224 drawState->setColor(0xFFFFFFFF); |
223 } | 225 } |
224 int nGlyphs = fCurrVertex / 4; | 226 int nGlyphs = fCurrVertex / 4; |
225 fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); | 227 fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); |
226 fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType, | 228 fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType, |
227 nGlyphs, | 229 nGlyphs, |
228 4, 6); | 230 4, 6, &fVertexBounds); |
229 fCurrVertex = 0; | 231 fCurrVertex = 0; |
| 232 fVertexBounds.setLargestInverted(); |
230 } | 233 } |
| 234 |
231 fDrawTarget->resetVertexSource(); | 235 fDrawTarget->resetVertexSource(); |
232 fVertices = NULL; | 236 fVertices = NULL; |
233 } | 237 } |
234 | 238 |
235 void GrDistanceFieldTextContext::drawPackedGlyph(GrGlyph::PackedID packed, | 239 void GrDistanceFieldTextContext::drawPackedGlyph(GrGlyph::PackedID packed, |
236 SkFixed vx, SkFixed vy, | 240 SkFixed vx, SkFixed vy, |
237 GrFontScaler* scaler) { | 241 GrFontScaler* scaler) { |
238 GrGlyph* glyph = fStrike->getGlyph(packed, scaler); | 242 GrGlyph* glyph = fStrike->getGlyph(packed, scaler); |
239 if (NULL == glyph || glyph->fBounds.isEmpty()) { | 243 if (NULL == glyph || glyph->fBounds.isEmpty()) { |
240 return; | 244 return; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 SkScalar width = SkIntToScalar(glyph->fBounds.width() - 2*SK_DistanceFieldIn
set); | 326 SkScalar width = SkIntToScalar(glyph->fBounds.width() - 2*SK_DistanceFieldIn
set); |
323 SkScalar height = SkIntToScalar(glyph->fBounds.height() - 2*SK_DistanceField
Inset); | 327 SkScalar height = SkIntToScalar(glyph->fBounds.height() - 2*SK_DistanceField
Inset); |
324 | 328 |
325 SkScalar scale = fTextRatio; | 329 SkScalar scale = fTextRatio; |
326 dx *= scale; | 330 dx *= scale; |
327 dy *= scale; | 331 dy *= scale; |
328 sx += dx; | 332 sx += dx; |
329 sy += dy; | 333 sy += dy; |
330 width *= scale; | 334 width *= scale; |
331 height *= scale; | 335 height *= scale; |
332 | 336 |
333 SkFixed tx = SkIntToFixed(glyph->fAtlasLocation.fX + SK_DistanceFieldInset); | 337 SkFixed tx = SkIntToFixed(glyph->fAtlasLocation.fX + SK_DistanceFieldInset); |
334 SkFixed ty = SkIntToFixed(glyph->fAtlasLocation.fY + SK_DistanceFieldInset); | 338 SkFixed ty = SkIntToFixed(glyph->fAtlasLocation.fY + SK_DistanceFieldInset); |
335 SkFixed tw = SkIntToFixed(glyph->fBounds.width() - 2*SK_DistanceFieldInset); | 339 SkFixed tw = SkIntToFixed(glyph->fBounds.width() - 2*SK_DistanceFieldInset); |
336 SkFixed th = SkIntToFixed(glyph->fBounds.height() - 2*SK_DistanceFieldInset)
; | 340 SkFixed th = SkIntToFixed(glyph->fBounds.height() - 2*SK_DistanceFieldInset)
; |
337 | 341 |
| 342 SkRect r; |
| 343 r.fLeft = SkFixedToFloat(sx); |
| 344 r.fTop = SkFixedToFloat(sy); |
| 345 r.fRight = SkFixedToFloat(sx + width); |
| 346 r.fBottom = SkFixedToFloat(sy + height); |
| 347 |
| 348 fVertexBounds.growToInclude(r); |
| 349 |
338 size_t vertSize = fUseLCDText ? (2 * sizeof(SkPoint)) | 350 size_t vertSize = fUseLCDText ? (2 * sizeof(SkPoint)) |
339 : (2 * sizeof(SkPoint) + sizeof(GrColor)); | 351 : (2 * sizeof(SkPoint) + sizeof(GrColor)); |
340 | 352 |
341 SkASSERT(vertSize == fDrawTarget->getDrawState().getVertexSize()); | 353 SkASSERT(vertSize == fDrawTarget->getDrawState().getVertexSize()); |
342 | 354 |
343 SkPoint* positions = reinterpret_cast<SkPoint*>( | 355 SkPoint* positions = reinterpret_cast<SkPoint*>( |
344 reinterpret_cast<intptr_t>(fVertices) + vertSize * fCurrVertex); | 356 reinterpret_cast<intptr_t>(fVertices) + vertSize * fCurrVertex); |
345 positions->setRectFan(sx, sy, sx + width, sy + height, vertSize); | 357 positions->setRectFan(r.fLeft, r.fTop, r.fRight, r.fBottom, vertSize); |
346 | 358 |
347 // The texture coords are last in both the with and without color vertex lay
outs. | 359 // The texture coords are last in both the with and without color vertex lay
outs. |
348 SkPoint* textureCoords = reinterpret_cast<SkPoint*>( | 360 SkPoint* textureCoords = reinterpret_cast<SkPoint*>( |
349 reinterpret_cast<intptr_t>(positions) + vertSize - sizeof(SkPoint))
; | 361 reinterpret_cast<intptr_t>(positions) + vertSize - sizeof(SkPoint))
; |
350 textureCoords->setRectFan(SkFixedToFloat(texture->normalizeFixedX(tx)), | 362 textureCoords->setRectFan(SkFixedToFloat(texture->normalizeFixedX(tx)), |
351 SkFixedToFloat(texture->normalizeFixedY(ty)), | 363 SkFixedToFloat(texture->normalizeFixedY(ty)), |
352 SkFixedToFloat(texture->normalizeFixedX(tx + tw)), | 364 SkFixedToFloat(texture->normalizeFixedX(tx + tw)), |
353 SkFixedToFloat(texture->normalizeFixedY(ty + th)), | 365 SkFixedToFloat(texture->normalizeFixedY(ty + th)), |
354 vertSize); | 366 vertSize); |
355 if (!fUseLCDText) { | 367 if (!fUseLCDText) { |
356 // color comes after position. | 368 // color comes after position. |
357 GrColor* colors = reinterpret_cast<GrColor*>(positions + 1); | 369 GrColor* colors = reinterpret_cast<GrColor*>(positions + 1); |
358 for (int i = 0; i < 4; ++i) { | 370 for (int i = 0; i < 4; ++i) { |
359 *colors = fPaint.getColor(); | 371 *colors = fPaint.getColor(); |
360 colors = reinterpret_cast<GrColor*>(reinterpret_cast<intptr_t>(color
s) + vertSize); | 372 colors = reinterpret_cast<GrColor*>(reinterpret_cast<intptr_t>(color
s) + vertSize); |
361 } | 373 } |
362 } | 374 } |
363 | 375 |
364 fCurrVertex += 4; | 376 fCurrVertex += 4; |
365 } | 377 } |
366 | 378 |
367 inline void GrDistanceFieldTextContext::init(const GrPaint& paint, const SkPaint
& skPaint) { | 379 inline void GrDistanceFieldTextContext::init(const GrPaint& paint, const SkPaint
& skPaint) { |
368 GrTextContext::init(paint, skPaint); | 380 GrTextContext::init(paint, skPaint); |
369 | 381 |
370 fStrike = NULL; | 382 fStrike = NULL; |
371 | 383 |
372 fCurrVertex = 0; | 384 fCurrVertex = 0; |
373 | 385 |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 SkScalarToFixed(x) - (glyph.fAdvanceX >> a
lignShift), | 631 SkScalarToFixed(x) - (glyph.fAdvanceX >> a
lignShift), |
620 SkScalarToFixed(y) - (glyph.fAdvanceY >> a
lignShift), | 632 SkScalarToFixed(y) - (glyph.fAdvanceY >> a
lignShift), |
621 fontScaler); | 633 fontScaler); |
622 } | 634 } |
623 pos += scalarsPerPosition; | 635 pos += scalarsPerPosition; |
624 } | 636 } |
625 } | 637 } |
626 | 638 |
627 this->finish(); | 639 this->finish(); |
628 } | 640 } |
OLD | NEW |