Add hack for custom re-rasterization buckets
bug:14083128
Moves all of the font transform management into
OpenGLRenderer::findBestFontTransform(), and now simply passes down
final rasterization transforms into the FontRenderer.
Change-Id: Ie02752e6af863347b142367c7d628db5f9fc2998
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index ce48ad3..1bbcff1 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -2699,7 +2699,7 @@
}
FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(paint);
- fontRenderer.setFont(paint, mat4::identity());
+ fontRenderer.setFont(paint, SkMatrix::I());
int alpha;
SkXfermode::Mode mode;
@@ -2736,20 +2736,41 @@
return DrawGlInfo::kStatusDrew;
}
-mat4 OpenGLRenderer::findBestFontTransform(const mat4& transform) const {
- mat4 fontTransform;
+bool OpenGLRenderer::findBestFontTransform(const mat4& transform, SkMatrix* outMatrix) const {
if (CC_LIKELY(transform.isPureTranslate())) {
- fontTransform = mat4::identity();
- } else {
- if (CC_UNLIKELY(transform.isPerspective())) {
- fontTransform = mat4::identity();
- } else {
- float sx, sy;
- currentTransform()->decomposeScale(sx, sy);
- fontTransform.loadScale(sx, sy, 1.0f);
- }
+ outMatrix->setIdentity();
+ return false;
+ } else if (CC_UNLIKELY(transform.isPerspective())) {
+ outMatrix->setIdentity();
+ return true;
}
- return fontTransform;
+
+ /**
+ * Input is a non-perspective, scaling transform. Generate a scale-only transform, based upon
+ * bucketed scale values. Special case for 'extra raster buckets' - disable filtration in the
+ * case of an exact match, and isSimple() transform
+ */
+ float sx, sy;
+ transform.decomposeScale(sx, sy);
+
+ float bestSx = roundf(fmaxf(1.0f, sx));
+ float bestSy = roundf(fmaxf(1.0f, sy));
+ bool filter = true;
+
+ for (unsigned int i = 0; i < mCaches.propertyExtraRasterBuckets.size(); i++) {
+ float bucket = mCaches.propertyExtraRasterBuckets[i];
+ if (sx == bucket && sy == bucket) {
+ bestSx = bestSy = bucket;
+ filter = !transform.isSimple(); // disable filter, if simple
+ break;
+ }
+
+ if (fabs(bucket - sx) < fabs(bestSx - sx)) bestSx = sx;
+ if (fabs(bucket - sy) < fabs(bestSy - sy)) bestSy = sy;
+ }
+
+ outMatrix->setScale(bestSx, bestSy);
+ return filter;
}
status_t OpenGLRenderer::drawText(const char* text, int bytesCount, int count, float x, float y,
@@ -2783,7 +2804,7 @@
FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(paint);
if (CC_UNLIKELY(hasTextShadow(paint))) {
- fontRenderer.setFont(paint, mat4::identity());
+ fontRenderer.setFont(paint, SkMatrix::I());
drawTextShadow(paint, text, bytesCount, count, positions, fontRenderer,
alpha, oldX, oldY);
}
@@ -2801,11 +2822,11 @@
// Applying the full matrix in the shader is the easiest way to handle
// rotation and perspective and allows us to always generated quads in the
// font renderer which greatly simplifies the code, clipping in particular.
- mat4 fontTransform = findBestFontTransform(transform);
+ SkMatrix fontTransform;
+ bool linearFilter = findBestFontTransform(transform, &fontTransform)
+ || fabs(y - (int) y) > 0.0f
+ || fabs(x - (int) x) > 0.0f;
fontRenderer.setFont(paint, fontTransform);
-
- // Pick the appropriate texture filtering
- bool linearFilter = !pureTranslate || fabs(y - (int) y) > 0.0f || fabs(x - (int) x) > 0.0f;
fontRenderer.setTextureFiltering(linearFilter);
// TODO: Implement better clipping for scaled/rotated text
@@ -2849,7 +2870,7 @@
mCaches.enableScissor();
FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(paint);
- fontRenderer.setFont(paint, mat4::identity());
+ fontRenderer.setFont(paint, SkMatrix::I());
fontRenderer.setTextureFiltering(true);
int alpha;