diff options
| author | 2012-02-24 17:54:07 -0800 | |
|---|---|---|
| committer | 2012-02-24 17:54:07 -0800 | |
| commit | 03d58520c3eb6bb7efb7235bfd957550533d6725 (patch) | |
| tree | 97b131fd746d7857a005dc2a93d64469ebbcb7fc /libs/hwui/OpenGLRenderer.cpp | |
| parent | 325740fb444af8fc7fb0119b2e30ce322c2ae134 (diff) | |
More infrastructure for Canvas.drawTextOnPath
Change-Id: Iff42b24e342650d06fa4e2fa9db6c28da820ff01
Diffstat (limited to 'libs/hwui/OpenGLRenderer.cpp')
| -rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 6f0f8363434c..ebb6d88a0f77 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -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) { |