aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkDevice.cpp
diff options
context:
space:
mode:
authorGravatar Herb Derby <herb@google.com>2018-05-09 16:36:11 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-06-05 20:11:39 +0000
commit4225b3220ef4bf50f0d9403f812ea94d50c4ee59 (patch)
treea03d6ff5708e6c41fdc4b1edb8f5200d08d7dc63 /src/core/SkDevice.cpp
parentf105dc71e4200db5a57a1e28b8bca2b3689debdb (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.cpp30
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;
}
}