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

Commit 778f67f7 authored by Romain Guy's avatar Romain Guy Committed by Android (Google) Code Review
Browse files

Merge "Add hooks to implement Canvas.drawTextOnPath() in GL"

parents b73644a9 325740fb
Loading
Loading
Loading
Loading
+26 −2
Original line number Original line Diff line number Diff line
@@ -1208,13 +1208,37 @@ class GLES20Canvas extends HardwareCanvas {
    @Override
    @Override
    public void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset,
    public void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset,
            float vOffset, Paint paint) {
            float vOffset, Paint paint) {
        // TODO: Implement
        if (index < 0 || index + count > text.length) {
            throw new ArrayIndexOutOfBoundsException();
        }

        int modifiers = setupModifiers(paint);
        try {
            nDrawTextOnPath(mRenderer, text, index, count, path.mNativePath, hOffset, vOffset,
                    paint.mBidiFlags, paint.mNativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
    }
    }


    private static native void nDrawTextOnPath(int renderer, char[] text, int index, int count,
            int path, float hOffset, float vOffset, int bidiFlags, int nativePaint);

    @Override
    @Override
    public void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) {
    public void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) {
        // TODO: Implement
        if (text.length() == 0) return;

        int modifiers = setupModifiers(paint);
        try {
            nDrawTextOnPath(mRenderer, text, 0, text.length(), path.mNativePath, hOffset, vOffset,
                    paint.mBidiFlags, paint.mNativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }

    private static native void nDrawTextOnPath(int renderer, String text, int start, int end,
            int path, float hOffset, float vOffset, int bidiFlags, int nativePaint);


    @Override
    @Override
    public void drawTextRun(char[] text, int index, int count, int contextIndex, int contextCount,
    public void drawTextRun(char[] text, int index, int count, int contextIndex, int contextCount,
+0 −5
Original line number Original line Diff line number Diff line
@@ -101,11 +101,6 @@ void TextLayout::drawTextOnPath(SkPaint* paint, const jchar* text, int count,
    SkScalar h_ = SkFloatToScalar(hOffset);
    SkScalar h_ = SkFloatToScalar(hOffset);
    SkScalar v_ = SkFloatToScalar(vOffset);
    SkScalar v_ = SkFloatToScalar(vOffset);


    if (!needsLayout(text, count, bidiFlags)) {
        canvas->drawTextOnPathHV(text, count << 1, *path, h_, v_, *paint);
        return;
    }

    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
            text, 0, count, count, bidiFlags);
            text, 0, count, count, bidiFlags);
    if (value == NULL) {
    if (value == NULL) {
+36 −0
Original line number Original line Diff line number Diff line
@@ -521,6 +521,20 @@ static void renderText(OpenGLRenderer* renderer, const jchar* text, int count,
    renderer->drawText((const char*) glyphs, bytesCount, glyphsCount, x, y, paint);
    renderer->drawText((const char*) glyphs, bytesCount, glyphsCount, x, y, paint);
}
}


static void renderTextOnPath(OpenGLRenderer* renderer, const jchar* text, int count,
        SkPath* path, jfloat hOffset, jfloat vOffset, int flags, SkPaint* paint) {
    sp<TextLayoutValue> value = TextLayoutEngine::getInstance().getValue(paint,
            text, 0, count, count, flags);
    if (value == NULL) {
        return;
    }
    const jchar* glyphs = value->getGlyphs();
    size_t glyphsCount = value->getGlyphsCount();
    int bytesCount = glyphsCount * sizeof(jchar);
    renderer->drawTextOnPath((const char*) glyphs, bytesCount, glyphsCount, path,
            hOffset, vOffset, paint);
}

static void renderTextRun(OpenGLRenderer* renderer, const jchar* text,
static void renderTextRun(OpenGLRenderer* renderer, const jchar* text,
        jint start, jint count, jint contextCount, jfloat x, jfloat y,
        jint start, jint count, jint contextCount, jfloat x, jfloat y,
        int flags, SkPaint* paint) {
        int flags, SkPaint* paint) {
@@ -551,6 +565,24 @@ static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject clazz,
    env->ReleaseStringChars(text, textArray);
    env->ReleaseStringChars(text, textArray);
}
}


static void android_view_GLES20Canvas_drawTextArrayOnPath(JNIEnv* env, jobject clazz,
        OpenGLRenderer* renderer, jcharArray text, jint index, jint count,
        SkPath* path, jfloat hOffset, jfloat vOffset, jint flags, SkPaint* paint) {
    jchar* textArray = env->GetCharArrayElements(text, NULL);
    renderTextOnPath(renderer, textArray + index, count, path,
            hOffset, vOffset, flags, paint);
    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
}

static void android_view_GLES20Canvas_drawTextOnPath(JNIEnv* env, jobject clazz,
        OpenGLRenderer* renderer, jstring text, jint start, jint end,
        SkPath* path, jfloat hOffset, jfloat vOffset, jint flags, SkPaint* paint) {
    const jchar* textArray = env->GetStringChars(text, NULL);
    renderTextOnPath(renderer, textArray + start, end - start, path,
            hOffset, vOffset, flags, paint);
    env->ReleaseStringChars(text, textArray);
}

static void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz,
static void android_view_GLES20Canvas_drawTextRunArray(JNIEnv* env, jobject clazz,
        OpenGLRenderer* renderer, jcharArray text, jint index, jint count,
        OpenGLRenderer* renderer, jcharArray text, jint index, jint count,
        jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags,
        jint contextIndex, jint contextCount, jfloat x, jfloat y, jint dirFlags,
@@ -885,6 +917,10 @@ static JNINativeMethod gMethods[] = {
    { "nDrawText",          "(ILjava/lang/String;IIFFII)V",
    { "nDrawText",          "(ILjava/lang/String;IIFFII)V",
            (void*) android_view_GLES20Canvas_drawText },
            (void*) android_view_GLES20Canvas_drawText },


    { "nDrawTextOnPath",    "(I[CIIIFFII)V",   (void*) android_view_GLES20Canvas_drawTextArrayOnPath },
    { "nDrawTextOnPath",    "(ILjava/lang/String;IIIFFII)V",
            (void*) android_view_GLES20Canvas_drawTextOnPath },

    { "nDrawTextRun",       "(I[CIIIIFFII)V",  (void*) android_view_GLES20Canvas_drawTextRunArray },
    { "nDrawTextRun",       "(I[CIIIIFFII)V",  (void*) android_view_GLES20Canvas_drawTextRunArray },
    { "nDrawTextRun",       "(ILjava/lang/String;IIIIFFII)V",
    { "nDrawTextRun",       "(ILjava/lang/String;IIIIFFII)V",
            (void*) android_view_GLES20Canvas_drawTextRun },
            (void*) android_view_GLES20Canvas_drawTextRun },
+39 −1
Original line number Original line Diff line number Diff line
@@ -61,6 +61,7 @@ const char* DisplayList::OP_NAMES[] = {
    "DrawLines",
    "DrawLines",
    "DrawPoints",
    "DrawPoints",
    "DrawText",
    "DrawText",
    "DrawTextOnPath",
    "DrawPosText",
    "DrawPosText",
    "ResetShader",
    "ResetShader",
    "SetupShader",
    "SetupShader",
@@ -483,7 +484,7 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
            break;
            break;
            case DrawText: {
            case DrawText: {
                getText(&text);
                getText(&text);
                int count = getInt();
                int32_t count = getInt();
                float x = getFloat();
                float x = getFloat();
                float y = getFloat();
                float y = getFloat();
                SkPaint* paint = getPaint(renderer);
                SkPaint* paint = getPaint(renderer);
@@ -492,6 +493,17 @@ void DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
                    text.text(), text.length(), count, x, y, paint, length);
                    text.text(), text.length(), count, x, y, paint, length);
            }
            }
            break;
            break;
            case DrawTextOnPath: {
                getText(&text);
                int32_t count = getInt();
                SkPath* path = getPath();
                float hOffset = getFloat();
                float vOffset = getFloat();
                SkPaint* paint = getPaint(renderer);
                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
                    text.text(), text.length(), count, paint);
            }
            break;
            case DrawPosText: {
            case DrawPosText: {
                getText(&text);
                getText(&text);
                int count = getInt();
                int count = getInt();
@@ -890,6 +902,19 @@ bool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, u
                renderer.drawText(text.text(), text.length(), count, x, y, paint, length);
                renderer.drawText(text.text(), text.length(), count, x, y, paint, length);
            }
            }
            break;
            break;
            case DrawTextOnPath: {
                getText(&text);
                int32_t count = getInt();
                SkPath* path = getPath();
                float hOffset = getFloat();
                float vOffset = getFloat();
                SkPaint* paint = getPaint(renderer);
                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
                    text.text(), text.length(), count, paint);
                renderer.drawTextOnPath(text.text(), text.length(), count, path,
                        hOffset, vOffset, paint);
            }
            break;
            case DrawPosText: {
            case DrawPosText: {
                getText(&text);
                getText(&text);
                int32_t count = getInt();
                int32_t count = getInt();
@@ -1331,6 +1356,19 @@ void DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
    addSkip(location);
    addSkip(location);
}
}


void DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
    if (!text || count <= 0) return;
    addOp(DisplayList::DrawTextOnPath);
    addText(text, bytesCount);
    addInt(count);
    addPath(path);
    addFloat(hOffset);
    addFloat(vOffset);
    paint->setAntiAlias(true);
    addPaint(paint);
}

void DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
void DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
        const float* positions, SkPaint* paint) {
        const float* positions, SkPaint* paint) {
    if (!text || count <= 0) return;
    if (!text || count <= 0) return;
+3 −0
Original line number Original line Diff line number Diff line
@@ -99,6 +99,7 @@ public:
        DrawLines,
        DrawLines,
        DrawPoints,
        DrawPoints,
        DrawText,
        DrawText,
        DrawTextOnPath,
        DrawPosText,
        DrawPosText,
        ResetShader,
        ResetShader,
        SetupShader,
        SetupShader,
@@ -310,6 +311,8 @@ public:
    virtual void drawPoints(float* points, int count, SkPaint* paint);
    virtual void drawPoints(float* points, int count, SkPaint* paint);
    virtual void drawText(const char* text, int bytesCount, int count, float x, float y,
    virtual void drawText(const char* text, int bytesCount, int count, float x, float y,
            SkPaint* paint, float length = 1.0f);
            SkPaint* paint, float length = 1.0f);
    virtual void drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
            float hOffset, float vOffset, SkPaint* paint);
    virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions,
    virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions,
            SkPaint* paint);
            SkPaint* paint);


Loading