| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 #ifndef GrAtlasTextBlob_DEFINED | 8 #ifndef GrAtlasTextBlob_DEFINED |
| 9 #define GrAtlasTextBlob_DEFINED | 9 #define GrAtlasTextBlob_DEFINED |
| 10 | 10 |
| 11 #include "GrBatchAtlas.h" | 11 #include "GrBatchAtlas.h" |
| 12 #include "GrBatchFontCache.h" | 12 #include "GrBatchFontCache.h" |
| 13 #include "GrColor.h" | 13 #include "GrColor.h" |
| 14 #include "GrMemoryPool.h" | 14 #include "GrMemoryPool.h" |
| 15 #include "SkDescriptor.h" | 15 #include "SkDescriptor.h" |
| 16 #include "SkMaskFilter.h" | 16 #include "SkMaskFilter.h" |
| 17 #include "SkSurfaceProps.h" | 17 #include "SkSurfaceProps.h" |
| 18 #include "SkTInternalLList.h" | 18 #include "SkTInternalLList.h" |
| 19 | 19 |
| 20 class GrBlobRegenHelper; |
| 20 struct GrDistanceFieldAdjustTable; | 21 struct GrDistanceFieldAdjustTable; |
| 21 class GrMemoryPool; | 22 class GrMemoryPool; |
| 22 class GrTextContext; | 23 class GrTextContext; |
| 23 class SkDrawFilter; | 24 class SkDrawFilter; |
| 24 class SkTextBlob; | 25 class SkTextBlob; |
| 25 class SkTextBlobRunIterator; | 26 class SkTextBlobRunIterator; |
| 26 | 27 |
| 27 // With this flag enabled, the GrAtlasTextContext will, as a sanity check, regen
erate every blob | 28 // With this flag enabled, the GrAtlasTextContext will, as a sanity check, regen
erate every blob |
| 28 // that comes in to verify the integrity of its cache | 29 // that comes in to verify the integrity of its cache |
| 29 #define CACHE_SANITY_CHECK 0 | 30 #define CACHE_SANITY_CHECK 0 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 void* operator new(size_t, void* p) { return p; } | 102 void* operator new(size_t, void* p) { return p; } |
| 102 void operator delete(void* target, void* placement) { | 103 void operator delete(void* target, void* placement) { |
| 103 ::operator delete(target, placement); | 104 ::operator delete(target, placement); |
| 104 } | 105 } |
| 105 | 106 |
| 106 bool hasDistanceField() const { return SkToBool(fTextType & kHasDistanceFiel
d_TextType); } | 107 bool hasDistanceField() const { return SkToBool(fTextType & kHasDistanceFiel
d_TextType); } |
| 107 bool hasBitmap() const { return SkToBool(fTextType & kHasBitmap_TextType); } | 108 bool hasBitmap() const { return SkToBool(fTextType & kHasBitmap_TextType); } |
| 108 void setHasDistanceField() { fTextType |= kHasDistanceField_TextType; } | 109 void setHasDistanceField() { fTextType |= kHasDistanceField_TextType; } |
| 109 void setHasBitmap() { fTextType |= kHasBitmap_TextType; } | 110 void setHasBitmap() { fTextType |= kHasBitmap_TextType; } |
| 110 | 111 |
| 112 int runCount() const { return fRunCount; } |
| 113 |
| 111 void push_back_run(int currRun) { | 114 void push_back_run(int currRun) { |
| 112 SkASSERT(currRun < fRunCount); | 115 SkASSERT(currRun < fRunCount); |
| 113 if (currRun > 0) { | 116 if (currRun > 0) { |
| 114 Run::SubRunInfo& newRun = fRuns[currRun].fSubRunInfo.back(); | 117 Run::SubRunInfo& newRun = fRuns[currRun].fSubRunInfo.back(); |
| 115 Run::SubRunInfo& lastRun = fRuns[currRun - 1].fSubRunInfo.back(); | 118 Run::SubRunInfo& lastRun = fRuns[currRun - 1].fSubRunInfo.back(); |
| 116 newRun.setAsSuccessor(lastRun); | 119 newRun.setAsSuccessor(lastRun); |
| 117 } | 120 } |
| 118 } | 121 } |
| 119 | 122 |
| 120 // sets the last subrun of runIndex to use distance field text | 123 // sets the last subrun of runIndex to use distance field text |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 // We use this color vs the SkPaint color because it has the colorfilter app
lied. | 251 // We use this color vs the SkPaint color because it has the colorfilter app
lied. |
| 249 void initReusableBlob(GrColor color, const SkMatrix& viewMatrix, SkScalar x,
SkScalar y) { | 252 void initReusableBlob(GrColor color, const SkMatrix& viewMatrix, SkScalar x,
SkScalar y) { |
| 250 fPaintColor = color; | 253 fPaintColor = color; |
| 251 this->setupViewMatrix(viewMatrix, x, y); | 254 this->setupViewMatrix(viewMatrix, x, y); |
| 252 } | 255 } |
| 253 | 256 |
| 254 void initThrowawayBlob(const SkMatrix& viewMatrix, SkScalar x, SkScalar y) { | 257 void initThrowawayBlob(const SkMatrix& viewMatrix, SkScalar x, SkScalar y) { |
| 255 this->setupViewMatrix(viewMatrix, x, y); | 258 this->setupViewMatrix(viewMatrix, x, y); |
| 256 } | 259 } |
| 257 | 260 |
| 261 void regenInBatch(GrDrawBatch::Target* target, GrBatchFontCache* fontCache, |
| 262 GrBlobRegenHelper *helper, int run, int subRun, SkGlyphCac
he** cache, |
| 263 SkTypeface** typeface, GrFontScaler** scaler, |
| 264 const SkDescriptor** desc, size_t vertexStride, |
| 265 GrColor color, SkScalar transX, SkScalar transY, |
| 266 void** vertices, size_t* byteCount, int* glyphCount); |
| 267 |
| 258 const Key& key() const { return fKey; } | 268 const Key& key() const { return fKey; } |
| 259 | 269 |
| 260 ~GrAtlasTextBlob() { | 270 ~GrAtlasTextBlob() { |
| 261 for (int i = 0; i < fRunCount; i++) { | 271 for (int i = 0; i < fRunCount; i++) { |
| 262 fRuns[i].~Run(); | 272 fRuns[i].~Run(); |
| 263 } | 273 } |
| 264 } | 274 } |
| 265 | 275 |
| 266 ////////////////////////////////////////////////////////////////////////////
//////////////////// | 276 ////////////////////////////////////////////////////////////////////////////
//////////////////// |
| 267 // Internal test methods | 277 // Internal test methods |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 446 | 456 |
| 447 // Distance field text cannot draw coloremoji, and so has to fall back.
However, | 457 // Distance field text cannot draw coloremoji, and so has to fall back.
However, |
| 448 // though the distance field text and the coloremoji may share the same
run, they | 458 // though the distance field text and the coloremoji may share the same
run, they |
| 449 // will have different descriptors. If fOverrideDescriptor is non-nullp
tr, then it | 459 // will have different descriptors. If fOverrideDescriptor is non-nullp
tr, then it |
| 450 // will be used in place of the run's descriptor to regen texture coords | 460 // will be used in place of the run's descriptor to regen texture coords |
| 451 SkAutoTDelete<SkAutoDescriptor> fOverrideDescriptor; // df properties | 461 SkAutoTDelete<SkAutoDescriptor> fOverrideDescriptor; // df properties |
| 452 bool fInitialized; | 462 bool fInitialized; |
| 453 bool fDrawAsPaths; | 463 bool fDrawAsPaths; |
| 454 }; | 464 }; |
| 455 | 465 |
| 466 template <bool regenPos, bool regenCol, bool regenTexCoords, bool regenGlyph
s> |
| 467 void regenInBatch(GrDrawBatch::Target* target, |
| 468 GrBatchFontCache* fontCache, |
| 469 GrBlobRegenHelper* helper, |
| 470 Run* run, Run::SubRunInfo* info, SkGlyphCache** cache, |
| 471 SkTypeface** typeface, GrFontScaler** scaler, |
| 472 const SkDescriptor** desc, |
| 473 int glyphCount, size_t vertexStride, |
| 474 GrColor color, SkScalar transX, |
| 475 SkScalar transY) const; |
| 476 |
| 456 inline GrDrawBatch* createBatch(const Run::SubRunInfo& info, | 477 inline GrDrawBatch* createBatch(const Run::SubRunInfo& info, |
| 457 int glyphCount, int run, int subRun, | 478 int glyphCount, int run, int subRun, |
| 458 GrColor color, SkScalar transX, SkScalar tra
nsY, | 479 GrColor color, SkScalar transX, SkScalar tra
nsY, |
| 459 const SkPaint& skPaint, const SkSurfaceProps
& props, | 480 const SkPaint& skPaint, const SkSurfaceProps
& props, |
| 460 const GrDistanceFieldAdjustTable* distanceAd
justTable, | 481 const GrDistanceFieldAdjustTable* distanceAd
justTable, |
| 461 GrBatchFontCache* cache); | 482 GrBatchFontCache* cache); |
| 462 | 483 |
| 463 struct BigGlyph { | 484 struct BigGlyph { |
| 464 BigGlyph(const SkPath& path, SkScalar vx, SkScalar vy, SkScalar scale, b
ool applyVM) | 485 BigGlyph(const SkPath& path, SkScalar vx, SkScalar vy, SkScalar scale, b
ool applyVM) |
| 465 : fPath(path) | 486 : fPath(path) |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 SkScalar fX; | 524 SkScalar fX; |
| 504 SkScalar fY; | 525 SkScalar fY; |
| 505 | 526 |
| 506 // We can reuse distance field text, but only if the new viewmatrix would no
t result in | 527 // We can reuse distance field text, but only if the new viewmatrix would no
t result in |
| 507 // a mip change. Because there can be multiple runs in a blob, we track the
overall | 528 // a mip change. Because there can be multiple runs in a blob, we track the
overall |
| 508 // maximum minimum scale, and minimum maximum scale, we can support before w
e need to regen | 529 // maximum minimum scale, and minimum maximum scale, we can support before w
e need to regen |
| 509 SkScalar fMaxMinScale; | 530 SkScalar fMaxMinScale; |
| 510 SkScalar fMinMaxScale; | 531 SkScalar fMinMaxScale; |
| 511 int fRunCount; | 532 int fRunCount; |
| 512 uint8_t fTextType; | 533 uint8_t fTextType; |
| 513 | |
| 514 friend class GrAtlasTextBatch; // We might be able to get rid of this friend
ing | |
| 515 }; | 534 }; |
| 516 | 535 |
| 517 #endif | 536 #endif |
| OLD | NEW |