Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 897863ba authored by Derek Sollenberger's avatar Derek Sollenberger Committed by Android (Google) Code Review
Browse files

Merge "Support High Contrast Text for all canvas types"

parents 23e8619a 6578a989
Loading
Loading
Loading
Loading
+0 −14
Original line number Diff line number Diff line
@@ -147,24 +147,10 @@ public class DisplayListCanvas extends Canvas {
    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);
+42 −3
Original line number Diff line number Diff line
@@ -69,6 +69,11 @@ static jint getHeight(JNIEnv*, jobject, jlong canvasHandle) {
    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());
}
@@ -430,6 +435,16 @@ static void drawBitmapMesh(JNIEnv* env, jobject, jlong canvasHandle, jobject jbi
                                             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,
@@ -454,10 +469,33 @@ public:
        }

        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);
        }
    }
private:
    const Layout& layout;
    Canvas* canvas;
@@ -679,6 +717,7 @@ static JNINativeMethod gMethods[] = {
    {"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},
+0 −7
Original line number Diff line number Diff line
@@ -50,12 +50,6 @@ static struct {
// Setup
// ----------------------------------------------------------------------------

static void android_view_DisplayListCanvas_setHighContrastText(JNIEnv* env, jobject clazz,
        jlong rendererPtr, jboolean highContrastText) {
    DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr);
    renderer->setHighContrastText(highContrastText);
}

static void android_view_DisplayListCanvas_insertReorderBarrier(JNIEnv* env, jobject clazz,
        jlong rendererPtr, jboolean reorderEnable) {
    DisplayListCanvas* renderer = reinterpret_cast<DisplayListCanvas*>(rendererPtr);
@@ -198,7 +192,6 @@ const char* const kClassPathName = "android/view/DisplayListCanvas";

static JNINativeMethod gMethods[] = {
    { "nIsAvailable",       "()Z",             (void*) android_view_DisplayListCanvas_isAvailable },
    { "nSetHighContrastText","(JZ)V",          (void*) android_view_DisplayListCanvas_setHighContrastText },
    { "nInsertReorderBarrier","(JZ)V",         (void*) android_view_DisplayListCanvas_insertReorderBarrier },

    { "nCallDrawGLFunction", "(JJ)V",          (void*) android_view_DisplayListCanvas_callDrawGLFunction },
+4 −1
Original line number Diff line number Diff line
@@ -215,7 +215,9 @@ public class Canvas {
    }

    /** @hide */
    public void setHighContrastText(boolean highContrastText) {}
    public void setHighContrastText(boolean highContrastText) {
        native_setHighContrastText(mNativeCanvasWrapper, highContrastText);
    }

    /** @hide */
    public void insertReorderBarrier() {}
@@ -1974,6 +1976,7 @@ public class Canvas {
    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);

+3 −0
Original line number Diff line number Diff line
@@ -62,6 +62,9 @@ public:
    virtual int width() = 0;
    virtual int height() = 0;

    virtual void setHighContrastText(bool highContrastText) = 0;
    virtual bool isHighContrastText() = 0;

// ----------------------------------------------------------------------------
// Canvas state operations
// ----------------------------------------------------------------------------
Loading