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

Commit 876d5661 authored by Derek Sollenberger's avatar Derek Sollenberger
Browse files

Support High Contrast Text for all canvas types

Change-Id: Ib46ba3d7c67e081872e6a4b11d294fe9a61f5bbd
parent 1f4fb3c4
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},
+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
// ----------------------------------------------------------------------------
+3 −35
Original line number Diff line number Diff line
@@ -437,16 +437,6 @@ void DisplayListCanvas::drawPosText(const uint16_t* text, const float* positions
    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,
@@ -459,32 +449,10 @@ void DisplayListCanvas::drawText(const uint16_t* glyphs, const float* positions,
    positions = refBuffer<float>(positions, count * 2);
    Rect bounds(boundsLeft, boundsTop, boundsRight, boundsBottom);

    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) {
    if (paint.getStyle() != SkPaint::kFill_Style ||
Loading