|
21 | 21 | #include <sys/types.h> |
22 | 22 |
|
23 | 23 | #include <SkCanvas.h> |
| 24 | +#include <SkPathMeasure.h> |
24 | 25 | #include <SkTypeface.h> |
25 | 26 |
|
26 | 27 | #include <utils/Log.h> |
@@ -2294,7 +2295,72 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count, |
2294 | 2295 |
|
2295 | 2296 | void OpenGLRenderer::drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path, |
2296 | 2297 | 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 | +// } |
2298 | 2364 | } |
2299 | 2365 |
|
2300 | 2366 | void OpenGLRenderer::drawPath(SkPath* path, SkPaint* paint) { |
|
0 commit comments