From 19d4dd8599cb870923ab349d2ab96cacffd9c6f5 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Mon, 4 Mar 2013 11:14:26 -0800 Subject: Take text scale/skew into account only when rendering into a layer 3D rotations can undo scale/skew transforms; since FreeType only accepts 2x2 matrices we can end up generating very large glyphs that are drawn at a 1:1 scale on screen. For instance, if the current transform has a scale of 2000 set on both X and Y axis and a perspective Z factor set to Z, the actual scale factor on screen ends up being 1. We would however generate glyphs with a scale factor of 2000 causing the font renderer to blow up. Change-Id: Ia5c3618d36644e817825cb9c89e2f53aece2074e --- libs/hwui/OpenGLRenderer.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'libs/hwui/OpenGLRenderer.cpp') diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index ff6f332e6791..c81bf7a8918d 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -2673,7 +2673,26 @@ status_t OpenGLRenderer::drawText(const char* text, int bytesCount, int count, alpha, mode, oldX, oldY); } - fontRenderer.setFont(paint, pureTranslate ? mat4::identity() : *mSnapshot->transform); + const bool hasActiveLayer = hasLayer(); + + const mat4* fontTransform; + if (CC_LIKELY(pureTranslate)) { + fontTransform = &mat4::identity(); + } else { + if (CC_UNLIKELY(isPerspective)) { + // When the below condition is true, we are rendering text with a + // perspective transform inside a layer (either an inline layer + // created by Canvas.saveLayer() or a hardware layer.) + if (hasActiveLayer || getTargetFbo() != 0) { + fontTransform = mSnapshot->transform; + } else { + fontTransform = &mat4::identity(); + } + } else { + fontTransform = mSnapshot->transform; + } + } + fontRenderer.setFont(paint, *fontTransform); // Pick the appropriate texture filtering bool linearFilter = !pureTranslate || fabs(y - (int) y) > 0.0f || fabs(x - (int) x) > 0.0f; @@ -2701,8 +2720,6 @@ status_t OpenGLRenderer::drawText(const char* text, int bytesCount, int count, const Rect* clip = isPerspective ? NULL : mSnapshot->clipRect; Rect bounds(FLT_MAX / 2.0f, FLT_MAX / 2.0f, FLT_MIN / 2.0f, FLT_MIN / 2.0f); - const bool hasActiveLayer = hasLayer(); - bool status; if (CC_UNLIKELY(paint->getTextAlign() != SkPaint::kLeft_Align)) { SkPaint paintCopy(*paint); -- cgit v1.2.3-59-g8ed1b