| 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 "SkDisplacementMapEffect.h" | 8 #include "SkDisplacementMapEffect.h" |
| 9 #include "SkFlattenableBuffers.h" | 9 #include "SkFlattenableBuffers.h" |
| 10 #include "SkUnPreMultiply.h" | 10 #include "SkUnPreMultiply.h" |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 kVec2f_GrSLType, "Scale"); | 402 kVec2f_GrSLType, "Scale"); |
| 403 const char* scaleUni = builder->getUniformCStr(fScaleUni); | 403 const char* scaleUni = builder->getUniformCStr(fScaleUni); |
| 404 | 404 |
| 405 const char* dCoordsIn; | 405 const char* dCoordsIn; |
| 406 GrSLType dCoordsType = fDisplacementEffectMatrix.emitCode( | 406 GrSLType dCoordsType = fDisplacementEffectMatrix.emitCode( |
| 407 builder, key, vertexCoords, &dCoordsIn, NULL, "D
ISPL"); | 407 builder, key, vertexCoords, &dCoordsIn, NULL, "D
ISPL"); |
| 408 const char* cCoordsIn; | 408 const char* cCoordsIn; |
| 409 GrSLType cCoordsType = fColorEffectMatrix.emitCode( | 409 GrSLType cCoordsType = fColorEffectMatrix.emitCode( |
| 410 builder, key, vertexCoords, &cCoordsIn, NULL, "C
OLOR"); | 410 builder, key, vertexCoords, &cCoordsIn, NULL, "C
OLOR"); |
| 411 | 411 |
| 412 SkString* code = &builder->fFSCode; | |
| 413 const char* dColor = "dColor"; | 412 const char* dColor = "dColor"; |
| 414 const char* cCoords = "cCoords"; | 413 const char* cCoords = "cCoords"; |
| 415 const char* nearZero = "1e-6"; // Since 6.10352e−5 is the smallest half floa
t, use | 414 const char* nearZero = "1e-6"; // Since 6.10352e−5 is the smallest half floa
t, use |
| 416 // a number smaller than that to approximate
0, but | 415 // a number smaller than that to approximate
0, but |
| 417 // leave room for 32-bit float GPU rounding e
rrors. | 416 // leave room for 32-bit float GPU rounding e
rrors. |
| 418 | 417 |
| 419 code->appendf("\t\tvec4 %s = ", dColor); | 418 builder->fsCodeAppendf("\t\tvec4 %s = ", dColor); |
| 420 builder->appendTextureLookup(code, samplers[0], dCoordsIn, dCoordsType); | 419 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, |
| 421 code->append(";\n"); | 420 samplers[0], |
| 421 dCoordsIn, |
| 422 dCoordsType); |
| 423 builder->fsCodeAppend(";\n"); |
| 422 | 424 |
| 423 // Unpremultiply the displacement | 425 // Unpremultiply the displacement |
| 424 code->appendf("\t\t%s.rgb = (%s.a < %s) ? vec3(0.0) : clamp(%s.rgb / %s.a, 0
.0, 1.0);", | 426 builder->fsCodeAppendf("\t\t%s.rgb = (%s.a < %s) ? vec3(0.0) : clamp(%s.rgb
/ %s.a, 0.0, 1.0);", |
| 425 dColor, dColor, nearZero, dColor, dColor); | 427 dColor, dColor, nearZero, dColor, dColor); |
| 426 | 428 |
| 427 code->appendf("\t\tvec2 %s = %s + %s*(%s.", | 429 builder->fsCodeAppendf("\t\tvec2 %s = %s + %s*(%s.", |
| 428 cCoords, cCoordsIn, scaleUni, dColor); | 430 cCoords, cCoordsIn, scaleUni, dColor); |
| 429 | 431 |
| 430 switch (fXChannelSelector) { | 432 switch (fXChannelSelector) { |
| 431 case SkDisplacementMapEffect::kR_ChannelSelectorType: | 433 case SkDisplacementMapEffect::kR_ChannelSelectorType: |
| 432 code->append("r"); | 434 builder->fsCodeAppend("r"); |
| 433 break; | 435 break; |
| 434 case SkDisplacementMapEffect::kG_ChannelSelectorType: | 436 case SkDisplacementMapEffect::kG_ChannelSelectorType: |
| 435 code->append("g"); | 437 builder->fsCodeAppend("g"); |
| 436 break; | 438 break; |
| 437 case SkDisplacementMapEffect::kB_ChannelSelectorType: | 439 case SkDisplacementMapEffect::kB_ChannelSelectorType: |
| 438 code->append("b"); | 440 builder->fsCodeAppend("b"); |
| 439 break; | 441 break; |
| 440 case SkDisplacementMapEffect::kA_ChannelSelectorType: | 442 case SkDisplacementMapEffect::kA_ChannelSelectorType: |
| 441 code->append("a"); | 443 builder->fsCodeAppend("a"); |
| 442 break; | 444 break; |
| 443 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: | 445 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: |
| 444 default: | 446 default: |
| 445 SkASSERT(!"Unknown X channel selector"); | 447 SkASSERT(!"Unknown X channel selector"); |
| 446 } | 448 } |
| 447 | 449 |
| 448 switch (fYChannelSelector) { | 450 switch (fYChannelSelector) { |
| 449 case SkDisplacementMapEffect::kR_ChannelSelectorType: | 451 case SkDisplacementMapEffect::kR_ChannelSelectorType: |
| 450 code->append("r"); | 452 builder->fsCodeAppend("r"); |
| 451 break; | 453 break; |
| 452 case SkDisplacementMapEffect::kG_ChannelSelectorType: | 454 case SkDisplacementMapEffect::kG_ChannelSelectorType: |
| 453 code->append("g"); | 455 builder->fsCodeAppend("g"); |
| 454 break; | 456 break; |
| 455 case SkDisplacementMapEffect::kB_ChannelSelectorType: | 457 case SkDisplacementMapEffect::kB_ChannelSelectorType: |
| 456 code->append("b"); | 458 builder->fsCodeAppend("b"); |
| 457 break; | 459 break; |
| 458 case SkDisplacementMapEffect::kA_ChannelSelectorType: | 460 case SkDisplacementMapEffect::kA_ChannelSelectorType: |
| 459 code->append("a"); | 461 builder->fsCodeAppend("a"); |
| 460 break; | 462 break; |
| 461 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: | 463 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: |
| 462 default: | 464 default: |
| 463 SkASSERT(!"Unknown Y channel selector"); | 465 SkASSERT(!"Unknown Y channel selector"); |
| 464 } | 466 } |
| 465 code->append("-vec2(0.5));\t\t"); | 467 builder->fsCodeAppend("-vec2(0.5));\t\t"); |
| 466 | 468 |
| 467 // FIXME : This can be achieved with a "clamp to border" texture repeat mode
and | 469 // FIXME : This can be achieved with a "clamp to border" texture repeat mode
and |
| 468 // a 0 border color instead of computing if cCoords is out of bounds
here. | 470 // a 0 border color instead of computing if cCoords is out of bounds
here. |
| 469 code->appendf( | 471 builder->fsCodeAppendf( |
| 470 "%s = any(greaterThan(vec4(vec2(0.0), %s), vec4(%s, vec2(1.0)))) ? vec4(
0.0) : ", | 472 "%s = any(greaterThan(vec4(vec2(0.0), %s), vec4(%s, vec2(1.0)))) ? vec4(
0.0) : ", |
| 471 outputColor, cCoords, cCoords); | 473 outputColor, cCoords, cCoords); |
| 472 builder->appendTextureLookup(code, samplers[1], cCoords, cCoordsType); | 474 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, |
| 473 code->append(";\n"); | 475 samplers[1], |
| 476 cCoords, |
| 477 cCoordsType); |
| 478 builder->fsCodeAppend(";\n"); |
| 474 } | 479 } |
| 475 | 480 |
| 476 void GrGLDisplacementMapEffect::setData(const GrGLUniformManager& uman, const Gr
EffectStage& stage) { | 481 void GrGLDisplacementMapEffect::setData(const GrGLUniformManager& uman, const Gr
EffectStage& stage) { |
| 477 const GrDisplacementMapEffect& displacementMap = GetEffectFromStage<GrDispla
cementMapEffect>(stage); | 482 const GrDisplacementMapEffect& displacementMap = GetEffectFromStage<GrDispla
cementMapEffect>(stage); |
| 478 GrTexture* displTex = displacementMap.texture(0); | 483 GrTexture* displTex = displacementMap.texture(0); |
| 479 GrTexture* colorTex = displacementMap.texture(1); | 484 GrTexture* colorTex = displacementMap.texture(1); |
| 480 fDisplacementEffectMatrix.setData(uman, | 485 fDisplacementEffectMatrix.setData(uman, |
| 481 GrEffect::MakeDivByTextureWHMatrix(displTex
), | 486 GrEffect::MakeDivByTextureWHMatrix(displTex
), |
| 482 stage.getCoordChangeMatrix(), | 487 stage.getCoordChangeMatrix(), |
| 483 displTex); | 488 displTex); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 509 colorTex); | 514 colorTex); |
| 510 | 515 |
| 511 colorKey <<= GrGLEffectMatrix::kKeyBits; | 516 colorKey <<= GrGLEffectMatrix::kKeyBits; |
| 512 EffectKey xKey = displacementMap.xChannelSelector() << (2 * GrGLEffectMatrix
::kKeyBits); | 517 EffectKey xKey = displacementMap.xChannelSelector() << (2 * GrGLEffectMatrix
::kKeyBits); |
| 513 EffectKey yKey = displacementMap.yChannelSelector() << (2 * GrGLEffectMatrix
::kKeyBits + | 518 EffectKey yKey = displacementMap.yChannelSelector() << (2 * GrGLEffectMatrix
::kKeyBits + |
| 514 SkDisplacementMapEff
ect::kKeyBits); | 519 SkDisplacementMapEff
ect::kKeyBits); |
| 515 | 520 |
| 516 return xKey | yKey | displKey | colorKey; | 521 return xKey | yKey | displKey | colorKey; |
| 517 } | 522 } |
| 518 #endif | 523 #endif |
| OLD | NEW |