Merge "Revert "Support High Contrast Text for all canvas types""
diff --git a/core/java/android/view/DisplayListCanvas.java b/core/java/android/view/DisplayListCanvas.java
index 05fa45f..ac98fa9 100644
--- a/core/java/android/view/DisplayListCanvas.java
+++ b/core/java/android/view/DisplayListCanvas.java
@@ -147,11 +147,25 @@
private static native int nGetMaximumTextureWidth();
private static native int nGetMaximumTextureHeight();
+ /**
+ * Returns the native OpenGLRenderer object.
+ */
+ long getRenderer() {
+ return mNativeCanvasWrapper;
+ }
+
///////////////////////////////////////////////////////////////////////////
// Setup
///////////////////////////////////////////////////////////////////////////
@Override
+ public void setHighContrastText(boolean highContrastText) {
+ nSetHighContrastText(mNativeCanvasWrapper, highContrastText);
+ }
+
+ private static native void nSetHighContrastText(long renderer, boolean highContrastText);
+
+ @Override
public void insertReorderBarrier() {
nInsertReorderBarrier(mNativeCanvasWrapper, true);
}
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp
index 43825ad..1f01453 100644
--- a/core/jni/android_graphics_Canvas.cpp
+++ b/core/jni/android_graphics_Canvas.cpp
@@ -69,11 +69,6 @@
return static_cast<jint>(get_canvas(canvasHandle)->height());
}
-static void setHighContrastText(JNIEnv*, jobject, jlong canvasHandle, jboolean highContrastText) {
- Canvas* canvas = get_canvas(canvasHandle);
- canvas->setHighContrastText(highContrastText);
-}
-
static jint getSaveCount(JNIEnv*, jobject, jlong canvasHandle) {
return static_cast<jint>(get_canvas(canvasHandle)->getSaveCount());
}
@@ -435,16 +430,6 @@
vertA.ptr(), colorA.ptr(), paint);
}
-static void simplifyPaint(int color, SkPaint* paint) {
- paint->setColor(color);
- paint->setShader(nullptr);
- paint->setColorFilter(nullptr);
- paint->setLooper(nullptr);
- paint->setStrokeWidth(4 + 0.04 * paint->getTextSize());
- paint->setStrokeJoin(SkPaint::kRound_Join);
- paint->setLooper(nullptr);
-}
-
class DrawTextFunctor {
public:
DrawTextFunctor(const Layout& layout, Canvas* canvas, uint16_t* glyphs, float* pos,
@@ -469,32 +454,9 @@
}
size_t glyphCount = end - start;
-
- if (CC_UNLIKELY(canvas->isHighContrastText())) {
- // high contrast draw path
- int color = paint.getColor();
- int channelSum = SkColorGetR(color) + SkColorGetG(color) + SkColorGetB(color);
- bool darken = channelSum < (128 * 3);
-
- // outline
- SkPaint outlinePaint(paint);
- simplifyPaint(darken ? SK_ColorWHITE : SK_ColorBLACK, &outlinePaint);
- outlinePaint.setStyle(SkPaint::kStrokeAndFill_Style);
- canvas->drawText(glyphs + start, pos + (2 * start), glyphCount, outlinePaint, x, y,
- bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom, totalAdvance);
-
- // inner
- SkPaint innerPaint(paint);
- simplifyPaint(darken ? SK_ColorBLACK : SK_ColorWHITE, &innerPaint);
- innerPaint.setStyle(SkPaint::kFill_Style);
- canvas->drawText(glyphs + start, pos + (2 * start), glyphCount, innerPaint, x, y,
- bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom, totalAdvance);
- } else {
- // standard draw path
- canvas->drawText(glyphs + start, pos + (2 * start), glyphCount, paint, x, y,
- bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom,
- totalAdvance);
- }
+ canvas->drawText(glyphs + start, pos + (2 * start), glyphCount, paint, x, y,
+ bounds.mLeft, bounds.mTop, bounds.mRight, bounds.mBottom,
+ totalAdvance);
}
private:
const Layout& layout;
@@ -717,7 +679,6 @@
{"native_isOpaque","(J)Z", (void*) CanvasJNI::isOpaque},
{"native_getWidth","(J)I", (void*) CanvasJNI::getWidth},
{"native_getHeight","(J)I", (void*) CanvasJNI::getHeight},
- {"native_setHighContrastText","(JZ)V", (void*) CanvasJNI::setHighContrastText},
{"native_save","(JI)I", (void*) CanvasJNI::save},
{"native_saveLayer","(JFFFFJI)I", (void*) CanvasJNI::saveLayer},
{"native_saveLayerAlpha","(JFFFFII)I", (void*) CanvasJNI::saveLayerAlpha},
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 7bcc7f9..73caf68 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -215,9 +215,7 @@
}
/** @hide */
- public void setHighContrastText(boolean highContrastText) {
- native_setHighContrastText(mNativeCanvasWrapper, highContrastText);
- }
+ public void setHighContrastText(boolean highContrastText) {}
/** @hide */
public void insertReorderBarrier() {}
@@ -1976,7 +1974,6 @@
private static native void native_setBitmap(long canvasHandle,
Bitmap bitmap);
private static native boolean native_isOpaque(long canvasHandle);
- private static native void native_setHighContrastText(long renderer, boolean highContrastText);
private static native int native_getWidth(long canvasHandle);
private static native int native_getHeight(long canvasHandle);
diff --git a/libs/hwui/Canvas.h b/libs/hwui/Canvas.h
index a0b87f9..116bc56 100644
--- a/libs/hwui/Canvas.h
+++ b/libs/hwui/Canvas.h
@@ -62,9 +62,6 @@
virtual int width() = 0;
virtual int height() = 0;
- virtual void setHighContrastText(bool highContrastText) = 0;
- virtual bool isHighContrastText() = 0;
-
// ----------------------------------------------------------------------------
// Canvas state operations
// ----------------------------------------------------------------------------
diff --git a/libs/hwui/DisplayListCanvas.cpp b/libs/hwui/DisplayListCanvas.cpp
index cc69d55..af18e03 100644
--- a/libs/hwui/DisplayListCanvas.cpp
+++ b/libs/hwui/DisplayListCanvas.cpp
@@ -437,6 +437,16 @@
addDrawOp(op);
}
+static void simplifyPaint(int color, SkPaint* paint) {
+ paint->setColor(color);
+ paint->setShader(nullptr);
+ paint->setColorFilter(nullptr);
+ paint->setLooper(nullptr);
+ paint->setStrokeWidth(4 + 0.04 * paint->getTextSize());
+ paint->setStrokeJoin(SkPaint::kRound_Join);
+ paint->setLooper(nullptr);
+}
+
void DisplayListCanvas::drawText(const uint16_t* glyphs, const float* positions,
int count, const SkPaint& paint, float x, float y,
float boundsLeft, float boundsTop, float boundsRight, float boundsBottom,
@@ -449,9 +459,31 @@
positions = refBuffer<float>(positions, count * 2);
Rect bounds(boundsLeft, boundsTop, boundsRight, boundsBottom);
- DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count,
- x, y, positions, refPaint(&paint), totalAdvance, bounds);
- addDrawOp(op);
+ if (CC_UNLIKELY(mHighContrastText)) {
+ // high contrast draw path
+ int color = paint.getColor();
+ int channelSum = SkColorGetR(color) + SkColorGetG(color) + SkColorGetB(color);
+ bool darken = channelSum < (128 * 3);
+
+ // outline
+ SkPaint* outlinePaint = copyPaint(&paint);
+ simplifyPaint(darken ? SK_ColorWHITE : SK_ColorBLACK, outlinePaint);
+ outlinePaint->setStyle(SkPaint::kStrokeAndFill_Style);
+ addDrawOp(new (alloc()) DrawTextOp(text, bytesCount, count,
+ x, y, positions, outlinePaint, totalAdvance, bounds)); // bounds?
+
+ // inner
+ SkPaint* innerPaint = copyPaint(&paint);
+ simplifyPaint(darken ? SK_ColorBLACK : SK_ColorWHITE, innerPaint);
+ innerPaint->setStyle(SkPaint::kFill_Style);
+ addDrawOp(new (alloc()) DrawTextOp(text, bytesCount, count,
+ x, y, positions, innerPaint, totalAdvance, bounds));
+ } else {
+ // standard draw path
+ DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count,
+ x, y, positions, refPaint(&paint), totalAdvance, bounds);
+ addDrawOp(op);
+ }
}
void DisplayListCanvas::drawRegion(const SkRegion& region, const SkPaint& paint) {
diff --git a/libs/hwui/DisplayListCanvas.h b/libs/hwui/DisplayListCanvas.h
index efdf9ed..6f2e2b5 100644
--- a/libs/hwui/DisplayListCanvas.h
+++ b/libs/hwui/DisplayListCanvas.h
@@ -101,6 +101,10 @@
// TODO: rename for consistency
void callDrawGLFunction(Functor* functor);
+ void setHighContrastText(bool highContrastText) {
+ mHighContrastText = highContrastText;
+ }
+
// ----------------------------------------------------------------------------
// CanvasStateClient interface
// ----------------------------------------------------------------------------
@@ -121,11 +125,6 @@
virtual int width() override { return mState.getWidth(); }
virtual int height() override { return mState.getHeight(); }
- virtual void setHighContrastText(bool highContrastText) override {
- mHighContrastText = highContrastText;
- }
- virtual bool isHighContrastText() override { return mHighContrastText; }
-
// ----------------------------------------------------------------------------
// android/graphics/Canvas state operations
// ----------------------------------------------------------------------------
@@ -305,6 +304,16 @@
return cachedPaint;
}
+ inline SkPaint* copyPaint(const SkPaint* paint) {
+ if (!paint) return nullptr;
+
+ SkPaint* returnPaint = new SkPaint(*paint);
+ std::unique_ptr<const SkPaint> copy(returnPaint);
+ mDisplayListData->paints.push_back(std::move(copy));
+
+ return returnPaint;
+ }
+
inline const SkRegion* refRegion(const SkRegion* region) {
if (!region) {
return region;
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index c98e2f4..971b53a 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -55,9 +55,6 @@
virtual int width() override;
virtual int height() override;
- virtual void setHighContrastText(bool highContrastText) override {}
- virtual bool isHighContrastText() override { return false; }
-
virtual int getSaveCount() const override;
virtual int save(SkCanvas::SaveFlags flags) override;
virtual void restore() override;