diff options
author | Robert Phillips <robertphillips@google.com> | 2018-06-28 12:00:35 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-06-28 12:00:47 +0000 |
commit | 385804514edf602f978975c825b78692a044c6b9 (patch) | |
tree | 891790d5b77fa447c75ec9a25487ecd8ae22c332 /src/core/SkDevice.cpp | |
parent | e97bb26893a1c24deeb38b818a1f4c1638a9983d (diff) |
Revert "Remove drawTextBlob from device use drawGlyphRunList"
This reverts commit e2e52e46ca63540d429656baeee48fd3a402be26.
Reason for revert: See if this is blocking the Chrome roll
Original change's description:
> Remove drawTextBlob from device use drawGlyphRunList
>
> Convert all backends to use GlyphRunList instead of
> text blobs. If the device did not originally implement
> drawTextBlob it will be simulated by drawPosText on the
> device.
>
> Other changes:
> Change to using an origin from absolulte positioning. The GPU
> code uses origin change to update blobs under translation.
>
> Change cluster to use const uint32_t instead of just
> uint32_t.
>
> Add SkPaint to runs.
>
> The draw filter is hosted up to the canavas level and applied there.
>
> Change-Id: Ib105b6bd26b67db55f1c954e37c79fbdcaa9d4a2
> Reviewed-on: https://skia-review.googlesource.com/137224
> Reviewed-by: Herb Derby <herb@google.com>
> Reviewed-by: Khusal Sagar <khushalsagar@chromium.org>
> Reviewed-by: Hal Canary <halcanary@google.com>
> Reviewed-by: Jim Van Verth <jvanverth@google.com>
> Commit-Queue: Herb Derby <herb@google.com>
TBR=jvanverth@google.com,halcanary@google.com,bungeman@google.com,herb@google.com,reed@google.com,khushalsagar@chromium.org,khushalsagar@google.com
Change-Id: I4d93a534990c89deee7d3aaa00ec40d47e0d2ece
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://skia-review.googlesource.com/138120
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'src/core/SkDevice.cpp')
-rw-r--r-- | src/core/SkDevice.cpp | 56 |
1 files changed, 52 insertions, 4 deletions
diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp index 9fd61c9d28..46404b2887 100644 --- a/src/core/SkDevice.cpp +++ b/src/core/SkDevice.cpp @@ -141,6 +141,53 @@ void SkBaseDevice::drawPatch(const SkPoint cubics[12], const SkColor colors[4], } } +void SkBaseDevice::drawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, + const SkPaint &paint, SkDrawFilter* drawFilter) { + + SkPaint runPaint = paint; + + SkTextBlobRunIterator it(blob); + for (;!it.done(); it.next()) { + 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 for this reason. + it.applyFontToPaint(&runPaint); + + if (drawFilter && !drawFilter->filter(&runPaint, SkDrawFilter::kText_Type)) { + // A false return from filter() means we should abort the current draw. + runPaint = paint; + continue; + } + + switch (it.positioning()) { + case SkTextBlob::kDefault_Positioning: { + auto origin = SkPoint::Make(x + offset.x(), y + offset.y()); + SkGlyphRunBuilder builder; + builder.prepareDrawText(runPaint, (const char*) it.glyphs(), textLen, origin); + auto glyphRun = builder.useGlyphRun(); + glyphRun->temporaryShuntToDrawPosText(runPaint, this); + } + break; + case SkTextBlob::kHorizontal_Positioning: + this->drawPosText(it.glyphs(), textLen, it.pos(), 1, + SkPoint::Make(x, y + offset.y()), runPaint); + break; + case SkTextBlob::kFull_Positioning: + this->drawPosText(it.glyphs(), textLen, it.pos(), 2, + SkPoint::Make(x, y), runPaint); + break; + default: + SK_ABORT("unhandled positioning mode"); + } + + if (drawFilter) { + // A draw filter may change the paint arbitrarily, so we must re-seed in this case. + runPaint = paint; + } + } +} + void SkBaseDevice::drawImage(const SkImage* image, SkScalar x, SkScalar y, const SkPaint& paint) { SkBitmap bm; @@ -205,10 +252,11 @@ void SkBaseDevice::drawImageLattice(const SkImage* image, } } -void SkBaseDevice::drawGlyphRunList(SkGlyphRunList* glyphRunList) { - for (auto& glyphRun : *glyphRunList) { - glyphRun.temporaryShuntToDrawPosText(this, glyphRunList->origin()); - } +void SkBaseDevice::drawGlyphRun(const SkPaint& paint, SkGlyphRun* glyphRun) { + SkPaint glyphPaint(paint); + glyphPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); + + glyphRun->temporaryShuntToDrawPosText(glyphPaint, this); } void SkBaseDevice::drawBitmapLattice(const SkBitmap& bitmap, |