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 26 matching lines...) Expand all Loading... |
37 static const int kMediumDFFontLimit = 64; | 37 static const int kMediumDFFontLimit = 64; |
38 static const int kLargeDFFontSize = 128; | 38 static const int kLargeDFFontSize = 128; |
39 | 39 |
40 namespace { | 40 namespace { |
41 // position + texture coord | 41 // position + texture coord |
42 extern const GrVertexAttrib gTextVertexAttribs[] = { | 42 extern const GrVertexAttrib gTextVertexAttribs[] = { |
43 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin
g}, | 43 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin
g}, |
44 {kVec2f_GrVertexAttribType, sizeof(SkPoint) , kEffect_GrVertexAttribBinding} | 44 {kVec2f_GrVertexAttribType, sizeof(SkPoint) , kEffect_GrVertexAttribBinding} |
45 }; | 45 }; |
46 | 46 |
47 static const size_t kTextVASize = 2 * sizeof(SkPoint); | |
48 | |
49 // position + color + texture coord | 47 // position + color + texture coord |
50 extern const GrVertexAttrib gTextVertexWithColorAttribs[] = { | 48 extern const GrVertexAttrib gTextVertexWithColorAttribs[] = { |
51 {kVec2f_GrVertexAttribType, 0, kPosition_Gr
VertexAttribBinding}, | 49 {kVec2f_GrVertexAttribType, 0, kPosition_Gr
VertexAttribBinding}, |
52 {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVer
texAttribBinding}, | 50 {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVer
texAttribBinding}, |
53 {kVec2f_GrVertexAttribType, sizeof(SkPoint) + sizeof(GrColor), kEffect_GrVe
rtexAttribBinding} | 51 {kVec2f_GrVertexAttribType, sizeof(SkPoint) + sizeof(GrColor), kEffect_GrVe
rtexAttribBinding} |
54 }; | 52 }; |
55 | 53 |
56 static const size_t kTextVAColorSize = 2 * sizeof(SkPoint) + sizeof(GrColor); | |
57 | |
58 }; | 54 }; |
59 | 55 |
60 GrDistanceFieldTextContext::GrDistanceFieldTextContext(GrContext* context, | 56 GrDistanceFieldTextContext::GrDistanceFieldTextContext(GrContext* context, |
61 const SkDeviceProperties&
properties, | 57 const SkDeviceProperties&
properties, |
62 bool enable) | 58 bool enable) |
63 : GrTextContext(context, pro
perties) | 59 : GrTextContext(context, pro
perties) |
64 , fStrike(NULL) | 60 , fStrike(NULL) |
65 #if SK_FORCE_DISTANCEFIELD_FONTS | 61 #if SK_FORCE_DISTANCEFIELD_FONTS |
66 , fEnableDFRendering(true) | 62 , fEnableDFRendering(true) |
67 #else | 63 #else |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 r.fLeft = sx; | 348 r.fLeft = sx; |
353 r.fTop = sy; | 349 r.fTop = sy; |
354 r.fRight = sx + width; | 350 r.fRight = sx + width; |
355 r.fBottom = sy + height; | 351 r.fBottom = sy + height; |
356 | 352 |
357 fVertexBounds.growToInclude(r); | 353 fVertexBounds.growToInclude(r); |
358 | 354 |
359 size_t vertSize = fUseLCDText ? (2 * sizeof(SkPoint)) | 355 size_t vertSize = fUseLCDText ? (2 * sizeof(SkPoint)) |
360 : (2 * sizeof(SkPoint) + sizeof(GrColor)); | 356 : (2 * sizeof(SkPoint) + sizeof(GrColor)); |
361 | 357 |
362 SkASSERT(vertSize == fDrawTarget->getDrawState().getVertexStride()); | 358 SkASSERT(vertSize == fDrawTarget->getDrawState().getVertexSize()); |
363 | 359 |
364 SkPoint* positions = reinterpret_cast<SkPoint*>( | 360 SkPoint* positions = reinterpret_cast<SkPoint*>( |
365 reinterpret_cast<intptr_t>(fVertices) + vertSize * fCurrVertex); | 361 reinterpret_cast<intptr_t>(fVertices) + vertSize * fCurrVertex); |
366 positions->setRectFan(r.fLeft, r.fTop, r.fRight, r.fBottom, vertSize); | 362 positions->setRectFan(r.fLeft, r.fTop, r.fRight, r.fBottom, vertSize); |
367 | 363 |
368 // The texture coords are last in both the with and without color vertex lay
outs. | 364 // The texture coords are last in both the with and without color vertex lay
outs. |
369 SkPoint* textureCoords = reinterpret_cast<SkPoint*>( | 365 SkPoint* textureCoords = reinterpret_cast<SkPoint*>( |
370 reinterpret_cast<intptr_t>(positions) + vertSize - sizeof(SkPoint))
; | 366 reinterpret_cast<intptr_t>(positions) + vertSize - sizeof(SkPoint))
; |
371 textureCoords->setRectFan(SkFixedToFloat(texture->normalizeFixedX(tx)), | 367 textureCoords->setRectFan(SkFixedToFloat(texture->normalizeFixedX(tx)), |
372 SkFixedToFloat(texture->normalizeFixedY(ty)), | 368 SkFixedToFloat(texture->normalizeFixedY(ty)), |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 0, 0, width, height, | 456 0, 0, width, height, |
461 (*gammaTexture)->config(), data.get(), 0, | 457 (*gammaTexture)->config(), data.get(), 0, |
462 GrContext::kDontFlush_PixelOpsFlag); | 458 GrContext::kDontFlush_PixelOpsFlag); |
463 } | 459 } |
464 } | 460 } |
465 | 461 |
466 void GrDistanceFieldTextContext::allocateVertices(const char text[], size_t byte
Length) { | 462 void GrDistanceFieldTextContext::allocateVertices(const char text[], size_t byte
Length) { |
467 SkASSERT(NULL == fVertices); | 463 SkASSERT(NULL == fVertices); |
468 if (!fUseLCDText) { | 464 if (!fUseLCDText) { |
469 fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttribs>( | 465 fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttribs>( |
470 SK_ARRAY_COUNT(gTextVertexWi
thColorAttribs), | 466 SK_ARRAY_COUNT(gTextVertexWi
thColorAttribs)); |
471 kTextVAColorSize); | |
472 } else { | 467 } else { |
473 fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>( | 468 fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>( |
474 SK_ARRAY_COUNT(gTextVertexAt
tribs), | 469 SK_ARRAY_COUNT(gTextVertexAt
tribs)); |
475 kTextVASize); | |
476 } | 470 } |
477 fVertexCount = 4*fSkPaint.textToGlyphs(text, byteLength, NULL); | 471 fVertexCount = 4*fSkPaint.textToGlyphs(text, byteLength, NULL); |
478 bool success = fDrawTarget->reserveVertexAndIndexSpace(fVertexCount, | 472 bool success = fDrawTarget->reserveVertexAndIndexSpace(fVertexCount, |
479 0, | 473 0, |
480 &fVertices, | 474 &fVertices, |
481 NULL); | 475 NULL); |
482 GrAlwaysAssert(success); | 476 GrAlwaysAssert(success); |
483 } | 477 } |
484 | 478 |
485 void GrDistanceFieldTextContext::drawText(const GrPaint& paint, const SkPaint& s
kPaint, | 479 void GrDistanceFieldTextContext::drawText(const GrPaint& paint, const SkPaint& s
kPaint, |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 SkScalarToFixed(x) - (glyph.fAdvanceX >> a
lignShift), | 628 SkScalarToFixed(x) - (glyph.fAdvanceX >> a
lignShift), |
635 SkScalarToFixed(y) - (glyph.fAdvanceY >> a
lignShift), | 629 SkScalarToFixed(y) - (glyph.fAdvanceY >> a
lignShift), |
636 fontScaler); | 630 fontScaler); |
637 } | 631 } |
638 pos += scalarsPerPosition; | 632 pos += scalarsPerPosition; |
639 } | 633 } |
640 } | 634 } |
641 | 635 |
642 this->finish(); | 636 this->finish(); |
643 } | 637 } |
OLD | NEW |