Skip to content

Commit 2abb138

Browse files
Romain GuyAndroid (Google) Code Review
authored andcommitted
Merge "More infrastructure for Canvas.drawTextOnPath"
2 parents 778f67f + 03d5852 commit 2abb138

File tree

2 files changed

+86
-4
lines changed

2 files changed

+86
-4
lines changed

libs/hwui/OpenGLRenderer.cpp

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <sys/types.h>
2222

2323
#include <SkCanvas.h>
24+
#include <SkPathMeasure.h>
2425
#include <SkTypeface.h>
2526

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

22952296
void OpenGLRenderer::drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
22962297
float hOffset, float vOffset, SkPaint* paint) {
2297-
// TODO: Implement
2298+
if (text == NULL || count == 0 || mSnapshot->isIgnored() ||
2299+
(paint->getAlpha() == 0 && paint->getXfermode() == NULL)) {
2300+
return;
2301+
}
2302+
2303+
float x = 0.0f;
2304+
float y = 0.0f;
2305+
2306+
const bool pureTranslate = mSnapshot->transform->isPureTranslate();
2307+
if (CC_LIKELY(pureTranslate)) {
2308+
x = (int) floorf(x + mSnapshot->transform->getTranslateX() + 0.5f);
2309+
y = (int) floorf(y + mSnapshot->transform->getTranslateY() + 0.5f);
2310+
}
2311+
2312+
FontRenderer& fontRenderer = mCaches.fontRenderer.getFontRenderer(paint);
2313+
fontRenderer.setFont(paint, SkTypeface::UniqueID(paint->getTypeface()),
2314+
paint->getTextSize());
2315+
2316+
int alpha;
2317+
SkXfermode::Mode mode;
2318+
getAlphaAndMode(paint, &alpha, &mode);
2319+
2320+
mCaches.activeTexture(0);
2321+
setupDraw();
2322+
setupDrawDirtyRegionsDisabled();
2323+
setupDrawWithTexture(true);
2324+
setupDrawAlpha8Color(paint->getColor(), alpha);
2325+
setupDrawColorFilter();
2326+
setupDrawShader();
2327+
setupDrawBlending(true, mode);
2328+
setupDrawProgram();
2329+
setupDrawModelView(x, y, x, y, pureTranslate, true);
2330+
setupDrawTexture(fontRenderer.getTexture(true));
2331+
setupDrawPureColorUniforms();
2332+
setupDrawColorFilterUniforms();
2333+
setupDrawShaderUniforms(pureTranslate);
2334+
2335+
// mat4 pathTransform;
2336+
// pathTransform.loadTranslate(hOffset, vOffset, 0.0f);
2337+
//
2338+
// float offset = 0.0f;
2339+
// SkPathMeasure pathMeasure(*path, false);
2340+
//
2341+
// if (paint->getTextAlign() != SkPaint::kLeft_Align) {
2342+
// SkScalar pathLength = pathMeasure.getLength();
2343+
// if (paint->getTextAlign() == SkPaint::kCenter_Align) {
2344+
// pathLength = SkScalarHalf(pathLength);
2345+
// }
2346+
// offset += SkScalarToFloat(pathLength);
2347+
// }
2348+
2349+
// SkScalar x;
2350+
// SkPath tmp;
2351+
// SkMatrix m(scaledMatrix);
2352+
//
2353+
// m.postTranslate(xpos + hOffset, 0);
2354+
// if (matrix) {
2355+
// m.postConcat(*matrix);
2356+
// }
2357+
// morphpath(&tmp, *iterPath, meas, m);
2358+
// if (fDevice) {
2359+
// fDevice->drawPath(*this, tmp, iter.getPaint(), NULL, true);
2360+
// } else {
2361+
// this->drawPath(tmp, iter.getPaint(), NULL, true);
2362+
// }
2363+
// }
22982364
}
22992365

23002366
void OpenGLRenderer::drawPath(SkPath* path, SkPaint* paint) {

tests/HwAccelerationTest/src/com/android/test/hwui/TextOnPathActivity.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ public TextOnPathView(Context c) {
6464
mPaint.setAntiAlias(true);
6565
mPaint.setColor(0xff000000);
6666

67-
StringBuilder builder = new StringBuilder(TEST_STRING.length() * 5);
68-
for (int i = 0; i < 5; i++) {
67+
StringBuilder builder = new StringBuilder(TEST_STRING.length() * 2);
68+
for (int i = 0; i < 2; i++) {
6969
builder.append(TEST_STRING);
7070
}
7171
mText = builder.toString();
@@ -77,8 +77,24 @@ protected void onDraw(Canvas canvas) {
7777

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

80-
canvas.translate(550.0f, 60.0f);
80+
canvas.save();
81+
canvas.translate(400.0f, 350.0f);
82+
mPaint.setTextAlign(Paint.Align.LEFT);
83+
canvas.drawTextOnPath(mText + mText, mPath, 0.0f, 0.0f, mPaint);
84+
canvas.restore();
85+
86+
canvas.save();
87+
canvas.translate(150.0f, 60.0f);
88+
canvas.drawTextOnPath(mText, mPath, 0.0f, 0.0f, mPaint);
89+
90+
canvas.translate(250.0f, 0.0f);
91+
mPaint.setTextAlign(Paint.Align.CENTER);
92+
canvas.drawTextOnPath(mText, mPath, 0.0f, 0.0f, mPaint);
93+
94+
canvas.translate(250.0f, 0.0f);
95+
mPaint.setTextAlign(Paint.Align.RIGHT);
8196
canvas.drawTextOnPath(mText, mPath, 0.0f, 0.0f, mPaint);
97+
canvas.restore();
8298
}
8399
}
84100
}

0 commit comments

Comments
 (0)