Loading libs/hwui/OpenGLRenderer.cpp +67 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <sys/types.h> #include <SkCanvas.h> #include <SkPathMeasure.h> #include <SkTypeface.h> #include <utils/Log.h> Loading Loading @@ -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) { Loading tests/HwAccelerationTest/src/com/android/test/hwui/TextOnPathActivity.java +19 −3 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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(); } } } Loading
libs/hwui/OpenGLRenderer.cpp +67 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <sys/types.h> #include <SkCanvas.h> #include <SkPathMeasure.h> #include <SkTypeface.h> #include <utils/Log.h> Loading Loading @@ -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) { Loading
tests/HwAccelerationTest/src/com/android/test/hwui/TextOnPathActivity.java +19 −3 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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(); } } }