diff options
author | Herb Derby <herb@google.com> | 2018-05-09 16:36:11 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-06-05 20:11:39 +0000 |
commit | 4225b3220ef4bf50f0d9403f812ea94d50c4ee59 (patch) | |
tree | a03d6ff5708e6c41fdc4b1edb8f5200d08d7dc63 /src/core/SkDevice.cpp | |
parent | f105dc71e4200db5a57a1e28b8bca2b3689debdb (diff) |
Have draw(Text|PosText|PosTextH) use a single entry on the device
Handle the positioning of drawText at the canvas layer. Simplify
the code by removing similar implementations.
Change-Id: I8b711783435072f560e29fca1dd934fa2e345ed2
Reviewed-on: https://skia-review.googlesource.com/127131
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Herb Derby <herb@google.com>
Diffstat (limited to 'src/core/SkDevice.cpp')
-rw-r--r-- | src/core/SkDevice.cpp | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp index 35cfc9ab71..1bad6dba6e 100644 --- a/src/core/SkDevice.cpp +++ b/src/core/SkDevice.cpp @@ -9,12 +9,14 @@ #include "SkColorFilter.h" #include "SkDraw.h" #include "SkDrawFilter.h" +#include "SkGlyphRun.h" #include "SkImageFilter.h" #include "SkImageFilterCache.h" #include "SkImagePriv.h" #include "SkImage_Base.h" #include "SkLatticeIter.h" #include "SkLocalMatrixShader.h" +#include "SkMakeUnique.h" #include "SkMatrixPriv.h" #include "SkPatchUtils.h" #include "SkPathMeasure.h" @@ -157,9 +159,16 @@ void SkBaseDevice::drawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, } switch (it.positioning()) { - case SkTextBlob::kDefault_Positioning: - this->drawText(it.glyphs(), textLen, x + offset.x(), y + offset.y(), runPaint); - break; + case SkTextBlob::kDefault_Positioning: { + auto origin = SkPoint::Make(x + offset.x(), y + offset.y()); + auto glyphRun = + SkGlyphRun::MakeFromDrawText(runPaint, + (const char*) it.glyphs(), textLen, origin); + this->drawPosText( + it.glyphs(), textLen, glyphRun.getPositions(), 2, + SkPoint::Make(0, 0), runPaint); + } + break; case SkTextBlob::kHorizontal_Positioning: this->drawPosText(it.glyphs(), textLen, it.pos(), 1, SkPoint::Make(x, y + offset.y()), runPaint); @@ -243,6 +252,17 @@ void SkBaseDevice::drawImageLattice(const SkImage* image, } } +void SkBaseDevice::drawGlyphRun(const SkPaint& paint, SkGlyphRun* info) { + SkPaint glyphPaint(paint); + glyphPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); + + auto glyphs = info->copyGlyphIDs(); + + this->drawPosText( + glyphs.get(), info->runSize() * 2, + info->getPositions(), 2, SkPoint::Make(0, 0), glyphPaint); +} + void SkBaseDevice::drawBitmapLattice(const SkBitmap& bitmap, const SkCanvas::Lattice& lattice, const SkRect& dst, const SkPaint& paint) { @@ -496,6 +516,8 @@ void SkBaseDevice::drawTextRSXform(const void* text, size_t len, SkPaint localPaint(paint); SkShader* shader = paint.getShader(); + SkScalar pos[2] = {0.0f, 0.0f}; + SkPoint origin = SkPoint::Make(0, 0); SkMatrix localM, currM; const void* stopText = (const char*)text + len; @@ -517,7 +539,7 @@ void SkBaseDevice::drawTextRSXform(const void* text, size_t len, } int subLen = proc((const char*)text); - this->drawText(text, subLen, 0, 0, localPaint); + this->drawPosText(text, subLen, pos, 2, origin, localPaint); text = (const char*)text + subLen; } } |