Fix bug on High Contrast Text : where DarkTheme is enabled &&

ForceDarkAllowed is true.

In this condition, text seems be bold so far.
From now, in this case, text would have black outline, white inline
color.

this is related to
https://partnerissuetracker.corp.google.com/u/1/issues/175363190.

Test: Repro steps in bug; make
Bug: 175363190

Change-Id: Icf0048ef8d55c2e29676944c24c2050f531616d5
This commit is contained in:
Minkyoung Kim
2021-02-05 18:55:04 +09:00
committed by John Reck
parent 7fbade088b
commit 0c15baeb4d
3 changed files with 31 additions and 1 deletions

View File

@@ -384,10 +384,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); }
};
@@ -832,6 +833,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"

View File

@@ -110,16 +110,19 @@ 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);
canvas->drawGlyphs(glyphFunc, glyphCount, outlinePaint, x, y, 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, totalAdvance);
gDrawTextBlobMode = DrawTextBlobMode::Normal;
} else {
// standard draw path
canvas->drawGlyphs(glyphFunc, glyphCount, paint, x, y, totalAdvance);

View File

@@ -61,6 +61,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(){};