Skip to content

Commit b1d0a4e

Browse files
author
Romain Guy
committed
Refactor GammaFontRenderer
This change is the first step to a shader-based text antialias gamma correction. Change-Id: I9eb02d4c56cb95d05219f712290c865b46141954
1 parent dd0d0ba commit b1d0a4e

File tree

7 files changed

+153
-37
lines changed

7 files changed

+153
-37
lines changed

libs/hwui/Caches.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ namespace uirenderer {
4949

5050
Caches::Caches(): Singleton<Caches>(), mInitialized(false) {
5151
init();
52+
initFont();
5253
initExtensions();
5354
initConstraints();
5455

@@ -74,6 +75,7 @@ void Caches::init() {
7475

7576
mTexCoordsArrayEnabled = false;
7677

78+
glDisable(GL_SCISSOR_TEST);
7779
scissorEnabled = false;
7880
mScissorX = mScissorY = mScissorWidth = mScissorHeight = 0;
7981

@@ -90,6 +92,10 @@ void Caches::init() {
9092
mInitialized = true;
9193
}
9294

95+
void Caches::initFont() {
96+
fontRenderer = GammaFontRenderer::createRenderer();
97+
}
98+
9399
void Caches::initExtensions() {
94100
if (extensions.hasDebugMarker()) {
95101
eventMark = glInsertEventMarkerEXT;
@@ -170,8 +176,8 @@ void Caches::dumpMemoryUsage(String8 &log) {
170176
arcShapeCache.getSize(), arcShapeCache.getMaxSize());
171177
log.appendFormat(" TextDropShadowCache %8d / %8d\n", dropShadowCache.getSize(),
172178
dropShadowCache.getMaxSize());
173-
for (uint32_t i = 0; i < fontRenderer.getFontRendererCount(); i++) {
174-
const uint32_t size = fontRenderer.getFontRendererSize(i);
179+
for (uint32_t i = 0; i < fontRenderer->getFontRendererCount(); i++) {
180+
const uint32_t size = fontRenderer->getFontRendererSize(i);
175181
log.appendFormat(" FontRenderer %d %8d / %8d\n", i, size, size);
176182
}
177183
log.appendFormat("Other:\n");
@@ -191,8 +197,8 @@ void Caches::dumpMemoryUsage(String8 &log) {
191197
total += ovalShapeCache.getSize();
192198
total += rectShapeCache.getSize();
193199
total += arcShapeCache.getSize();
194-
for (uint32_t i = 0; i < fontRenderer.getFontRendererCount(); i++) {
195-
total += fontRenderer.getFontRendererSize(i);
200+
for (uint32_t i = 0; i < fontRenderer->getFontRendererCount(); i++) {
201+
total += fontRenderer->getFontRendererSize(i);
196202
}
197203

198204
log.appendFormat("Total memory usage:\n");
@@ -245,10 +251,10 @@ void Caches::flush(FlushMode mode) {
245251
patchCache.clear();
246252
dropShadowCache.clear();
247253
gradientCache.clear();
248-
fontRenderer.clear();
254+
fontRenderer->clear();
249255
// fall through
250256
case kFlushMode_Moderate:
251-
fontRenderer.flush();
257+
fontRenderer->flush();
252258
textureCache.flush();
253259
pathCache.clear();
254260
roundRectShapeCache.clear();

libs/hwui/Caches.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,9 +249,10 @@ class ANDROID_API Caches: public Singleton<Caches> {
249249
PatchCache patchCache;
250250
TextDropShadowCache dropShadowCache;
251251
FboCache fboCache;
252-
GammaFontRenderer fontRenderer;
253252
ResourceCache resourceCache;
254253

254+
GammaFontRenderer* fontRenderer;
255+
255256
// Debug methods
256257
PFNGLINSERTEVENTMARKEREXTPROC eventMark;
257258
PFNGLPUSHGROUPMARKEREXTPROC startMark;
@@ -261,6 +262,7 @@ class ANDROID_API Caches: public Singleton<Caches> {
261262
PFNGLGETOBJECTLABELEXTPROC getLabel;
262263

263264
private:
265+
void initFont();
264266
void initExtensions();
265267
void initConstraints();
266268

libs/hwui/FontRenderer.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -677,10 +677,19 @@ void FontRenderer::cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyp
677677
unsigned int stride = glyph.rowBytes();
678678

679679
uint32_t cacheX = 0, bX = 0, cacheY = 0, bY = 0;
680-
for (cacheX = startX, bX = 0; cacheX < endX; cacheX++, bX++) {
681-
for (cacheY = startY, bY = 0; cacheY < endY; cacheY++, bY++) {
682-
uint8_t tempCol = bitmapBuffer[bY * stride + bX];
683-
cacheBuffer[cacheY * cacheWidth + cacheX] = mGammaTable[tempCol];
680+
if (mGammaTable) {
681+
for (cacheX = startX, bX = 0; cacheX < endX; cacheX++, bX++) {
682+
for (cacheY = startY, bY = 0; cacheY < endY; cacheY++, bY++) {
683+
uint8_t tempCol = bitmapBuffer[bY * stride + bX];
684+
cacheBuffer[cacheY * cacheWidth + cacheX] = mGammaTable[tempCol];
685+
}
686+
}
687+
} else {
688+
for (cacheX = startX, bX = 0; cacheX < endX; cacheX++, bX++) {
689+
for (cacheY = startY, bY = 0; cacheY < endY; cacheY++, bY++) {
690+
uint8_t tempCol = bitmapBuffer[bY * stride + bX];
691+
cacheBuffer[cacheY * cacheWidth + cacheX] = tempCol;
692+
}
684693
}
685694
}
686695

libs/hwui/GammaFontRenderer.cpp

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,30 @@ namespace android {
2424
namespace uirenderer {
2525

2626
///////////////////////////////////////////////////////////////////////////////
27-
// Constructors/destructor
27+
// Base class GammaFontRenderer
2828
///////////////////////////////////////////////////////////////////////////////
2929

30-
GammaFontRenderer::GammaFontRenderer() {
31-
INIT_LOGD("Creating gamma font renderer");
30+
GammaFontRenderer* GammaFontRenderer::createRenderer() {
31+
// Choose the best renderer
32+
char property[PROPERTY_VALUE_MAX];
33+
if (property_get(PROPERTY_TEXT_GAMMA_SHADER, property, DEFAULT_TEXT_GAMMA_SHADER) > 0) {
34+
if (!strcasecmp(property, "true")) {
35+
return new ShaderGammaFontRenderer();
36+
}
37+
}
38+
39+
return new LookupGammaFontRenderer();
40+
}
3241

42+
GammaFontRenderer::GammaFontRenderer() {
3343
// Get the renderer properties
3444
char property[PROPERTY_VALUE_MAX];
3545

3646
// Get the gamma
37-
float gamma = DEFAULT_TEXT_GAMMA;
47+
mGamma = DEFAULT_TEXT_GAMMA;
3848
if (property_get(PROPERTY_TEXT_GAMMA, property, NULL) > 0) {
3949
INIT_LOGD(" Setting text gamma to %s", property);
40-
gamma = atof(property);
50+
mGamma = atof(property);
4151
} else {
4252
INIT_LOGD(" Using default text gamma of %.2f", DEFAULT_TEXT_GAMMA);
4353
}
@@ -61,10 +71,29 @@ GammaFontRenderer::GammaFontRenderer() {
6171
INIT_LOGD(" Using default white black gamma threshold of %d",
6272
DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD);
6373
}
74+
}
75+
76+
GammaFontRenderer::~GammaFontRenderer() {
77+
}
78+
79+
///////////////////////////////////////////////////////////////////////////////
80+
// Shader-based renderer
81+
///////////////////////////////////////////////////////////////////////////////
82+
83+
ShaderGammaFontRenderer::ShaderGammaFontRenderer(): GammaFontRenderer() {
84+
INIT_LOGD("Creating shader gamma font renderer");
85+
}
86+
87+
///////////////////////////////////////////////////////////////////////////////
88+
// Lookup-based renderer
89+
///////////////////////////////////////////////////////////////////////////////
90+
91+
LookupGammaFontRenderer::LookupGammaFontRenderer(): GammaFontRenderer() {
92+
INIT_LOGD("Creating lookup gamma font renderer");
6493

6594
// Compute the gamma tables
66-
const float blackGamma = gamma;
67-
const float whiteGamma = 1.0f / gamma;
95+
const float blackGamma = mGamma;
96+
const float whiteGamma = 1.0f / mGamma;
6897

6998
for (uint32_t i = 0; i <= 255; i++) {
7099
mGammaTable[i] = i;
@@ -81,20 +110,20 @@ GammaFontRenderer::GammaFontRenderer() {
81110
memset(mRenderersUsageCount, 0, sizeof(uint32_t) * kGammaCount);
82111
}
83112

84-
GammaFontRenderer::~GammaFontRenderer() {
113+
LookupGammaFontRenderer::~LookupGammaFontRenderer() {
85114
for (int i = 0; i < kGammaCount; i++) {
86115
delete mRenderers[i];
87116
}
88117
}
89118

90-
void GammaFontRenderer::clear() {
119+
void LookupGammaFontRenderer::clear() {
91120
for (int i = 0; i < kGammaCount; i++) {
92121
delete mRenderers[i];
93122
mRenderers[i] = NULL;
94123
}
95124
}
96125

97-
void GammaFontRenderer::flush() {
126+
void LookupGammaFontRenderer::flush() {
98127
int count = 0;
99128
int min = -1;
100129
uint32_t minCount = UINT_MAX;
@@ -122,7 +151,7 @@ void GammaFontRenderer::flush() {
122151
}
123152
}
124153

125-
FontRenderer* GammaFontRenderer::getRenderer(Gamma gamma) {
154+
FontRenderer* LookupGammaFontRenderer::getRenderer(Gamma gamma) {
126155
FontRenderer* renderer = mRenderers[gamma];
127156
if (!renderer) {
128157
renderer = new FontRenderer();
@@ -133,7 +162,7 @@ FontRenderer* GammaFontRenderer::getRenderer(Gamma gamma) {
133162
return renderer;
134163
}
135164

136-
FontRenderer& GammaFontRenderer::getFontRenderer(const SkPaint* paint) {
165+
FontRenderer& LookupGammaFontRenderer::getFontRenderer(const SkPaint* paint) {
137166
if (paint->getShader() == NULL) {
138167
uint32_t c = paint->getColor();
139168
const int r = (c >> 16) & 0xFF;

libs/hwui/GammaFontRenderer.h

Lines changed: 75 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,72 @@
2424
namespace android {
2525
namespace uirenderer {
2626

27-
struct GammaFontRenderer {
27+
class GammaFontRenderer {
28+
public:
29+
virtual ~GammaFontRenderer();
30+
31+
virtual void clear() = 0;
32+
virtual void flush() = 0;
33+
34+
virtual FontRenderer& getFontRenderer(const SkPaint* paint) = 0;
35+
36+
virtual uint32_t getFontRendererCount() const = 0;
37+
38+
virtual uint32_t getFontRendererSize(uint32_t fontRenderer) const = 0;
39+
40+
static GammaFontRenderer* createRenderer();
41+
42+
protected:
2843
GammaFontRenderer();
29-
~GammaFontRenderer();
3044

31-
enum Gamma {
32-
kGammaDefault = 0,
33-
kGammaBlack = 1,
34-
kGammaWhite = 2,
35-
kGammaCount = 3
36-
};
45+
int mBlackThreshold;
46+
int mWhiteThreshold;
47+
48+
float mGamma;
49+
};
50+
51+
class ShaderGammaFontRenderer: public GammaFontRenderer {
52+
public:
53+
~ShaderGammaFontRenderer() {
54+
delete mRenderer;
55+
}
56+
57+
void clear() {
58+
delete mRenderer;
59+
}
60+
61+
void flush() {
62+
if (mRenderer) {
63+
mRenderer->flushLargeCaches();
64+
}
65+
}
66+
67+
FontRenderer& getFontRenderer(const SkPaint* paint) {
68+
if (!mRenderer) {
69+
mRenderer = new FontRenderer;
70+
}
71+
return *mRenderer;
72+
}
73+
74+
uint32_t getFontRendererCount() const {
75+
return 1;
76+
}
77+
78+
uint32_t getFontRendererSize(uint32_t fontRenderer) const {
79+
return mRenderer->getCacheSize();
80+
}
81+
82+
private:
83+
ShaderGammaFontRenderer();
84+
85+
FontRenderer* mRenderer;
86+
87+
friend class GammaFontRenderer;
88+
};
89+
90+
class LookupGammaFontRenderer: public GammaFontRenderer {
91+
public:
92+
~LookupGammaFontRenderer();
3793

3894
void clear();
3995
void flush();
@@ -54,15 +110,23 @@ struct GammaFontRenderer {
54110
}
55111

56112
private:
113+
LookupGammaFontRenderer();
114+
115+
enum Gamma {
116+
kGammaDefault = 0,
117+
kGammaBlack = 1,
118+
kGammaWhite = 2,
119+
kGammaCount = 3
120+
};
121+
57122
FontRenderer* getRenderer(Gamma gamma);
58123

59124
uint32_t mRenderersUsageCount[kGammaCount];
60125
FontRenderer* mRenderers[kGammaCount];
61126

62-
int mBlackThreshold;
63-
int mWhiteThreshold;
64-
65127
uint8_t mGammaTable[256 * kGammaCount];
128+
129+
friend class GammaFontRenderer;
66130
};
67131

68132
}; // namespace uirenderer

libs/hwui/OpenGLRenderer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2277,7 +2277,7 @@ status_t OpenGLRenderer::drawPosText(const char* text, int bytesCount, int count
22772277
y = (int) floorf(y + mSnapshot->transform->getTranslateY() + 0.5f);
22782278
}
22792279

2280-
FontRenderer& fontRenderer = mCaches.fontRenderer.getFontRenderer(paint);
2280+
FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(paint);
22812281
fontRenderer.setFont(paint, SkTypeface::UniqueID(paint->getTypeface()),
22822282
paint->getTextSize());
22832283

@@ -2367,7 +2367,7 @@ status_t OpenGLRenderer::drawText(const char* text, int bytesCount, int count,
23672367
ALOGD("OpenGLRenderer drawText() with FontID=%d", SkTypeface::UniqueID(paint->getTypeface()));
23682368
#endif
23692369

2370-
FontRenderer& fontRenderer = mCaches.fontRenderer.getFontRenderer(paint);
2370+
FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(paint);
23712371
fontRenderer.setFont(paint, SkTypeface::UniqueID(paint->getTypeface()),
23722372
paint->getTextSize());
23732373

@@ -2466,7 +2466,7 @@ status_t OpenGLRenderer::drawTextOnPath(const char* text, int bytesCount, int co
24662466
return DrawGlInfo::kStatusDone;
24672467
}
24682468

2469-
FontRenderer& fontRenderer = mCaches.fontRenderer.getFontRenderer(paint);
2469+
FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(paint);
24702470
fontRenderer.setFont(paint, SkTypeface::UniqueID(paint->getTypeface()),
24712471
paint->getTextSize());
24722472

libs/hwui/Properties.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ enum DebugLevel {
7373
#define PROPERTY_TEXT_CACHE_WIDTH "ro.hwui.text_cache_width"
7474
#define PROPERTY_TEXT_CACHE_HEIGHT "ro.hwui.text_cache_height"
7575

76+
// Indicates whether gamma correction should be applied in the shaders
77+
// or in lookup tables. Accepted values: true, false
78+
#define PROPERTY_TEXT_GAMMA_SHADER "ro.hwui.text_gamma_shader"
79+
7680
// Gamma (>= 1.0, <= 10.0)
7781
#define PROPERTY_TEXT_GAMMA "ro.text_gamma"
7882
#define PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD "ro.text_gamma.black_threshold"
@@ -92,6 +96,8 @@ enum DebugLevel {
9296

9397
#define DEFAULT_TEXTURE_CACHE_FLUSH_RATE 0.6f
9498

99+
#define DEFAULT_TEXT_GAMMA_SHADER "false"
100+
95101
#define DEFAULT_TEXT_GAMMA 1.4f
96102
#define DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD 64
97103
#define DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD 192

0 commit comments

Comments
 (0)