Loading libs/hwui/RecordingCanvas.cpp +20 −1 Original line number Diff line number Diff line Loading @@ -401,10 +401,11 @@ struct DrawImageLattice final : Op { struct DrawTextBlob final : Op { static const auto kType = Type::DrawTextBlob; DrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, const SkPaint& paint) : blob(sk_ref_sp(blob)), x(x), y(y), paint(paint) {} : blob(sk_ref_sp(blob)), x(x), y(y), paint(paint), drawTextBlobMode(gDrawTextBlobMode) {} sk_sp<const SkTextBlob> blob; SkScalar x, y; SkPaint paint; DrawTextBlobMode drawTextBlobMode; void draw(SkCanvas* c, const SkMatrix&) const { c->drawTextBlob(blob.get(), x, y, paint); } }; Loading Loading @@ -791,6 +792,24 @@ constexpr color_transform_fn colorTransformForOp() { } } template<> constexpr color_transform_fn colorTransformForOp<DrawTextBlob>() { return [](const void *opRaw, ColorTransform transform) { const DrawTextBlob *op = reinterpret_cast<const DrawTextBlob*>(opRaw); switch (op->drawTextBlobMode) { case DrawTextBlobMode::HctOutline: const_cast<SkPaint&>(op->paint).setColor(SK_ColorBLACK); break; case DrawTextBlobMode::HctInner: const_cast<SkPaint&>(op->paint).setColor(SK_ColorWHITE); break; default: transformPaint(transform, const_cast<SkPaint*>(&(op->paint))); break; } }; } #define X(T) colorTransformForOp<T>(), static const color_transform_fn color_transform_fns[] = { #include "DisplayListOps.in" Loading libs/hwui/hwui/Canvas.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -111,6 +111,7 @@ public: bool darken = channelSum < (128 * 3); // outline gDrawTextBlobMode = DrawTextBlobMode::HctOutline; Paint outlinePaint(paint); simplifyPaint(darken ? SK_ColorWHITE : SK_ColorBLACK, &outlinePaint); outlinePaint.setStyle(SkPaint::kStrokeAndFill_Style); Loading @@ -118,11 +119,14 @@ public: bounds.mRight, bounds.mBottom, totalAdvance); // inner gDrawTextBlobMode = DrawTextBlobMode::HctInner; Paint innerPaint(paint); simplifyPaint(darken ? SK_ColorBLACK : SK_ColorWHITE, &innerPaint); innerPaint.setStyle(SkPaint::kFill_Style); canvas->drawGlyphs(glyphFunc, glyphCount, innerPaint, x, y, bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom, totalAdvance); gDrawTextBlobMode = DrawTextBlobMode::Normal; } else { // standard draw path canvas->drawGlyphs(glyphFunc, glyphCount, paint, x, y, bounds.mLeft, bounds.mTop, Loading libs/hwui/hwui/Canvas.h +8 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,14 @@ class Bitmap; class Paint; struct Typeface; enum class DrawTextBlobMode { Normal, HctOutline, HctInner, }; inline DrawTextBlobMode gDrawTextBlobMode = DrawTextBlobMode::Normal; class ANDROID_API Canvas { public: virtual ~Canvas(){}; Loading Loading
libs/hwui/RecordingCanvas.cpp +20 −1 Original line number Diff line number Diff line Loading @@ -401,10 +401,11 @@ struct DrawImageLattice final : Op { struct DrawTextBlob final : Op { static const auto kType = Type::DrawTextBlob; DrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, const SkPaint& paint) : blob(sk_ref_sp(blob)), x(x), y(y), paint(paint) {} : blob(sk_ref_sp(blob)), x(x), y(y), paint(paint), drawTextBlobMode(gDrawTextBlobMode) {} sk_sp<const SkTextBlob> blob; SkScalar x, y; SkPaint paint; DrawTextBlobMode drawTextBlobMode; void draw(SkCanvas* c, const SkMatrix&) const { c->drawTextBlob(blob.get(), x, y, paint); } }; Loading Loading @@ -791,6 +792,24 @@ constexpr color_transform_fn colorTransformForOp() { } } template<> constexpr color_transform_fn colorTransformForOp<DrawTextBlob>() { return [](const void *opRaw, ColorTransform transform) { const DrawTextBlob *op = reinterpret_cast<const DrawTextBlob*>(opRaw); switch (op->drawTextBlobMode) { case DrawTextBlobMode::HctOutline: const_cast<SkPaint&>(op->paint).setColor(SK_ColorBLACK); break; case DrawTextBlobMode::HctInner: const_cast<SkPaint&>(op->paint).setColor(SK_ColorWHITE); break; default: transformPaint(transform, const_cast<SkPaint*>(&(op->paint))); break; } }; } #define X(T) colorTransformForOp<T>(), static const color_transform_fn color_transform_fns[] = { #include "DisplayListOps.in" Loading
libs/hwui/hwui/Canvas.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -111,6 +111,7 @@ public: bool darken = channelSum < (128 * 3); // outline gDrawTextBlobMode = DrawTextBlobMode::HctOutline; Paint outlinePaint(paint); simplifyPaint(darken ? SK_ColorWHITE : SK_ColorBLACK, &outlinePaint); outlinePaint.setStyle(SkPaint::kStrokeAndFill_Style); Loading @@ -118,11 +119,14 @@ public: bounds.mRight, bounds.mBottom, totalAdvance); // inner gDrawTextBlobMode = DrawTextBlobMode::HctInner; Paint innerPaint(paint); simplifyPaint(darken ? SK_ColorBLACK : SK_ColorWHITE, &innerPaint); innerPaint.setStyle(SkPaint::kFill_Style); canvas->drawGlyphs(glyphFunc, glyphCount, innerPaint, x, y, bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom, totalAdvance); gDrawTextBlobMode = DrawTextBlobMode::Normal; } else { // standard draw path canvas->drawGlyphs(glyphFunc, glyphCount, paint, x, y, bounds.mLeft, bounds.mTop, Loading
libs/hwui/hwui/Canvas.h +8 −0 Original line number Diff line number Diff line Loading @@ -87,6 +87,14 @@ class Bitmap; class Paint; struct Typeface; enum class DrawTextBlobMode { Normal, HctOutline, HctInner, }; inline DrawTextBlobMode gDrawTextBlobMode = DrawTextBlobMode::Normal; class ANDROID_API Canvas { public: virtual ~Canvas(){}; Loading