OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 "SkColorCubeFilter.h" | 8 #include "SkColorCubeFilter.h" |
9 #include "SkColorPriv.h" | 9 #include "SkColorPriv.h" |
10 #include "SkOnce.h" | 10 #include "SkOnce.h" |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 int colorCubeSize() const { return fColorCubeAccess.getTexture()->width(); } | 201 int colorCubeSize() const { return fColorCubeAccess.getTexture()->width(); } |
202 | 202 |
203 | 203 |
204 void onComputeInvariantOutput(GrInvariantOutput*) const override; | 204 void onComputeInvariantOutput(GrInvariantOutput*) const override; |
205 | 205 |
206 class GLProcessor : public GrGLFragmentProcessor { | 206 class GLProcessor : public GrGLFragmentProcessor { |
207 public: | 207 public: |
208 GLProcessor(const GrProcessor&); | 208 GLProcessor(const GrProcessor&); |
209 virtual ~GLProcessor(); | 209 virtual ~GLProcessor(); |
210 | 210 |
211 virtual void emitCode(GrGLFPBuilder*, | 211 virtual void emitCode(EmitArgs&) override; |
212 const GrFragmentProcessor&, | |
213 const char* outputColor, | |
214 const char* inputColor, | |
215 const TransformedCoordsArray&, | |
216 const TextureSamplerArray&) override; | |
217 | 212 |
218 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProce
ssorKeyBuilder*); | 213 static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProce
ssorKeyBuilder*); |
219 | 214 |
220 void setData(const GrGLProgramDataManager&, const GrProcessor&) override
; | 215 void setData(const GrGLProgramDataManager&, const GrProcessor&) override
; |
221 | 216 |
222 private: | 217 private: |
223 GrGLProgramDataManager::UniformHandle fColorCubeSizeUni; | 218 GrGLProgramDataManager::UniformHandle fColorCubeSizeUni; |
224 GrGLProgramDataManager::UniformHandle fColorCubeInvSizeUni; | 219 GrGLProgramDataManager::UniformHandle fColorCubeInvSizeUni; |
225 | 220 |
226 typedef GrGLFragmentProcessor INHERITED; | 221 typedef GrGLFragmentProcessor INHERITED; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 } | 255 } |
261 | 256 |
262 /////////////////////////////////////////////////////////////////////////////// | 257 /////////////////////////////////////////////////////////////////////////////// |
263 | 258 |
264 GrColorCubeEffect::GLProcessor::GLProcessor(const GrProcessor&) { | 259 GrColorCubeEffect::GLProcessor::GLProcessor(const GrProcessor&) { |
265 } | 260 } |
266 | 261 |
267 GrColorCubeEffect::GLProcessor::~GLProcessor() { | 262 GrColorCubeEffect::GLProcessor::~GLProcessor() { |
268 } | 263 } |
269 | 264 |
270 void GrColorCubeEffect::GLProcessor::emitCode(GrGLFPBuilder* builder, | 265 void GrColorCubeEffect::GLProcessor::emitCode(EmitArgs& args) { |
271 const GrFragmentProcessor&, | 266 if (NULL == args.fInputColor) { |
272 const char* outputColor, | 267 args.fInputColor = "vec4(1)"; |
273 const char* inputColor, | |
274 const TransformedCoordsArray& coor
ds, | |
275 const TextureSamplerArray& sampler
s) { | |
276 if (NULL == inputColor) { | |
277 inputColor = "vec4(1)"; | |
278 } | 268 } |
279 | 269 |
280 fColorCubeSizeUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi
lity, | 270 fColorCubeSizeUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_
Visibility, |
281 kFloat_GrSLType, kDefault_GrSLPrecis
ion, | 271 kFloat_GrSLType, kDefault_GrSLPrecis
ion, |
282 "Size"); | 272 "Size"); |
283 const char* colorCubeSizeUni = builder->getUniformCStr(fColorCubeSizeUni); | 273 const char* colorCubeSizeUni = args.fBuilder->getUniformCStr(fColorCubeSizeU
ni); |
284 fColorCubeInvSizeUni = builder->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, | 274 fColorCubeInvSizeUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragme
nt_Visibility, |
285 kFloat_GrSLType, kDefault_GrSLPre
cision, | 275 kFloat_GrSLType, kDefault_GrSLPre
cision, |
286 "InvSize"); | 276 "InvSize"); |
287 const char* colorCubeInvSizeUni = builder->getUniformCStr(fColorCubeInvSizeU
ni); | 277 const char* colorCubeInvSizeUni = args.fBuilder->getUniformCStr(fColorCubeIn
vSizeUni); |
288 | 278 |
289 const char* nonZeroAlpha = "nonZeroAlpha"; | 279 const char* nonZeroAlpha = "nonZeroAlpha"; |
290 const char* unPMColor = "unPMColor"; | 280 const char* unPMColor = "unPMColor"; |
291 const char* cubeIdx = "cubeIdx"; | 281 const char* cubeIdx = "cubeIdx"; |
292 const char* cCoords1 = "cCoords1"; | 282 const char* cCoords1 = "cCoords1"; |
293 const char* cCoords2 = "cCoords2"; | 283 const char* cCoords2 = "cCoords2"; |
294 | 284 |
295 // Note: if implemented using texture3D in OpenGL ES older than OpenGL ES 3.
0, | 285 // Note: if implemented using texture3D in OpenGL ES older than OpenGL ES 3.
0, |
296 // the shader might need "#extension GL_OES_texture_3D : enable". | 286 // the shader might need "#extension GL_OES_texture_3D : enable". |
297 | 287 |
298 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 288 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); |
299 | 289 |
300 // Unpremultiply color | 290 // Unpremultiply color |
301 fsBuilder->codeAppendf("\tfloat %s = max(%s.a, 0.00001);\n", nonZeroAlpha, i
nputColor); | 291 fsBuilder->codeAppendf("\tfloat %s = max(%s.a, 0.00001);\n", nonZeroAlpha, a
rgs.fInputColor); |
302 fsBuilder->codeAppendf("\tvec4 %s = vec4(%s.rgb / %s, %s);\n", | 292 fsBuilder->codeAppendf("\tvec4 %s = vec4(%s.rgb / %s, %s);\n", |
303 unPMColor, inputColor, nonZeroAlpha, nonZeroAlpha); | 293 unPMColor, args.fInputColor, nonZeroAlpha, nonZeroAlp
ha); |
304 | 294 |
305 // Fit input color into the cube. | 295 // Fit input color into the cube. |
306 fsBuilder->codeAppendf( | 296 fsBuilder->codeAppendf( |
307 "vec3 %s = vec3(%s.rg * vec2((%s - 1.0) * %s) + vec2(0.5 * %s), %s.b * (
%s - 1.0));\n", | 297 "vec3 %s = vec3(%s.rg * vec2((%s - 1.0) * %s) + vec2(0.5 * %s), %s.b * (
%s - 1.0));\n", |
308 cubeIdx, unPMColor, colorCubeSizeUni, colorCubeInvSizeUni, colorCubeInvS
izeUni, | 298 cubeIdx, unPMColor, colorCubeSizeUni, colorCubeInvSizeUni, colorCubeInvS
izeUni, |
309 unPMColor, colorCubeSizeUni); | 299 unPMColor, colorCubeSizeUni); |
310 | 300 |
311 // Compute y coord for for texture fetches. | 301 // Compute y coord for for texture fetches. |
312 fsBuilder->codeAppendf("vec2 %s = vec2(%s.r, (floor(%s.b) + %s.g) * %s);\n", | 302 fsBuilder->codeAppendf("vec2 %s = vec2(%s.r, (floor(%s.b) + %s.g) * %s);\n", |
313 cCoords1, cubeIdx, cubeIdx, cubeIdx, colorCubeInvSize
Uni); | 303 cCoords1, cubeIdx, cubeIdx, cubeIdx, colorCubeInvSize
Uni); |
314 fsBuilder->codeAppendf("vec2 %s = vec2(%s.r, (ceil(%s.b) + %s.g) * %s);\n", | 304 fsBuilder->codeAppendf("vec2 %s = vec2(%s.r, (ceil(%s.b) + %s.g) * %s);\n", |
315 cCoords2, cubeIdx, cubeIdx, cubeIdx, colorCubeInvSize
Uni); | 305 cCoords2, cubeIdx, cubeIdx, cubeIdx, colorCubeInvSize
Uni); |
316 | 306 |
317 // Apply the cube. | 307 // Apply the cube. |
318 fsBuilder->codeAppendf("%s = vec4(mix(", outputColor); | 308 fsBuilder->codeAppendf("%s = vec4(mix(", args.fOutputColor); |
319 fsBuilder->appendTextureLookup(samplers[0], cCoords1); | 309 fsBuilder->appendTextureLookup(args.fSamplers[0], cCoords1); |
320 fsBuilder->codeAppend(".rgb, "); | 310 fsBuilder->codeAppend(".rgb, "); |
321 fsBuilder->appendTextureLookup(samplers[0], cCoords2); | 311 fsBuilder->appendTextureLookup(args.fSamplers[0], cCoords2); |
322 | 312 |
323 // Premultiply color by alpha. Note that the input alpha is not modified by
this shader. | 313 // Premultiply color by alpha. Note that the input alpha is not modified by
this shader. |
324 fsBuilder->codeAppendf(".rgb, fract(%s.b)) * vec3(%s), %s.a);\n", | 314 fsBuilder->codeAppendf(".rgb, fract(%s.b)) * vec3(%s), %s.a);\n", |
325 cubeIdx, nonZeroAlpha, inputColor); | 315 cubeIdx, nonZeroAlpha, args.fInputColor); |
326 } | 316 } |
327 | 317 |
328 void GrColorCubeEffect::GLProcessor::setData(const GrGLProgramDataManager& pdman
, | 318 void GrColorCubeEffect::GLProcessor::setData(const GrGLProgramDataManager& pdman
, |
329 const GrProcessor& proc) { | 319 const GrProcessor& proc) { |
330 const GrColorCubeEffect& colorCube = proc.cast<GrColorCubeEffect>(); | 320 const GrColorCubeEffect& colorCube = proc.cast<GrColorCubeEffect>(); |
331 SkScalar size = SkIntToScalar(colorCube.colorCubeSize()); | 321 SkScalar size = SkIntToScalar(colorCube.colorCubeSize()); |
332 pdman.set1f(fColorCubeSizeUni, SkScalarToFloat(size)); | 322 pdman.set1f(fColorCubeSizeUni, SkScalarToFloat(size)); |
333 pdman.set1f(fColorCubeInvSizeUni, SkScalarToFloat(SkScalarInvert(size))); | 323 pdman.set1f(fColorCubeInvSizeUni, SkScalarToFloat(SkScalarInvert(size))); |
334 } | 324 } |
335 | 325 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 *array->append() = frag; | 357 *array->append() = frag; |
368 } else { | 358 } else { |
369 frag->unref(); | 359 frag->unref(); |
370 SkDEBUGCODE(frag = NULL;) | 360 SkDEBUGCODE(frag = NULL;) |
371 } | 361 } |
372 return true; | 362 return true; |
373 } | 363 } |
374 return false; | 364 return false; |
375 } | 365 } |
376 #endif | 366 #endif |
OLD | NEW |