@@ -67,20 +67,63 @@ GammaFontRenderer::GammaFontRenderer() {
6767 const float whiteGamma = 1 .0f / gamma;
6868
6969 for (uint32_t i = 0 ; i <= 255 ; i++) {
70- mDefault [i] = i;
70+ mGammaTable [i] = i;
7171
7272 const float v = i / 255 .0f ;
7373 const float black = pow (v, blackGamma);
7474 const float white = pow (v, whiteGamma);
7575
76- mBlackGamma [ i] = uint8_t ((float )::floor (black * 255 .0f + 0 .5f ));
77- mWhiteGamma [ i] = uint8_t ((float )::floor (white * 255 .0f + 0 .5f ));
76+ mGammaTable [ 256 + i] = uint8_t ((float )::floor (black * 255 .0f + 0 .5f ));
77+ mGammaTable [ 512 + i] = uint8_t ((float )::floor (white * 255 .0f + 0 .5f ));
7878 }
7979
80- // Configure the font renderers
81- mDefaultRenderer .setGammaTable (&mDefault [0 ]);
82- mBlackGammaRenderer .setGammaTable (&mBlackGamma [0 ]);
83- mWhiteGammaRenderer .setGammaTable (&mWhiteGamma [0 ]);
80+ memset (mRenderers , 0 , sizeof (FontRenderer*) * kGammaCount );
81+ memset (mRenderersUsageCount , 0 , sizeof (uint32_t ) * kGammaCount );
82+ }
83+
84+ GammaFontRenderer::~GammaFontRenderer () {
85+ for (int i = 0 ; i < kGammaCount ; i++) {
86+ delete mRenderers [i];
87+ }
88+ }
89+
90+ void GammaFontRenderer::clear () {
91+ for (int i = 0 ; i < kGammaCount ; i++) {
92+ delete mRenderers [i];
93+ mRenderers [i] = NULL ;
94+ }
95+ }
96+
97+ void GammaFontRenderer::flush () {
98+ int count = 0 ;
99+ int min = -1 ;
100+ uint32_t minCount = UINT_MAX;
101+
102+ for (int i = 0 ; i < kGammaCount ; i++) {
103+ if (mRenderers [i]) {
104+ count++;
105+ if (mRenderersUsageCount [i] < minCount) {
106+ minCount = mRenderersUsageCount [i];
107+ min = i;
108+ }
109+ }
110+ }
111+
112+ if (count <= 1 || min < 0 ) return ;
113+
114+ delete mRenderers [min];
115+ mRenderers [min] = NULL ;
116+ }
117+
118+ FontRenderer* GammaFontRenderer::getRenderer (Gamma gamma) {
119+ FontRenderer* renderer = mRenderers [gamma];
120+ if (!renderer) {
121+ renderer = new FontRenderer ();
122+ mRenderers [gamma] = renderer;
123+ renderer->setGammaTable (&mGammaTable [gamma * 256 ]);
124+ }
125+ mRenderersUsageCount [gamma]++;
126+ return renderer;
84127}
85128
86129FontRenderer& GammaFontRenderer::getFontRenderer (const SkPaint* paint) {
@@ -92,12 +135,12 @@ FontRenderer& GammaFontRenderer::getFontRenderer(const SkPaint* paint) {
92135 const int luminance = (r * 2 + g * 5 + b) >> 3 ;
93136
94137 if (luminance <= mBlackThreshold ) {
95- return mBlackGammaRenderer ;
138+ return * getRenderer ( kGammaBlack ) ;
96139 } else if (luminance >= mWhiteThreshold ) {
97- return mWhiteGammaRenderer ;
140+ return * getRenderer ( kGammaWhite ) ;
98141 }
99142 }
100- return mDefaultRenderer ;
143+ return * getRenderer ( kGammaDefault ) ;
101144}
102145
103146}; // namespace uirenderer
0 commit comments