| 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 |