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;