OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrDistanceFieldTextContext.h" | 8 #include "GrDistanceFieldTextContext.h" |
9 #include "GrAtlas.h" | 9 #include "GrAtlas.h" |
10 #include "SkColorFilter.h" | 10 #include "SkColorFilter.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
59 : GrTextContext(context, pro perties) { | 59 : GrTextContext(context, pro perties) { |
60 #if SK_FORCE_DISTANCEFIELD_FONTS | 60 #if SK_FORCE_DISTANCEFIELD_FONTS |
61 fEnableDFRendering = true; | 61 fEnableDFRendering = true; |
62 #else | 62 #else |
63 fEnableDFRendering = enable; | 63 fEnableDFRendering = enable; |
64 #endif | 64 #endif |
65 fStrike = NULL; | 65 fStrike = NULL; |
66 fGammaTexture = NULL; | 66 fGammaTexture = NULL; |
67 | 67 |
68 fCurrVertex = 0; | 68 fCurrVertex = 0; |
69 | 69 fEffectTextureUniqueID = SK_InvalidUniqueID; |
robertphillips
2014/07/29 14:01:06
fEffectColor = XXX; ?
jvanverth1
2014/07/29 14:43:41
Done.
| |
70 fEffectFlags = 0; | |
71 | |
70 fVertices = NULL; | 72 fVertices = NULL; |
71 } | 73 } |
72 | 74 |
73 GrDistanceFieldTextContext::~GrDistanceFieldTextContext() { | 75 GrDistanceFieldTextContext::~GrDistanceFieldTextContext() { |
74 this->flushGlyphs(); | 76 this->flushGlyphs(); |
75 SkSafeSetNull(fGammaTexture); | 77 SkSafeSetNull(fGammaTexture); |
76 } | 78 } |
77 | 79 |
78 bool GrDistanceFieldTextContext::canDraw(const SkPaint& paint) { | 80 bool GrDistanceFieldTextContext::canDraw(const SkPaint& paint) { |
79 if (!fEnableDFRendering && !paint.isDistanceFieldTextTEMP()) { | 81 if (!fEnableDFRendering && !paint.isDistanceFieldTextTEMP()) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
120 GrDrawState::AutoRestoreEffects are(drawState); | 122 GrDrawState::AutoRestoreEffects are(drawState); |
121 drawState->setFromPaint(fPaint, fContext->getMatrix(), fContext->getRenderTa rget()); | 123 drawState->setFromPaint(fPaint, fContext->getMatrix(), fContext->getRenderTa rget()); |
122 | 124 |
123 if (fCurrVertex > 0) { | 125 if (fCurrVertex > 0) { |
124 // setup our sampler state for our text texture/atlas | 126 // setup our sampler state for our text texture/atlas |
125 SkASSERT(SkIsAlign4(fCurrVertex)); | 127 SkASSERT(SkIsAlign4(fCurrVertex)); |
126 GrTexture* currTexture = fStrike->getTexture(); | 128 GrTexture* currTexture = fStrike->getTexture(); |
127 SkASSERT(currTexture); | 129 SkASSERT(currTexture); |
128 GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kBil erp_FilterMode); | 130 GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kBil erp_FilterMode); |
129 GrTextureParams gammaParams(SkShader::kClamp_TileMode, GrTextureParams:: kNone_FilterMode); | 131 GrTextureParams gammaParams(SkShader::kClamp_TileMode, GrTextureParams:: kNone_FilterMode); |
130 | 132 |
robertphillips
2014/07/29 14:01:06
textureUniqueID ?
jvanverth1
2014/07/29 14:43:41
Done.
| |
131 // Effects could be stored with one of the cache objects (atlas?) | 133 uint32_t textureGenID = currTexture->getUniqueID(); |
132 int coordsIdx = drawState->hasColorVertexAttribute() ? kGlyphCoordsWithC olorAttributeIndex : | 134 |
133 kGlyphCoordsNoCol orAttributeIndex; | 135 // get our current color |
134 SkColor filteredColor; | 136 SkColor filteredColor; |
135 SkColorFilter* colorFilter = fSkPaint.getColorFilter(); | 137 SkColorFilter* colorFilter = fSkPaint.getColorFilter(); |
136 if (NULL != colorFilter) { | 138 if (NULL != colorFilter) { |
137 filteredColor = colorFilter->filterColor(fSkPaint.getColor()); | 139 filteredColor = colorFilter->filterColor(fSkPaint.getColor()); |
138 } else { | 140 } else { |
139 filteredColor = fSkPaint.getColor(); | 141 filteredColor = fSkPaint.getColor(); |
140 } | 142 } |
robertphillips
2014/07/29 14:01:06
Could this be a helper method like "setupCoverageE
jvanverth1
2014/07/29 14:43:41
Done.
| |
143 | |
144 // set up any flags | |
145 uint32_t flags = 0; | |
146 flags |= fContext->getMatrix().isSimilarity() ? kSimilarity_DistanceFiel dEffectFlag : 0; | |
147 flags |= fUseLCDText ? kUseLCD_DistanceFieldEffectFlag : 0; | |
148 flags |= fUseLCDText && fContext->getMatrix().rectStaysRect() ? | |
149 kRectToRect_Distance FieldEffectFlag : 0; | |
150 bool useBGR = SkDeviceProperties::Geometry::kBGR_Layout == | |
151 fDeviceProperties.fG eometry.getLayout(); | |
152 flags |= fUseLCDText && useBGR ? kBGR_DistanceFieldEffectFlag : 0; | |
153 | |
154 // see if we need to create a new effect | |
155 if (textureGenID != fEffectTextureUniqueID || | |
156 filteredColor != fEffectColor || | |
157 flags != fEffectFlags) { | |
158 if (fUseLCDText) { | |
159 GrColor colorNoPreMul = skcolor_to_grcolor_nopremultiply(filtere dColor); | |
160 fCachedEffect.reset(GrDistanceFieldLCDTextureEffect::Create(curr Texture, | |
161 para ms, | |
162 fGam maTexture, | |
163 gamm aParams, | |
164 colo rNoPreMul, | |
165 flag s)); | |
166 } else { | |
167 #ifdef SK_GAMMA_APPLY_TO_A8 | |
168 U8CPU lum = SkColorSpaceLuminance::computeLuminance(fDevicePrope rties.fGamma, | |
169 filteredColo r); | |
170 fCachedEffect.reset(GrDistanceFieldTextureEffect::Create(currTex ture, | |
171 params, | |
172 fGammaT exture, | |
173 gammaPa rams, | |
174 lum/255 .f, | |
175 flags)) ; | |
176 #else | |
177 fCachedEffect.reset(GrDistanceFieldTextureEffect::Create(currTex ture, | |
178 params, flags)); | |
179 #endif | |
180 | |
181 } | |
182 fEffectTextureUniqueID = textureGenID; | |
183 fEffectColor = filteredColor; | |
184 fEffectFlags = flags; | |
185 } | |
186 | |
187 // Effects could be stored with one of the cache objects (atlas?) | |
188 int coordsIdx = drawState->hasColorVertexAttribute() ? kGlyphCoordsWithC olorAttributeIndex : | |
189 kGlyphCoordsNoCol orAttributeIndex; | |
190 drawState->addCoverageEffect(fCachedEffect.get(), coordsIdx); | |
191 | |
192 // Set draw state | |
141 if (fUseLCDText) { | 193 if (fUseLCDText) { |
142 GrColor colorNoPreMul = skcolor_to_grcolor_nopremultiply(filteredCol or); | 194 GrColor colorNoPreMul = skcolor_to_grcolor_nopremultiply(filteredCol or); |
143 bool useBGR = SkDeviceProperties::Geometry::kBGR_Layout == | |
144 fDeviceProperties.fG eometry.getLayout(); | |
145 drawState->addCoverageEffect(GrDistanceFieldLCDTextureEffect::Create ( | |
146 currTexture, | |
147 params, | |
148 fGammaTexture, | |
149 gammaParams, | |
150 colorNoPreMul, | |
151 fContext->getMatrix( ).rectStaysRect() && | |
152 fContext->getMatrix( ).isSimilarity(), | |
153 useBGR), | |
154 coordsIdx)->unref(); | |
155 | |
156 if (kOne_GrBlendCoeff != fPaint.getSrcBlendCoeff() || | 195 if (kOne_GrBlendCoeff != fPaint.getSrcBlendCoeff() || |
157 kISA_GrBlendCoeff != fPaint.getDstBlendCoeff() || | 196 kISA_GrBlendCoeff != fPaint.getDstBlendCoeff() || |
158 fPaint.numColorStages()) { | 197 fPaint.numColorStages()) { |
159 GrPrintf("LCD Text will not draw correctly.\n"); | 198 GrPrintf("LCD Text will not draw correctly.\n"); |
160 } | 199 } |
161 SkASSERT(!drawState->hasColorVertexAttribute()); | 200 SkASSERT(!drawState->hasColorVertexAttribute()); |
162 // We don't use the GrPaint's color in this case because it's been p remultiplied by | 201 // We don't use the GrPaint's color in this case because it's been p remultiplied by |
163 // alpha. Instead we feed in a non-premultiplied color, and multiply its alpha by | 202 // alpha. Instead we feed in a non-premultiplied color, and multiply its alpha by |
164 // the mask texture color. The end result is that we get | 203 // the mask texture color. The end result is that we get |
165 // mask*paintAlpha*paintColor + (1-mask*paintAlpha)*dstCo lor | 204 // mask*paintAlpha*paintColor + (1-mask*paintAlpha)*dstCo lor |
166 int a = SkColorGetA(fSkPaint.getColor()); | 205 int a = SkColorGetA(fSkPaint.getColor()); |
167 // paintAlpha | 206 // paintAlpha |
168 drawState->setColor(SkColorSetARGB(a, a, a, a)); | 207 drawState->setColor(SkColorSetARGB(a, a, a, a)); |
169 // paintColor | 208 // paintColor |
170 drawState->setBlendConstant(colorNoPreMul); | 209 drawState->setBlendConstant(colorNoPreMul); |
171 drawState->setBlendFunc(kConstC_GrBlendCoeff, kISC_GrBlendCoeff); | 210 drawState->setBlendFunc(kConstC_GrBlendCoeff, kISC_GrBlendCoeff); |
172 } else { | 211 } else { |
173 #ifdef SK_GAMMA_APPLY_TO_A8 | |
174 U8CPU lum = SkColorSpaceLuminance::computeLuminance(fDevicePropertie s.fGamma, | |
175 filteredColor); | |
176 drawState->addCoverageEffect(GrDistanceFieldTextureEffect::Create( | |
177 currTexture, param s, | |
178 fGammaTexture, gam maParams, | |
179 lum/255.f, | |
180 fContext->getMatri x().isSimilarity()), | |
181 coordsIdx)->unref(); | |
182 #else | |
183 drawState->addCoverageEffect(GrDistanceFieldTextureEffect::Create( | |
184 currTexture, param s, | |
185 fContext->getMatri x().isSimilarity()), | |
186 coordsIdx)->unref(); | |
187 #endif | |
188 // set back to normal in case we took LCD path previously. | 212 // set back to normal in case we took LCD path previously. |
189 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlen dCoeff()); | 213 drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlen dCoeff()); |
190 //drawState->setColor(fPaint.getColor()); | 214 //drawState->setColor(fPaint.getColor()); |
191 // We're using per-vertex color. | 215 // We're using per-vertex color. |
192 SkASSERT(drawState->hasColorVertexAttribute()); | 216 SkASSERT(drawState->hasColorVertexAttribute()); |
193 drawState->setColor(0xFFFFFFFF); | 217 drawState->setColor(0xFFFFFFFF); |
194 } | 218 } |
195 int nGlyphs = fCurrVertex / 4; | 219 int nGlyphs = fCurrVertex / 4; |
196 fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); | 220 fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); |
197 fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType, | 221 fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType, |
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
590 SkScalarToFixed(x) - (glyph.fAdvanceX >> a lignShift), | 614 SkScalarToFixed(x) - (glyph.fAdvanceX >> a lignShift), |
591 SkScalarToFixed(y) - (glyph.fAdvanceY >> a lignShift), | 615 SkScalarToFixed(y) - (glyph.fAdvanceY >> a lignShift), |
592 fontScaler); | 616 fontScaler); |
593 } | 617 } |
594 pos += scalarsPerPosition; | 618 pos += scalarsPerPosition; |
595 } | 619 } |
596 } | 620 } |
597 | 621 |
598 this->finish(); | 622 this->finish(); |
599 } | 623 } |
OLD | NEW |