From 03d58520c3eb6bb7efb7235bfd957550533d6725 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Fri, 24 Feb 2012 17:54:07 -0800 Subject: More infrastructure for Canvas.drawTextOnPath Change-Id: Iff42b24e342650d06fa4e2fa9db6c28da820ff01 --- libs/hwui/OpenGLRenderer.cpp | 68 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) (limited to 'libs/hwui/OpenGLRenderer.cpp') 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 #include +#include #include #include @@ -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) { -- cgit v1.2.3-59-g8ed1b