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 "GrDistanceFieldTextureEffect.h" | 8 #include "GrDistanceFieldTextureEffect.h" |
9 #include "GrFontAtlasSizes.h" | 9 #include "GrFontAtlasSizes.h" |
10 #include "GrInvariantOutput.h" | 10 #include "GrInvariantOutput.h" |
11 #include "GrTexture.h" | 11 #include "GrTexture.h" |
12 | 12 |
13 #include "SkDistanceFieldGen.h" | 13 #include "SkDistanceFieldGen.h" |
14 | 14 |
15 #include "gl/GrGLProcessor.h" | 15 #include "gl/GrGLProcessor.h" |
16 #include "gl/GrGLSL.h" | 16 #include "gl/GrGLSL.h" |
17 #include "gl/GrGLTexture.h" | 17 #include "gl/GrGLTexture.h" |
18 #include "gl/GrGLGeometryProcessor.h" | 18 #include "gl/GrGLGeometryProcessor.h" |
19 #include "gl/builders/GrGLProgramBuilder.h" | 19 #include "gl/builders/GrGLProgramBuilder.h" |
20 | 20 |
21 // Assuming a radius of a little less than the diagonal of the fragment | 21 // Assuming a radius of a little less than the diagonal of the fragment |
22 #define SK_DistanceFieldAAFactor "0.65" | 22 #define SK_DistanceFieldAAFactor "0.65" |
23 | 23 |
24 struct DistanceFieldBatchTracker { | 24 struct DistanceFieldBatchTracker { |
25 GrGPInput fInputColorType; | 25 GrGPInput fInputColorType; |
26 GrColor fColor; | 26 GrColor fColor; |
27 bool fUsesLocalCoords; | 27 bool fUsesLocalCoords; |
28 }; | 28 }; |
29 | 29 |
30 class GrGLDistanceFieldTextureEffect : public GrGLGeometryProcessor { | 30 class GrGLDistanceFieldA8TextGeoProc : public GrGLGeometryProcessor { |
31 public: | 31 public: |
32 GrGLDistanceFieldTextureEffect(const GrGeometryProcessor&, | 32 GrGLDistanceFieldA8TextGeoProc(const GrGeometryProcessor&, |
33 const GrBatchTracker&) | 33 const GrBatchTracker&) |
34 : fColor(GrColor_ILLEGAL) | 34 : fColor(GrColor_ILLEGAL) |
35 #ifdef SK_GAMMA_APPLY_TO_A8 | 35 #ifdef SK_GAMMA_APPLY_TO_A8 |
36 , fDistanceAdjust(-1.0f) | 36 , fDistanceAdjust(-1.0f) |
37 #endif | 37 #endif |
38 {} | 38 {} |
39 | 39 |
40 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 40 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
41 const GrDistanceFieldTextureEffect& dfTexEffect = | 41 const GrDistanceFieldA8TextGeoProc& dfTexEffect = |
42 args.fGP.cast<GrDistanceFieldTextureEffect>(); | 42 args.fGP.cast<GrDistanceFieldA8TextGeoProc>(); |
43 const DistanceFieldBatchTracker& local = args.fBT.cast<DistanceFieldBatc
hTracker>(); | 43 const DistanceFieldBatchTracker& local = args.fBT.cast<DistanceFieldBatc
hTracker>(); |
44 GrGLGPBuilder* pb = args.fPB; | 44 GrGLGPBuilder* pb = args.fPB; |
45 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 45 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
46 SkAssertResult(fsBuilder->enableFeature( | 46 SkAssertResult(fsBuilder->enableFeature( |
47 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); | 47 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); |
48 | 48 |
49 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 49 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
50 | 50 |
51 // emit attributes | 51 // emit attributes |
52 vsBuilder->emitAttributes(dfTexEffect); | 52 vsBuilder->emitAttributes(dfTexEffect); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 } | 153 } |
154 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc
e);"); | 154 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc
e);"); |
155 | 155 |
156 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); | 156 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
157 } | 157 } |
158 | 158 |
159 virtual void setData(const GrGLProgramDataManager& pdman, | 159 virtual void setData(const GrGLProgramDataManager& pdman, |
160 const GrPrimitiveProcessor& proc, | 160 const GrPrimitiveProcessor& proc, |
161 const GrBatchTracker& bt) override { | 161 const GrBatchTracker& bt) override { |
162 #ifdef SK_GAMMA_APPLY_TO_A8 | 162 #ifdef SK_GAMMA_APPLY_TO_A8 |
163 const GrDistanceFieldTextureEffect& dfTexEffect = | 163 const GrDistanceFieldA8TextGeoProc& dfTexEffect = proc.cast<GrDistanceFi
eldA8TextGeoProc>(); |
164 proc.cast<GrDistanceFieldTextureEffect>(); | |
165 float distanceAdjust = dfTexEffect.getDistanceAdjust(); | 164 float distanceAdjust = dfTexEffect.getDistanceAdjust(); |
166 if (distanceAdjust != fDistanceAdjust) { | 165 if (distanceAdjust != fDistanceAdjust) { |
167 pdman.set1f(fDistanceAdjustUni, distanceAdjust); | 166 pdman.set1f(fDistanceAdjustUni, distanceAdjust); |
168 fDistanceAdjust = distanceAdjust; | 167 fDistanceAdjust = distanceAdjust; |
169 } | 168 } |
170 #endif | 169 #endif |
171 | 170 |
172 this->setUniformViewMatrix(pdman, proc.viewMatrix()); | 171 this->setUniformViewMatrix(pdman, proc.viewMatrix()); |
173 | 172 |
174 const DistanceFieldBatchTracker& local = bt.cast<DistanceFieldBatchTrack
er>(); | 173 const DistanceFieldBatchTracker& local = bt.cast<DistanceFieldBatchTrack
er>(); |
175 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo
r) { | 174 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo
r) { |
176 GrGLfloat c[4]; | 175 GrGLfloat c[4]; |
177 GrColorToRGBAFloat(local.fColor, c); | 176 GrColorToRGBAFloat(local.fColor, c); |
178 pdman.set4fv(fColorUniform, 1, c); | 177 pdman.set4fv(fColorUniform, 1, c); |
179 fColor = local.fColor; | 178 fColor = local.fColor; |
180 } | 179 } |
181 } | 180 } |
182 | 181 |
183 static inline void GenKey(const GrGeometryProcessor& gp, | 182 static inline void GenKey(const GrGeometryProcessor& gp, |
184 const GrBatchTracker& bt, | 183 const GrBatchTracker& bt, |
185 const GrGLCaps&, | 184 const GrGLCaps&, |
186 GrProcessorKeyBuilder* b) { | 185 GrProcessorKeyBuilder* b) { |
187 const GrDistanceFieldTextureEffect& dfTexEffect = gp.cast<GrDistanceFiel
dTextureEffect>(); | 186 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel
dA8TextGeoProc>(); |
188 const DistanceFieldBatchTracker& local = bt.cast<DistanceFieldBatchTrack
er>(); | 187 const DistanceFieldBatchTracker& local = bt.cast<DistanceFieldBatchTrack
er>(); |
189 uint32_t key = dfTexEffect.getFlags(); | 188 uint32_t key = dfTexEffect.getFlags(); |
190 key |= local.fInputColorType << 16; | 189 key |= local.fInputColorType << 16; |
191 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1
<< 24: 0x0; | 190 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1
<< 24: 0x0; |
192 key |= ComputePosKey(gp.viewMatrix()) << 25; | 191 key |= ComputePosKey(gp.viewMatrix()) << 25; |
193 key |= (!gp.viewMatrix().isIdentity() && !gp.localMatrix().isIdentity())
? 0x1 << 27 : 0x0; | 192 key |= (!gp.viewMatrix().isIdentity() && !gp.localMatrix().isIdentity())
? 0x1 << 27 : 0x0; |
194 b->add32(key); | 193 b->add32(key); |
195 } | 194 } |
196 | 195 |
197 private: | 196 private: |
198 GrColor fColor; | 197 GrColor fColor; |
199 UniformHandle fColorUniform; | 198 UniformHandle fColorUniform; |
200 #ifdef SK_GAMMA_APPLY_TO_A8 | 199 #ifdef SK_GAMMA_APPLY_TO_A8 |
201 float fDistanceAdjust; | 200 float fDistanceAdjust; |
202 UniformHandle fDistanceAdjustUni; | 201 UniformHandle fDistanceAdjustUni; |
203 #endif | 202 #endif |
204 | 203 |
205 typedef GrGLGeometryProcessor INHERITED; | 204 typedef GrGLGeometryProcessor INHERITED; |
206 }; | 205 }; |
207 | 206 |
208 /////////////////////////////////////////////////////////////////////////////// | 207 /////////////////////////////////////////////////////////////////////////////// |
209 | 208 |
210 GrDistanceFieldTextureEffect::GrDistanceFieldTextureEffect(GrColor color, | 209 GrDistanceFieldA8TextGeoProc::GrDistanceFieldA8TextGeoProc(GrColor color, |
211 const SkMatrix& viewM
atrix, | 210 const SkMatrix& viewM
atrix, |
212 const SkMatrix& local
Matrix, | 211 const SkMatrix& local
Matrix, |
213 GrTexture* texture, | 212 GrTexture* texture, |
214 const GrTextureParams
& params, | 213 const GrTextureParams
& params, |
215 #ifdef SK_GAMMA_APPLY_TO_A8 | 214 #ifdef SK_GAMMA_APPLY_TO_A8 |
216 float distanceAdjust, | 215 float distanceAdjust, |
217 #endif | 216 #endif |
218 uint32_t flags, bool
opaqueVertexColors) | 217 uint32_t flags, bool
opaqueVertexColors) |
219 : INHERITED(color, viewMatrix, localMatrix, opaqueVertexColors) | 218 : INHERITED(color, viewMatrix, localMatrix, opaqueVertexColors) |
220 , fTextureAccess(texture, params) | 219 , fTextureAccess(texture, params) |
221 #ifdef SK_GAMMA_APPLY_TO_A8 | 220 #ifdef SK_GAMMA_APPLY_TO_A8 |
222 , fDistanceAdjust(distanceAdjust) | 221 , fDistanceAdjust(distanceAdjust) |
223 #endif | 222 #endif |
224 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) | 223 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) |
225 , fInColor(NULL) { | 224 , fInColor(NULL) { |
226 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); | 225 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); |
227 this->initClassID<GrDistanceFieldTextureEffect>(); | 226 this->initClassID<GrDistanceFieldA8TextGeoProc>(); |
228 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); | 227 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); |
229 if (flags & kColorAttr_DistanceFieldEffectFlag) { | 228 if (flags & kColorAttr_DistanceFieldEffectFlag) { |
230 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); | 229 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); |
231 this->setHasVertexColor(); | 230 this->setHasVertexColor(); |
232 } | 231 } |
233 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 232 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
234 kVec2s_GrVertexAttribT
ype)); | 233 kVec2s_GrVertexAttribT
ype)); |
235 this->addTextureAccess(&fTextureAccess); | 234 this->addTextureAccess(&fTextureAccess); |
236 } | 235 } |
237 | 236 |
238 bool GrDistanceFieldTextureEffect::onIsEqual(const GrGeometryProcessor& other) c
onst { | 237 bool GrDistanceFieldA8TextGeoProc::onIsEqual(const GrGeometryProcessor& other) c
onst { |
239 const GrDistanceFieldTextureEffect& cte = other.cast<GrDistanceFieldTextureE
ffect>(); | 238 const GrDistanceFieldA8TextGeoProc& cte = other.cast<GrDistanceFieldA8TextGe
oProc>(); |
240 return | 239 return |
241 #ifdef SK_GAMMA_APPLY_TO_A8 | 240 #ifdef SK_GAMMA_APPLY_TO_A8 |
242 fDistanceAdjust == cte.fDistanceAdjust && | 241 fDistanceAdjust == cte.fDistanceAdjust && |
243 #endif | 242 #endif |
244 fFlags == cte.fFlags; | 243 fFlags == cte.fFlags; |
245 } | 244 } |
246 | 245 |
247 void GrDistanceFieldTextureEffect::onGetInvariantOutputCoverage(GrInitInvariantO
utput* out) const { | 246 void GrDistanceFieldA8TextGeoProc::onGetInvariantOutputCoverage(GrInitInvariantO
utput* out) const { |
248 out->setUnknownSingleComponent(); | 247 out->setUnknownSingleComponent(); |
249 } | 248 } |
250 | 249 |
251 void GrDistanceFieldTextureEffect::getGLProcessorKey(const GrBatchTracker& bt, | 250 void GrDistanceFieldA8TextGeoProc::getGLProcessorKey(const GrBatchTracker& bt, |
252 const GrGLCaps& caps, | 251 const GrGLCaps& caps, |
253 GrProcessorKeyBuilder* b) c
onst { | 252 GrProcessorKeyBuilder* b) c
onst { |
254 GrGLDistanceFieldTextureEffect::GenKey(*this, bt, caps, b); | 253 GrGLDistanceFieldA8TextGeoProc::GenKey(*this, bt, caps, b); |
255 } | 254 } |
256 | 255 |
257 GrGLPrimitiveProcessor* | 256 GrGLPrimitiveProcessor* |
258 GrDistanceFieldTextureEffect::createGLInstance(const GrBatchTracker& bt, | 257 GrDistanceFieldA8TextGeoProc::createGLInstance(const GrBatchTracker& bt, |
259 const GrGLCaps&) const { | 258 const GrGLCaps&) const { |
260 return SkNEW_ARGS(GrGLDistanceFieldTextureEffect, (*this, bt)); | 259 return SkNEW_ARGS(GrGLDistanceFieldA8TextGeoProc, (*this, bt)); |
261 } | 260 } |
262 | 261 |
263 void GrDistanceFieldTextureEffect::initBatchTracker(GrBatchTracker* bt, | 262 void GrDistanceFieldA8TextGeoProc::initBatchTracker(GrBatchTracker* bt, |
264 const GrPipelineInfo& init)
const { | 263 const GrPipelineInfo& init)
const { |
265 DistanceFieldBatchTracker* local = bt->cast<DistanceFieldBatchTracker>(); | 264 DistanceFieldBatchTracker* local = bt->cast<DistanceFieldBatchTracker>(); |
266 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in
it, | 265 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in
it, |
267 SkToBool(fInColor)); | 266 SkToBool(fInColor)); |
268 local->fUsesLocalCoords = init.fUsesLocalCoords; | 267 local->fUsesLocalCoords = init.fUsesLocalCoords; |
269 } | 268 } |
270 | 269 |
271 bool GrDistanceFieldTextureEffect::onCanMakeEqual(const GrBatchTracker& m, | 270 bool GrDistanceFieldA8TextGeoProc::onCanMakeEqual(const GrBatchTracker& m, |
272 const GrGeometryProcessor& tha
t, | 271 const GrGeometryProcessor& tha
t, |
273 const GrBatchTracker& t) const
{ | 272 const GrBatchTracker& t) const
{ |
274 const DistanceFieldBatchTracker& mine = m.cast<DistanceFieldBatchTracker>(); | 273 const DistanceFieldBatchTracker& mine = m.cast<DistanceFieldBatchTracker>(); |
275 const DistanceFieldBatchTracker& theirs = t.cast<DistanceFieldBatchTracker>(
); | 274 const DistanceFieldBatchTracker& theirs = t.cast<DistanceFieldBatchTracker>(
); |
276 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, | 275 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, |
277 that, theirs.fUsesLocalCoords) && | 276 that, theirs.fUsesLocalCoords) && |
278 CanCombineOutput(mine.fInputColorType, mine.fColor, | 277 CanCombineOutput(mine.fInputColorType, mine.fColor, |
279 theirs.fInputColorType, theirs.fColor); | 278 theirs.fInputColorType, theirs.fColor); |
280 } | 279 } |
281 | 280 |
282 /////////////////////////////////////////////////////////////////////////////// | 281 /////////////////////////////////////////////////////////////////////////////// |
283 | 282 |
284 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldTextureEffect); | 283 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldA8TextGeoProc); |
285 | 284 |
286 GrGeometryProcessor* GrDistanceFieldTextureEffect::TestCreate(SkRandom* random, | 285 GrGeometryProcessor* GrDistanceFieldA8TextGeoProc::TestCreate(SkRandom* random, |
287 GrContext*, | 286 GrContext*, |
288 const GrDrawTarget
Caps&, | 287 const GrDrawTarget
Caps&, |
289 GrTexture* texture
s[]) { | 288 GrTexture* texture
s[]) { |
290 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : | 289 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : |
291 GrProcessorUnitTest::kAlphaTextureIdx; | 290 GrProcessorUnitTest::kAlphaTextureIdx; |
292 static const SkShader::TileMode kTileModes[] = { | 291 static const SkShader::TileMode kTileModes[] = { |
293 SkShader::kClamp_TileMode, | 292 SkShader::kClamp_TileMode, |
294 SkShader::kRepeat_TileMode, | 293 SkShader::kRepeat_TileMode, |
295 SkShader::kMirror_TileMode, | 294 SkShader::kMirror_TileMode, |
296 }; | 295 }; |
297 SkShader::TileMode tileModes[] = { | 296 SkShader::TileMode tileModes[] = { |
298 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], | 297 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], |
299 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], | 298 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], |
300 }; | 299 }; |
301 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil
erp_FilterMode : | 300 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil
erp_FilterMode : |
302 GrTextureParams::kNon
e_FilterMode); | 301 GrTextureParams::kNon
e_FilterMode); |
303 | 302 |
304 return GrDistanceFieldTextureEffect::Create(GrRandomColor(random), | 303 return GrDistanceFieldA8TextGeoProc::Create(GrRandomColor(random), |
305 GrProcessorUnitTest::TestMatrix(
random), | 304 GrProcessorUnitTest::TestMatrix(
random), |
306 GrProcessorUnitTest::TestMatrix(
random), | 305 GrProcessorUnitTest::TestMatrix(
random), |
307 textures[texIdx], params, | 306 textures[texIdx], params, |
308 #ifdef SK_GAMMA_APPLY_TO_A8 | 307 #ifdef SK_GAMMA_APPLY_TO_A8 |
309 random->nextF(), | 308 random->nextF(), |
310 #endif | 309 #endif |
311 random->nextBool() ? | 310 random->nextBool() ? |
312 kSimilarity_DistanceFieldEff
ectFlag : 0, | 311 kSimilarity_DistanceFieldEff
ectFlag : 0, |
313 random->nextBool()); | 312 random->nextBool()); |
314 } | 313 } |
315 | 314 |
316 /////////////////////////////////////////////////////////////////////////////// | 315 /////////////////////////////////////////////////////////////////////////////// |
317 | 316 |
318 struct DistanceFieldNoGammaBatchTracker { | 317 struct DistanceFieldPathBatchTracker { |
319 GrGPInput fInputColorType; | 318 GrGPInput fInputColorType; |
320 GrColor fColor; | 319 GrColor fColor; |
321 bool fUsesLocalCoords; | 320 bool fUsesLocalCoords; |
322 }; | 321 }; |
323 | 322 |
324 class GrGLDistanceFieldNoGammaTextureEffect : public GrGLGeometryProcessor { | 323 class GrGLDistanceFieldPathGeoProc : public GrGLGeometryProcessor { |
325 public: | 324 public: |
326 GrGLDistanceFieldNoGammaTextureEffect(const GrGeometryProcessor&, | 325 GrGLDistanceFieldPathGeoProc(const GrGeometryProcessor&, |
327 const GrBatchTracker&) | 326 const GrBatchTracker&) |
328 : fColor(GrColor_ILLEGAL), fTextureSize(SkISize::Make(-1, -1)) {} | 327 : fColor(GrColor_ILLEGAL), fTextureSize(SkISize::Make(-1, -1)) {} |
329 | 328 |
330 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 329 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
331 const GrDistanceFieldNoGammaTextureEffect& dfTexEffect = | 330 const GrDistanceFieldPathGeoProc& dfTexEffect = args.fGP.cast<GrDistance
FieldPathGeoProc>(); |
332 args.fGP.cast<GrDistanceFieldNoGammaTextureEffect>(); | |
333 | 331 |
334 const DistanceFieldNoGammaBatchTracker& local = | 332 const DistanceFieldPathBatchTracker& local = args.fBT.cast<DistanceField
PathBatchTracker>(); |
335 args.fBT.cast<DistanceFieldNoGammaBatchTracker>(); | |
336 GrGLGPBuilder* pb = args.fPB; | 333 GrGLGPBuilder* pb = args.fPB; |
337 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 334 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
338 SkAssertResult(fsBuilder->enableFeature( | 335 SkAssertResult(fsBuilder->enableFeature( |
339 GrGLFragmentShaderBuilder::kStandardDerivat
ives_GLSLFeature)); | 336 GrGLFragmentShaderBuilder::kStandardDerivat
ives_GLSLFeature)); |
340 | 337 |
341 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 338 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
342 | 339 |
343 // emit attributes | 340 // emit attributes |
344 vsBuilder->emitAttributes(dfTexEffect); | 341 vsBuilder->emitAttributes(dfTexEffect); |
345 | 342 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 if (texture->width() != fTextureSize.width() || | 421 if (texture->width() != fTextureSize.width() || |
425 texture->height() != fTextureSize.height()) { | 422 texture->height() != fTextureSize.height()) { |
426 fTextureSize = SkISize::Make(texture->width(), texture->height()); | 423 fTextureSize = SkISize::Make(texture->width(), texture->height()); |
427 pdman.set2f(fTextureSizeUni, | 424 pdman.set2f(fTextureSizeUni, |
428 SkIntToScalar(fTextureSize.width()), | 425 SkIntToScalar(fTextureSize.width()), |
429 SkIntToScalar(fTextureSize.height())); | 426 SkIntToScalar(fTextureSize.height())); |
430 } | 427 } |
431 | 428 |
432 this->setUniformViewMatrix(pdman, proc.viewMatrix()); | 429 this->setUniformViewMatrix(pdman, proc.viewMatrix()); |
433 | 430 |
434 const DistanceFieldNoGammaBatchTracker& local = bt.cast<DistanceFieldNoG
ammaBatchTracker>(); | 431 const DistanceFieldPathBatchTracker& local = bt.cast<DistanceFieldPathBa
tchTracker>(); |
435 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo
r) { | 432 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo
r) { |
436 GrGLfloat c[4]; | 433 GrGLfloat c[4]; |
437 GrColorToRGBAFloat(local.fColor, c); | 434 GrColorToRGBAFloat(local.fColor, c); |
438 pdman.set4fv(fColorUniform, 1, c); | 435 pdman.set4fv(fColorUniform, 1, c); |
439 fColor = local.fColor; | 436 fColor = local.fColor; |
440 } | 437 } |
441 } | 438 } |
442 | 439 |
443 static inline void GenKey(const GrGeometryProcessor& gp, | 440 static inline void GenKey(const GrGeometryProcessor& gp, |
444 const GrBatchTracker& bt, | 441 const GrBatchTracker& bt, |
445 const GrGLCaps&, | 442 const GrGLCaps&, |
446 GrProcessorKeyBuilder* b) { | 443 GrProcessorKeyBuilder* b) { |
447 const GrDistanceFieldNoGammaTextureEffect& dfTexEffect = | 444 const GrDistanceFieldPathGeoProc& dfTexEffect = gp.cast<GrDistanceFieldP
athGeoProc>(); |
448 gp.cast<GrDistanceFieldNoGammaTextureEffect>(); | |
449 | 445 |
450 const DistanceFieldNoGammaBatchTracker& local = bt.cast<DistanceFieldNoG
ammaBatchTracker>(); | 446 const DistanceFieldPathBatchTracker& local = bt.cast<DistanceFieldPathBa
tchTracker>(); |
451 uint32_t key = dfTexEffect.getFlags(); | 447 uint32_t key = dfTexEffect.getFlags(); |
452 key |= local.fInputColorType << 16; | 448 key |= local.fInputColorType << 16; |
453 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1
<< 24: 0x0; | 449 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1
<< 24: 0x0; |
454 key |= ComputePosKey(gp.viewMatrix()) << 25; | 450 key |= ComputePosKey(gp.viewMatrix()) << 25; |
455 b->add32(key); | 451 b->add32(key); |
456 } | 452 } |
457 | 453 |
458 private: | 454 private: |
459 UniformHandle fColorUniform; | 455 UniformHandle fColorUniform; |
460 UniformHandle fTextureSizeUni; | 456 UniformHandle fTextureSizeUni; |
461 GrColor fColor; | 457 GrColor fColor; |
462 SkISize fTextureSize; | 458 SkISize fTextureSize; |
463 | 459 |
464 typedef GrGLGeometryProcessor INHERITED; | 460 typedef GrGLGeometryProcessor INHERITED; |
465 }; | 461 }; |
466 | 462 |
467 /////////////////////////////////////////////////////////////////////////////// | 463 /////////////////////////////////////////////////////////////////////////////// |
468 | 464 |
469 GrDistanceFieldNoGammaTextureEffect::GrDistanceFieldNoGammaTextureEffect( | 465 GrDistanceFieldPathGeoProc::GrDistanceFieldPathGeoProc( |
470 GrColor color, | 466 GrColor color, |
471 const SkMatrix& viewMatrix, | 467 const SkMatrix& viewMatrix, |
472 GrTexture* texture, | 468 GrTexture* texture, |
473 const GrTextureParams& params, | 469 const GrTextureParams& params, |
474 uint32_t flags, | 470 uint32_t flags, |
475 bool opaqueVertexColors) | 471 bool opaqueVertexColors) |
476 : INHERITED(color, viewMatrix, SkMatrix::I(), opaqueVertexColors) | 472 : INHERITED(color, viewMatrix, SkMatrix::I(), opaqueVertexColors) |
477 , fTextureAccess(texture, params) | 473 , fTextureAccess(texture, params) |
478 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) | 474 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) |
479 , fInColor(NULL) { | 475 , fInColor(NULL) { |
480 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); | 476 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); |
481 this->initClassID<GrDistanceFieldNoGammaTextureEffect>(); | 477 this->initClassID<GrDistanceFieldPathGeoProc>(); |
482 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); | 478 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); |
483 if (flags & kColorAttr_DistanceFieldEffectFlag) { | 479 if (flags & kColorAttr_DistanceFieldEffectFlag) { |
484 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); | 480 fInColor = &this->addVertexAttrib(Attribute("inColor", kVec4ub_GrVertexA
ttribType)); |
485 this->setHasVertexColor(); | 481 this->setHasVertexColor(); |
486 } | 482 } |
487 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 483 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
488 kVec2f_GrVertexAttribT
ype)); | 484 kVec2f_GrVertexAttribT
ype)); |
489 this->addTextureAccess(&fTextureAccess); | 485 this->addTextureAccess(&fTextureAccess); |
490 } | 486 } |
491 | 487 |
492 bool GrDistanceFieldNoGammaTextureEffect::onIsEqual(const GrGeometryProcessor& o
ther) const { | 488 bool GrDistanceFieldPathGeoProc::onIsEqual(const GrGeometryProcessor& other) con
st { |
493 const GrDistanceFieldNoGammaTextureEffect& cte = | 489 const GrDistanceFieldPathGeoProc& cte = other.cast<GrDistanceFieldPathGeoPro
c>(); |
494 other.cast<GrDistanceFieldNoGam
maTextureEffect>(); | |
495 return fFlags == cte.fFlags; | 490 return fFlags == cte.fFlags; |
496 } | 491 } |
497 | 492 |
498 void GrDistanceFieldNoGammaTextureEffect::onGetInvariantOutputCoverage(GrInitInv
ariantOutput* out) | 493 void GrDistanceFieldPathGeoProc::onGetInvariantOutputCoverage(GrInitInvariantOut
put* out) const { |
499
const { | |
500 out->setUnknownSingleComponent(); | 494 out->setUnknownSingleComponent(); |
501 } | 495 } |
502 | 496 |
503 void GrDistanceFieldNoGammaTextureEffect::getGLProcessorKey(const GrBatchTracker
& bt, | 497 void GrDistanceFieldPathGeoProc::getGLProcessorKey(const GrBatchTracker& bt, |
504 const GrGLCaps& caps
, | 498 const GrGLCaps& caps, |
505 GrProcessorKeyBuilde
r* b) const { | 499 GrProcessorKeyBuilder* b) con
st { |
506 GrGLDistanceFieldNoGammaTextureEffect::GenKey(*this, bt, caps, b); | 500 GrGLDistanceFieldPathGeoProc::GenKey(*this, bt, caps, b); |
507 } | 501 } |
508 | 502 |
509 GrGLPrimitiveProcessor* | 503 GrGLPrimitiveProcessor* |
510 GrDistanceFieldNoGammaTextureEffect::createGLInstance(const GrBatchTracker& bt, | 504 GrDistanceFieldPathGeoProc::createGLInstance(const GrBatchTracker& bt, const GrG
LCaps&) const { |
511 const GrGLCaps&) const { | 505 return SkNEW_ARGS(GrGLDistanceFieldPathGeoProc, (*this, bt)); |
512 return SkNEW_ARGS(GrGLDistanceFieldNoGammaTextureEffect, (*this, bt)); | |
513 } | 506 } |
514 | 507 |
515 void GrDistanceFieldNoGammaTextureEffect::initBatchTracker(GrBatchTracker* bt, | 508 void GrDistanceFieldPathGeoProc::initBatchTracker(GrBatchTracker* bt, |
516 const GrPipelineInfo&
init) const { | 509 const GrPipelineInfo& init) co
nst { |
517 DistanceFieldNoGammaBatchTracker* local = bt->cast<DistanceFieldNoGammaBatch
Tracker>(); | 510 DistanceFieldPathBatchTracker* local = bt->cast<DistanceFieldPathBatchTracke
r>(); |
518 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in
it, | 511 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in
it, |
519 SkToBool(fInColor)); | 512 SkToBool(fInColor)); |
520 local->fUsesLocalCoords = init.fUsesLocalCoords; | 513 local->fUsesLocalCoords = init.fUsesLocalCoords; |
521 } | 514 } |
522 | 515 |
523 bool GrDistanceFieldNoGammaTextureEffect::onCanMakeEqual(const GrBatchTracker& m
, | 516 bool GrDistanceFieldPathGeoProc::onCanMakeEqual(const GrBatchTracker& m, |
524 const GrGeometryProcess
or& that, | 517 const GrGeometryProcessor& that, |
525 const GrBatchTracker& t
) const { | 518 const GrBatchTracker& t) const { |
526 const DistanceFieldNoGammaBatchTracker& mine = m.cast<DistanceFieldNoGammaBa
tchTracker>(); | 519 const DistanceFieldPathBatchTracker& mine = m.cast<DistanceFieldPathBatchTra
cker>(); |
527 const DistanceFieldNoGammaBatchTracker& theirs = t.cast<DistanceFieldNoGamma
BatchTracker>(); | 520 const DistanceFieldPathBatchTracker& theirs = t.cast<DistanceFieldPathBatchT
racker>(); |
528 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, | 521 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, |
529 that, theirs.fUsesLocalCoords) && | 522 that, theirs.fUsesLocalCoords) && |
530 CanCombineOutput(mine.fInputColorType, mine.fColor, | 523 CanCombineOutput(mine.fInputColorType, mine.fColor, |
531 theirs.fInputColorType, theirs.fColor); | 524 theirs.fInputColorType, theirs.fColor); |
532 } | 525 } |
533 | 526 |
534 /////////////////////////////////////////////////////////////////////////////// | 527 /////////////////////////////////////////////////////////////////////////////// |
535 | 528 |
536 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldNoGammaTextureEffect); | 529 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldPathGeoProc); |
537 | 530 |
538 GrGeometryProcessor* GrDistanceFieldNoGammaTextureEffect::TestCreate(SkRandom* r
andom, | 531 GrGeometryProcessor* GrDistanceFieldPathGeoProc::TestCreate(SkRandom* random, |
539 GrContext*, | 532 GrContext*, |
540 const GrDra
wTargetCaps&, | 533 const GrDrawTargetCa
ps&, |
541 GrTexture*
textures[]) { | 534 GrTexture* textures[
]) { |
542 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx | 535 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx |
543 : GrProcessorUnitTest::kAlphaTextureIdx; | 536 : GrProcessorUnitTest::kAlphaTextureIdx; |
544 static const SkShader::TileMode kTileModes[] = { | 537 static const SkShader::TileMode kTileModes[] = { |
545 SkShader::kClamp_TileMode, | 538 SkShader::kClamp_TileMode, |
546 SkShader::kRepeat_TileMode, | 539 SkShader::kRepeat_TileMode, |
547 SkShader::kMirror_TileMode, | 540 SkShader::kMirror_TileMode, |
548 }; | 541 }; |
549 SkShader::TileMode tileModes[] = { | 542 SkShader::TileMode tileModes[] = { |
550 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], | 543 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], |
551 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], | 544 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], |
552 }; | 545 }; |
553 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil
erp_FilterMode | 546 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil
erp_FilterMode |
554 : GrTextureParams::kNon
e_FilterMode); | 547 : GrTextureParams::kNon
e_FilterMode); |
555 | 548 |
556 return GrDistanceFieldNoGammaTextureEffect::Create(GrRandomColor(random), | 549 return GrDistanceFieldPathGeoProc::Create(GrRandomColor(random), |
557 GrProcessorUnitTest::Test
Matrix(random), | 550 GrProcessorUnitTest::TestMatrix(ra
ndom), |
558 textures[texIdx], | 551 textures[texIdx], |
559 params, | 552 params, |
560 random->nextBool() ? kSimilarity_DistanceFieldEffectFlag : 0, random->ne
xtBool()); | 553 random->nextBool() ? kSimilarity_DistanceFieldEffectFlag : 0, random->ne
xtBool()); |
561 } | 554 } |
562 | 555 |
563 /////////////////////////////////////////////////////////////////////////////// | 556 /////////////////////////////////////////////////////////////////////////////// |
564 | 557 |
565 struct DistanceFieldLCDBatchTracker { | 558 struct DistanceFieldLCDBatchTracker { |
566 GrGPInput fInputColorType; | 559 GrGPInput fInputColorType; |
567 GrColor fColor; | 560 GrColor fColor; |
568 bool fUsesLocalCoords; | 561 bool fUsesLocalCoords; |
569 }; | 562 }; |
570 | 563 |
571 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor { | 564 class GrGLDistanceFieldLCDTextGeoProc : public GrGLGeometryProcessor { |
572 public: | 565 public: |
573 GrGLDistanceFieldLCDTextureEffect(const GrGeometryProcessor&, | 566 GrGLDistanceFieldLCDTextGeoProc(const GrGeometryProcessor&, const GrBatchTra
cker&) |
574 const GrBatchTracker&) | |
575 : fColor(GrColor_ILLEGAL) { | 567 : fColor(GrColor_ILLEGAL) { |
576 fDistanceAdjust = GrDistanceFieldLCDTextureEffect::DistanceAdjust::Make(
1.0f, 1.0f, 1.0f); | 568 fDistanceAdjust = GrDistanceFieldLCDTextGeoProc::DistanceAdjust::Make(1.
0f, 1.0f, 1.0f); |
577 } | 569 } |
578 | 570 |
579 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 571 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
580 const GrDistanceFieldLCDTextureEffect& dfTexEffect = | 572 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = |
581 args.fGP.cast<GrDistanceFieldLCDTextureEffect>(); | 573 args.fGP.cast<GrDistanceFieldLCDTextGeoProc>(); |
582 const DistanceFieldLCDBatchTracker& local = args.fBT.cast<DistanceFieldL
CDBatchTracker>(); | 574 const DistanceFieldLCDBatchTracker& local = args.fBT.cast<DistanceFieldL
CDBatchTracker>(); |
583 GrGLGPBuilder* pb = args.fPB; | 575 GrGLGPBuilder* pb = args.fPB; |
584 | 576 |
585 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 577 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
586 | 578 |
587 // emit attributes | 579 // emit attributes |
588 vsBuilder->emitAttributes(dfTexEffect); | 580 vsBuilder->emitAttributes(dfTexEffect); |
589 | 581 |
590 // setup pass through color | 582 // setup pass through color |
591 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor
, NULL, | 583 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor
, NULL, |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth),
distance), 1.0);"); | 714 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth),
distance), 1.0);"); |
723 | 715 |
724 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); | 716 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
725 } | 717 } |
726 | 718 |
727 virtual void setData(const GrGLProgramDataManager& pdman, | 719 virtual void setData(const GrGLProgramDataManager& pdman, |
728 const GrPrimitiveProcessor& processor, | 720 const GrPrimitiveProcessor& processor, |
729 const GrBatchTracker& bt) override { | 721 const GrBatchTracker& bt) override { |
730 SkASSERT(fDistanceAdjustUni.isValid()); | 722 SkASSERT(fDistanceAdjustUni.isValid()); |
731 | 723 |
732 const GrDistanceFieldLCDTextureEffect& dfTexEffect = | 724 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = |
733 processor.cast<GrDistanceFieldLCDTextureEffect>(); | 725 processor.cast<GrDistanceFieldLCDTextGeoProc>(); |
734 GrDistanceFieldLCDTextureEffect::DistanceAdjust wa = dfTexEffect.getDist
anceAdjust(); | 726 GrDistanceFieldLCDTextGeoProc::DistanceAdjust wa = dfTexEffect.getDistan
ceAdjust(); |
735 if (wa != fDistanceAdjust) { | 727 if (wa != fDistanceAdjust) { |
736 pdman.set3f(fDistanceAdjustUni, | 728 pdman.set3f(fDistanceAdjustUni, |
737 wa.fR, | 729 wa.fR, |
738 wa.fG, | 730 wa.fG, |
739 wa.fB); | 731 wa.fB); |
740 fDistanceAdjust = wa; | 732 fDistanceAdjust = wa; |
741 } | 733 } |
742 | 734 |
743 this->setUniformViewMatrix(pdman, processor.viewMatrix()); | 735 this->setUniformViewMatrix(pdman, processor.viewMatrix()); |
744 | 736 |
745 const DistanceFieldLCDBatchTracker& local = bt.cast<DistanceFieldLCDBatc
hTracker>(); | 737 const DistanceFieldLCDBatchTracker& local = bt.cast<DistanceFieldLCDBatc
hTracker>(); |
746 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo
r) { | 738 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo
r) { |
747 GrGLfloat c[4]; | 739 GrGLfloat c[4]; |
748 GrColorToRGBAFloat(local.fColor, c); | 740 GrColorToRGBAFloat(local.fColor, c); |
749 pdman.set4fv(fColorUniform, 1, c); | 741 pdman.set4fv(fColorUniform, 1, c); |
750 fColor = local.fColor; | 742 fColor = local.fColor; |
751 } | 743 } |
752 } | 744 } |
753 | 745 |
754 static inline void GenKey(const GrGeometryProcessor& gp, | 746 static inline void GenKey(const GrGeometryProcessor& gp, |
755 const GrBatchTracker& bt, | 747 const GrBatchTracker& bt, |
756 const GrGLCaps&, | 748 const GrGLCaps&, |
757 GrProcessorKeyBuilder* b) { | 749 GrProcessorKeyBuilder* b) { |
758 const GrDistanceFieldLCDTextureEffect& dfTexEffect = | 750 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie
ldLCDTextGeoProc>(); |
759 gp.cast<GrDistanceFieldLCDTextureEffect>(); | |
760 | 751 |
761 const DistanceFieldLCDBatchTracker& local = bt.cast<DistanceFieldLCDBatc
hTracker>(); | 752 const DistanceFieldLCDBatchTracker& local = bt.cast<DistanceFieldLCDBatc
hTracker>(); |
762 uint32_t key = dfTexEffect.getFlags(); | 753 uint32_t key = dfTexEffect.getFlags(); |
763 key |= local.fInputColorType << 16; | 754 key |= local.fInputColorType << 16; |
764 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1
<< 24: 0x0; | 755 key |= local.fUsesLocalCoords && gp.localMatrix().hasPerspective() ? 0x1
<< 24: 0x0; |
765 key |= ComputePosKey(gp.viewMatrix()) << 25; | 756 key |= ComputePosKey(gp.viewMatrix()) << 25; |
766 key |= (!gp.viewMatrix().isIdentity() && !gp.localMatrix().isIdentity())
? 0x1 << 27 : 0x0; | 757 key |= (!gp.viewMatrix().isIdentity() && !gp.localMatrix().isIdentity())
? 0x1 << 27 : 0x0; |
767 b->add32(key); | 758 b->add32(key); |
768 } | 759 } |
769 | 760 |
770 private: | 761 private: |
771 GrColor fColor; | 762 GrColor fColor; |
772 UniformHandle fColorUniform; | 763 UniformHandle fColorUniform; |
773 GrDistanceFieldLCDTextureEffect::DistanceAdjust fDistanceAdjust; | 764 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; |
774 UniformHandle fDistanceAdjustUni; | 765 UniformHandle fDistanceAdjustUni; |
775 | 766 |
776 typedef GrGLGeometryProcessor INHERITED; | 767 typedef GrGLGeometryProcessor INHERITED; |
777 }; | 768 }; |
778 | 769 |
779 /////////////////////////////////////////////////////////////////////////////// | 770 /////////////////////////////////////////////////////////////////////////////// |
780 | 771 |
781 GrDistanceFieldLCDTextureEffect::GrDistanceFieldLCDTextureEffect( | 772 GrDistanceFieldLCDTextGeoProc::GrDistanceFieldLCDTextGeoProc( |
782 GrColor color, const SkMatrix&
viewMatrix, | 773 GrColor color, const SkMatrix&
viewMatrix, |
783 const SkMatrix& localMatrix, | 774 const SkMatrix& localMatrix, |
784 GrTexture* texture, const GrTe
xtureParams& params, | 775 GrTexture* texture, const GrTe
xtureParams& params, |
785 DistanceAdjust distanceAdjust, | 776 DistanceAdjust distanceAdjust, |
786 uint32_t flags) | 777 uint32_t flags) |
787 : INHERITED(color, viewMatrix, localMatrix) | 778 : INHERITED(color, viewMatrix, localMatrix) |
788 , fTextureAccess(texture, params) | 779 , fTextureAccess(texture, params) |
789 , fDistanceAdjust(distanceAdjust) | 780 , fDistanceAdjust(distanceAdjust) |
790 , fFlags(flags & kLCD_DistanceFieldEffectMask){ | 781 , fFlags(flags & kLCD_DistanceFieldEffectMask){ |
791 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); | 782 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); |
792 this->initClassID<GrDistanceFieldLCDTextureEffect>(); | 783 this->initClassID<GrDistanceFieldLCDTextGeoProc>(); |
793 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); | 784 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertex
AttribType)); |
794 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", | 785 fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords", |
795 kVec2s_GrVertexAttribT
ype)); | 786 kVec2s_GrVertexAttribT
ype)); |
796 this->addTextureAccess(&fTextureAccess); | 787 this->addTextureAccess(&fTextureAccess); |
797 } | 788 } |
798 | 789 |
799 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrGeometryProcessor& other
) const { | 790 bool GrDistanceFieldLCDTextGeoProc::onIsEqual(const GrGeometryProcessor& other)
const { |
800 const GrDistanceFieldLCDTextureEffect& cte = other.cast<GrDistanceFieldLCDTe
xtureEffect>(); | 791 const GrDistanceFieldLCDTextGeoProc& cte = other.cast<GrDistanceFieldLCDText
GeoProc>(); |
801 return (fDistanceAdjust == cte.fDistanceAdjust && | 792 return (fDistanceAdjust == cte.fDistanceAdjust && |
802 fFlags == cte.fFlags); | 793 fFlags == cte.fFlags); |
803 } | 794 } |
804 | 795 |
805 void GrDistanceFieldLCDTextureEffect::onGetInvariantOutputCoverage(GrInitInvaria
ntOutput* out) | 796 void GrDistanceFieldLCDTextGeoProc::onGetInvariantOutputCoverage(GrInitInvariant
Output* out) const { |
806
const { | |
807 out->setUnknownFourComponents(); | 797 out->setUnknownFourComponents(); |
808 out->setUsingLCDCoverage(); | 798 out->setUsingLCDCoverage(); |
809 } | 799 } |
810 | 800 |
811 void GrDistanceFieldLCDTextureEffect::getGLProcessorKey(const GrBatchTracker& bt
, | 801 void GrDistanceFieldLCDTextGeoProc::getGLProcessorKey(const GrBatchTracker& bt, |
812 const GrGLCaps& caps, | 802 const GrGLCaps& caps, |
813 GrProcessorKeyBuilder* b
) const { | 803 GrProcessorKeyBuilder* b)
const { |
814 GrGLDistanceFieldLCDTextureEffect::GenKey(*this, bt, caps, b); | 804 GrGLDistanceFieldLCDTextGeoProc::GenKey(*this, bt, caps, b); |
815 } | 805 } |
816 | 806 |
817 GrGLPrimitiveProcessor* | 807 GrGLPrimitiveProcessor* |
818 GrDistanceFieldLCDTextureEffect::createGLInstance(const GrBatchTracker& bt, | 808 GrDistanceFieldLCDTextGeoProc::createGLInstance(const GrBatchTracker& bt, |
819 const GrGLCaps&) const { | 809 const GrGLCaps&) const { |
820 return SkNEW_ARGS(GrGLDistanceFieldLCDTextureEffect, (*this, bt)); | 810 return SkNEW_ARGS(GrGLDistanceFieldLCDTextGeoProc, (*this, bt)); |
821 } | 811 } |
822 | 812 |
823 void GrDistanceFieldLCDTextureEffect::initBatchTracker(GrBatchTracker* bt, | 813 void GrDistanceFieldLCDTextGeoProc::initBatchTracker(GrBatchTracker* bt, |
824 const GrPipelineInfo& ini
t) const { | 814 const GrPipelineInfo& init)
const { |
825 DistanceFieldLCDBatchTracker* local = bt->cast<DistanceFieldLCDBatchTracker>
(); | 815 DistanceFieldLCDBatchTracker* local = bt->cast<DistanceFieldLCDBatchTracker>
(); |
826 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in
it, false); | 816 local->fInputColorType = GetColorInputType(&local->fColor, this->color(), in
it, false); |
827 local->fUsesLocalCoords = init.fUsesLocalCoords; | 817 local->fUsesLocalCoords = init.fUsesLocalCoords; |
828 } | 818 } |
829 | 819 |
830 bool GrDistanceFieldLCDTextureEffect::onCanMakeEqual(const GrBatchTracker& m, | 820 bool GrDistanceFieldLCDTextGeoProc::onCanMakeEqual(const GrBatchTracker& m, |
831 const GrGeometryProcessor&
that, | 821 const GrGeometryProcessor& th
at, |
832 const GrBatchTracker& t) co
nst { | 822 const GrBatchTracker& t) cons
t { |
833 const DistanceFieldLCDBatchTracker& mine = m.cast<DistanceFieldLCDBatchTrack
er>(); | 823 const DistanceFieldLCDBatchTracker& mine = m.cast<DistanceFieldLCDBatchTrack
er>(); |
834 const DistanceFieldLCDBatchTracker& theirs = t.cast<DistanceFieldLCDBatchTra
cker>(); | 824 const DistanceFieldLCDBatchTracker& theirs = t.cast<DistanceFieldLCDBatchTra
cker>(); |
835 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, | 825 return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, |
836 that, theirs.fUsesLocalCoords) && | 826 that, theirs.fUsesLocalCoords) && |
837 CanCombineOutput(mine.fInputColorType, mine.fColor, | 827 CanCombineOutput(mine.fInputColorType, mine.fColor, |
838 theirs.fInputColorType, theirs.fColor); | 828 theirs.fInputColorType, theirs.fColor); |
839 } | 829 } |
840 | 830 |
841 /////////////////////////////////////////////////////////////////////////////// | 831 /////////////////////////////////////////////////////////////////////////////// |
842 | 832 |
843 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextureEffect); | 833 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextGeoProc); |
844 | 834 |
845 GrGeometryProcessor* GrDistanceFieldLCDTextureEffect::TestCreate(SkRandom* rando
m, | 835 GrGeometryProcessor* GrDistanceFieldLCDTextGeoProc::TestCreate(SkRandom* random, |
846 GrContext*, | 836 GrContext*, |
847 const GrDrawTar
getCaps&, | 837 const GrDrawTar
getCaps&, |
848 GrTexture* text
ures[]) { | 838 GrTexture* text
ures[]) { |
849 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : | 839 int texIdx = random->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx : |
850 GrProcessorUnitTest::kAlphaTextureIdx; | 840 GrProcessorUnitTest::kAlphaTextureIdx; |
851 static const SkShader::TileMode kTileModes[] = { | 841 static const SkShader::TileMode kTileModes[] = { |
852 SkShader::kClamp_TileMode, | 842 SkShader::kClamp_TileMode, |
853 SkShader::kRepeat_TileMode, | 843 SkShader::kRepeat_TileMode, |
854 SkShader::kMirror_TileMode, | 844 SkShader::kMirror_TileMode, |
855 }; | 845 }; |
856 SkShader::TileMode tileModes[] = { | 846 SkShader::TileMode tileModes[] = { |
857 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], | 847 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], |
858 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], | 848 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], |
859 }; | 849 }; |
860 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil
erp_FilterMode : | 850 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil
erp_FilterMode : |
861 GrTextureParams::kNone_FilterMode); | 851 GrTextureParams::kNone_FilterMode); |
862 DistanceAdjust wa = { 0.0f, 0.1f, -0.1f }; | 852 DistanceAdjust wa = { 0.0f, 0.1f, -0.1f }; |
863 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 853 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
864 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 854 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
865 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 855 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
866 return GrDistanceFieldLCDTextureEffect::Create(GrRandomColor(random), | 856 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(random), |
867 GrProcessorUnitTest::TestMatr
ix(random), | 857 GrProcessorUnitTest::TestMatrix
(random), |
868 GrProcessorUnitTest::TestMatr
ix(random), | 858 GrProcessorUnitTest::TestMatrix
(random), |
869 textures[texIdx], params, | 859 textures[texIdx], params, |
870 wa, | 860 wa, |
871 flags); | 861 flags); |
872 } | 862 } |
OLD | NEW |