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

Commit 03d58520 authored by Romain Guy's avatar Romain Guy
Browse files

More infrastructure for Canvas.drawTextOnPath

Change-Id: Iff42b24e342650d06fa4e2fa9db6c28da820ff01
parent 325740fb
Loading
Loading
Loading
Loading
+67 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <sys/types.h>

#include <SkCanvas.h>
#include <SkPathMeasure.h>
#include <SkTypeface.h>

#include <utils/Log.h>
@@ -2294,7 +2295,72 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count,

void OpenGLRenderer::drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
        float hOffset, float vOffset, SkPaint* paint) {
    // TODO: Implement
    if (text == NULL || count == 0 || mSnapshot->isIgnored() ||
            (paint->getAlpha() == 0 && paint->getXfermode() == NULL)) {
        return;
    }

    float x = 0.0f;
    float y = 0.0f;

    const bool pureTranslate = mSnapshot->transform->isPureTranslate();
    if (CC_LIKELY(pureTranslate)) {
        x = (int) floorf(x + mSnapshot->transform->getTranslateX() + 0.5f);
        y = (int) floorf(y + mSnapshot->transform->getTranslateY() + 0.5f);
    }

    FontRenderer& fontRenderer = mCaches.fontRenderer.getFontRenderer(paint);
    fontRenderer.setFont(paint, SkTypeface::UniqueID(paint->getTypeface()),
            paint->getTextSize());

    int alpha;
    SkXfermode::Mode mode;
    getAlphaAndMode(paint, &alpha, &mode);

    mCaches.activeTexture(0);
    setupDraw();
    setupDrawDirtyRegionsDisabled();
    setupDrawWithTexture(true);
    setupDrawAlpha8Color(paint->getColor(), alpha);
    setupDrawColorFilter();
    setupDrawShader();
    setupDrawBlending(true, mode);
    setupDrawProgram();
    setupDrawModelView(x, y, x, y, pureTranslate, true);
    setupDrawTexture(fontRenderer.getTexture(true));
    setupDrawPureColorUniforms();
    setupDrawColorFilterUniforms();
    setupDrawShaderUniforms(pureTranslate);

//    mat4 pathTransform;
//    pathTransform.loadTranslate(hOffset, vOffset, 0.0f);
//
//    float offset = 0.0f;
//    SkPathMeasure pathMeasure(*path, false);
//
//    if (paint->getTextAlign() != SkPaint::kLeft_Align) {
//        SkScalar pathLength = pathMeasure.getLength();
//        if (paint->getTextAlign() == SkPaint::kCenter_Align) {
//            pathLength = SkScalarHalf(pathLength);
//        }
//        offset += SkScalarToFloat(pathLength);
//    }

//        SkScalar x;
//        SkPath      tmp;
//        SkMatrix    m(scaledMatrix);
//
//        m.postTranslate(xpos + hOffset, 0);
//        if (matrix) {
//            m.postConcat(*matrix);
//        }
//        morphpath(&tmp, *iterPath, meas, m);
//        if (fDevice) {
//            fDevice->drawPath(*this, tmp, iter.getPaint(), NULL, true);
//        } else {
//            this->drawPath(tmp, iter.getPaint(), NULL, true);
//        }
//    }
}

void OpenGLRenderer::drawPath(SkPath* path, SkPaint* paint) {
+19 −3
Original line number Diff line number Diff line
@@ -64,8 +64,8 @@ public class TextOnPathActivity extends Activity {
            mPaint.setAntiAlias(true);
            mPaint.setColor(0xff000000);

            StringBuilder builder = new StringBuilder(TEST_STRING.length() * 5);
            for (int i = 0; i < 5; i++) {
            StringBuilder builder = new StringBuilder(TEST_STRING.length() * 2);
            for (int i = 0; i < 2; i++) {
                builder.append(TEST_STRING);
            }
            mText = builder.toString();
@@ -77,8 +77,24 @@ public class TextOnPathActivity extends Activity {

            canvas.drawARGB(255, 255, 255, 255);

            canvas.translate(550.0f, 60.0f);
            canvas.save();
            canvas.translate(400.0f, 350.0f);
            mPaint.setTextAlign(Paint.Align.LEFT);
            canvas.drawTextOnPath(mText + mText, mPath, 0.0f, 0.0f, mPaint);
            canvas.restore();

            canvas.save();
            canvas.translate(150.0f, 60.0f);
            canvas.drawTextOnPath(mText, mPath, 0.0f, 0.0f, mPaint);

            canvas.translate(250.0f, 0.0f);
            mPaint.setTextAlign(Paint.Align.CENTER);
            canvas.drawTextOnPath(mText, mPath, 0.0f, 0.0f, mPaint);

            canvas.translate(250.0f, 0.0f);
            mPaint.setTextAlign(Paint.Align.RIGHT);
            canvas.drawTextOnPath(mText, mPath, 0.0f, 0.0f, mPaint);
            canvas.restore();
        }
    }
}