diff options
author | fmalita <fmalita@chromium.org> | 2014-08-22 09:01:19 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-08-22 09:01:20 -0700 |
commit | 37ecbaffd1f9f6841aa562aa31a824d109d52988 (patch) | |
tree | c4ecb2c9dbdfeb634b886f3d3b629df77d7d59d2 | |
parent | 8367b8cb7a6b2f163ee41365323cb219b7049b15 (diff) |
[SkTextBlob] Merge run font data at draw time.
R=bungeman@google.com, reed@google.com
Author: fmalita@chromium.org
Review URL: https://codereview.chromium.org/496773002
-rw-r--r-- | expectations/gm/ignored-tests.txt | 3 | ||||
-rw-r--r-- | gm/textblob.cpp | 39 | ||||
-rw-r--r-- | include/core/SkTextBlob.h | 2 | ||||
-rw-r--r-- | src/core/SkCanvas.cpp | 10 | ||||
-rw-r--r-- | src/core/SkTextBlob.cpp | 31 |
5 files changed, 62 insertions, 23 deletions
diff --git a/expectations/gm/ignored-tests.txt b/expectations/gm/ignored-tests.txt index ad48ccd15e..df6af6e16d 100644 --- a/expectations/gm/ignored-tests.txt +++ b/expectations/gm/ignored-tests.txt @@ -41,3 +41,6 @@ gradtext gradients_view_perspective drawbitmaprect drawbitmapmatrix + +# To be rebaselined (fmalita) +textblob diff --git a/gm/textblob.cpp b/gm/textblob.cpp index e7a0a1d2ef..6837363898 100644 --- a/gm/textblob.cpp +++ b/gm/textblob.cpp @@ -31,21 +31,33 @@ const struct BlobCfg { { { 1024, kPoint_Pos, 1 }, { 0, kPoint_Pos, 0 }, { 0, kPoint_Pos, 0 } }, }, { - { { 4, kDefault_Pos, 1}, { 4, kDefault_Pos, 1}, { 4, kDefault_Pos, 1} }, - { { 4, kScalar_Pos, 1}, { 4, kScalar_Pos, 1}, { 4, kScalar_Pos, 1} }, - { { 4, kPoint_Pos, 1}, { 4, kPoint_Pos, 1}, { 4, kPoint_Pos, 1} }, + { { 4, kDefault_Pos, 1 }, { 4, kDefault_Pos, 1 }, { 4, kDefault_Pos, 1 } }, + { { 4, kScalar_Pos, 1 }, { 4, kScalar_Pos, 1 }, { 4, kScalar_Pos, 1 } }, + { { 4, kPoint_Pos, 1 }, { 4, kPoint_Pos, 1 }, { 4, kPoint_Pos, 1 } }, }, { - { { 4, kDefault_Pos, 1}, { 4, kDefault_Pos, 1}, { 4, kScalar_Pos, 1} }, - { { 4, kScalar_Pos, 1}, { 4, kScalar_Pos, 1}, { 4, kPoint_Pos, 1} }, - { { 4, kPoint_Pos, 1}, { 4, kPoint_Pos, 1}, { 4, kDefault_Pos, 1} }, + { { 4, kDefault_Pos, 1 }, { 4, kDefault_Pos, 1 }, { 4, kScalar_Pos, 1 } }, + { { 4, kScalar_Pos, 1 }, { 4, kScalar_Pos, 1 }, { 4, kPoint_Pos, 1 } }, + { { 4, kPoint_Pos, 1 }, { 4, kPoint_Pos, 1 }, { 4, kDefault_Pos, 1 } }, }, { - { { 4, kDefault_Pos, 1}, { 4, kScalar_Pos, 1}, { 4, kPoint_Pos, 1} }, - { { 4, kScalar_Pos, 1}, { 4, kPoint_Pos, 1}, { 4, kDefault_Pos, 1} }, - { { 4, kPoint_Pos, 1}, { 4, kDefault_Pos, 1}, { 4, kScalar_Pos, 1} }, + { { 4, kDefault_Pos, 1 }, { 4, kScalar_Pos, 1 }, { 4, kPoint_Pos, 1 } }, + { { 4, kScalar_Pos, 1 }, { 4, kPoint_Pos, 1 }, { 4, kDefault_Pos, 1 } }, + { { 4, kPoint_Pos, 1 }, { 4, kDefault_Pos, 1 }, { 4, kScalar_Pos, 1 } }, + }, + + { + { { 4, kDefault_Pos, .75f }, { 4, kDefault_Pos, 1 }, { 4, kScalar_Pos, 1.25f } }, + { { 4, kScalar_Pos, .75f }, { 4, kScalar_Pos, 1 }, { 4, kPoint_Pos, 1.25f } }, + { { 4, kPoint_Pos, .75f }, { 4, kPoint_Pos, 1 }, { 4, kDefault_Pos, 1.25f } }, + }, + + { + { { 4, kDefault_Pos, 1 }, { 4, kScalar_Pos, .75f }, { 4, kPoint_Pos, 1.25f } }, + { { 4, kScalar_Pos, 1 }, { 4, kPoint_Pos, .75f }, { 4, kDefault_Pos, 1.25f } }, + { { 4, kPoint_Pos, 1 }, { 4, kDefault_Pos, .75f }, { 4, kScalar_Pos, 1.25f } }, }, }; @@ -74,14 +86,9 @@ protected: virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { for (unsigned b = 0; b < SK_ARRAY_COUNT(blobConfigs); ++b) { - SkAutoTUnref<const SkTextBlob> blob(makeBlob(b)); + SkAutoTUnref<const SkTextBlob> blob(this->makeBlob(b)); SkPaint p; - p.setTextEncoding(SkPaint::kGlyphID_TextEncoding); - p.setTextSize(kFontSize); - p.setAntiAlias(true); - p.setSubpixelText(true); - SkPoint offset = SkPoint::Make(SkIntToScalar(10 + 300 * (b % 2)), SkIntToScalar(20 + 150 * (b / 2))); @@ -102,6 +109,8 @@ private: SkPaint font; font.setTextEncoding(SkPaint::kGlyphID_TextEncoding); + font.setAntiAlias(true); + font.setSubpixelText(true); for (unsigned l = 0; l < SK_ARRAY_COUNT(blobConfigs[blobIndex]); ++l) { unsigned currentGlyph = 0; diff --git a/include/core/SkTextBlob.h b/include/core/SkTextBlob.h index cf07b70fec..d1b2e0fe1b 100644 --- a/include/core/SkTextBlob.h +++ b/include/core/SkTextBlob.h @@ -47,7 +47,7 @@ private: const uint16_t* glyphs() const; const SkScalar* pos() const; const SkPoint& offset() const; - const SkPaint& font() const; + void applyFontToPaint(SkPaint*) const; GlyphPositioning positioning() const; private: diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 5a694db3b8..af25b46f3f 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -2226,20 +2226,24 @@ void SkCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, this->translate(x, y); } + SkPaint runPaint = paint; SkTextBlob::RunIterator it(blob); while (!it.done()) { size_t textLen = it.glyphCount() * sizeof(uint16_t); const SkPoint& offset = it.offset(); + // applyFontToPaint() always overwrites the exact same attributes, + // so it is safe to not re-seed the paint. + it.applyFontToPaint(&runPaint); switch (it.positioning()) { case SkTextBlob::kDefault_Positioning: - this->drawText(it.glyphs(), textLen, offset.x(), offset.y(), paint); + this->drawText(it.glyphs(), textLen, offset.x(), offset.y(), runPaint); break; case SkTextBlob::kHorizontal_Positioning: - this->drawPosTextH(it.glyphs(), textLen, it.pos(), offset.y(), paint); + this->drawPosTextH(it.glyphs(), textLen, it.pos(), offset.y(), runPaint); break; case SkTextBlob::kFull_Positioning: - this->drawPosText(it.glyphs(), textLen, (const SkPoint*)it.pos(), paint); + this->drawPosText(it.glyphs(), textLen, (const SkPoint*)it.pos(), runPaint); break; default: SkFAIL("unhandled positioning mode"); diff --git a/src/core/SkTextBlob.cpp b/src/core/SkTextBlob.cpp index 551d98836a..ded801aaa9 100644 --- a/src/core/SkTextBlob.cpp +++ b/src/core/SkTextBlob.cpp @@ -61,14 +61,37 @@ const SkPoint& SkTextBlob::RunIterator::offset() const { return (*fBlob->fRuns)[fIndex].offset; } -const SkPaint& SkTextBlob::RunIterator::font() const { +SkTextBlob::GlyphPositioning SkTextBlob::RunIterator::positioning() const { SkASSERT(!this->done()); - return (*fBlob->fRuns)[fIndex].font; + return (*fBlob->fRuns)[fIndex].positioning; } -SkTextBlob::GlyphPositioning SkTextBlob::RunIterator::positioning() const { +void SkTextBlob::RunIterator::applyFontToPaint(SkPaint* paint) const { SkASSERT(!this->done()); - return (*fBlob->fRuns)[fIndex].positioning; + + const SkPaint& font = (*fBlob->fRuns)[fIndex].font; + + paint->setTypeface(font.getTypeface()); + paint->setTextEncoding(font.getTextEncoding()); + paint->setTextSize(font.getTextSize()); + paint->setTextScaleX(font.getTextScaleX()); + paint->setTextSkewX(font.getTextSkewX()); + paint->setHinting(font.getHinting()); + + uint32_t flagsMask = SkPaint::kAntiAlias_Flag + | SkPaint::kUnderlineText_Flag + | SkPaint::kStrikeThruText_Flag + | SkPaint::kFakeBoldText_Flag + | SkPaint::kLinearText_Flag + | SkPaint::kSubpixelText_Flag + | SkPaint::kDevKernText_Flag + | SkPaint::kLCDRenderText_Flag + | SkPaint::kEmbeddedBitmapText_Flag + | SkPaint::kAutoHinting_Flag + | SkPaint::kVerticalText_Flag + | SkPaint::kGenA8FromLCD_Flag + | SkPaint::kDistanceFieldTextTEMP_Flag; + paint->setFlags((paint->getFlags() & ~flagsMask) | (font.getFlags() & flagsMask)); } SkTextBlobBuilder::SkTextBlobBuilder(unsigned runs) |