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

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

Merge "More infrastructure for Canvas.drawTextOnPath"

parents 778f67f7 03d58520
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();
        }
    }
}