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
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index ff6f332..c81bf7a 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -2673,7 +2673,26 @@
                 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 @@
     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);