| 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" |
| 11 #include "SkColorPriv.h" | 11 #include "SkColorPriv.h" |
| 12 #if SK_SUPPORT_GPU | 12 #if SK_SUPPORT_GPU |
| 13 #include "GrContext.h" | 13 #include "GrContext.h" |
| 14 #include "gl/GrGLEffect.h" | 14 #include "gl/GrGLEffect.h" |
| 15 #include "gl/GrGLEffectMatrix.h" | 15 #include "gl/GrGLEffectMatrix.h" |
| 16 #include "GrTBackendEffectFactory.h" | 16 #include "GrTBackendEffectFactory.h" |
| 17 #include "SkImageFilterUtils.h" | 17 #include "SkImageFilterUtils.h" |
| 18 #endif | 18 #endif |
| 19 | 19 |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 template<SkDisplacementMapEffect::ChannelSelectorType type> | 22 template<SkDisplacementMapEffect::ChannelSelectorType type> |
| 23 uint32_t getValue(SkColor, const SkUnPreMultiply::Scale*) { | 23 uint32_t getValue(SkColor, const SkUnPreMultiply::Scale*) { |
| 24 SkASSERT(!"Unknown channel selector"); | 24 SkDEBUGFAIL("Unknown channel selector"); |
| 25 return 0; | 25 return 0; |
| 26 } | 26 } |
| 27 | 27 |
| 28 template<> uint32_t getValue<SkDisplacementMapEffect::kR_ChannelSelectorType>( | 28 template<> uint32_t getValue<SkDisplacementMapEffect::kR_ChannelSelectorType>( |
| 29 SkColor l, const SkUnPreMultiply::Scale* table) { | 29 SkColor l, const SkUnPreMultiply::Scale* table) { |
| 30 return SkUnPreMultiply::ApplyScale(table[SkGetPackedA32(l)], SkGetPackedR32(
l)); | 30 return SkUnPreMultiply::ApplyScale(table[SkGetPackedA32(l)], SkGetPackedR32(
l)); |
| 31 } | 31 } |
| 32 | 32 |
| 33 template<> uint32_t getValue<SkDisplacementMapEffect::kG_ChannelSelectorType>( | 33 template<> uint32_t getValue<SkDisplacementMapEffect::kG_ChannelSelectorType>( |
| 34 SkColor l, const SkUnPreMultiply::Scale* table) { | 34 SkColor l, const SkUnPreMultiply::Scale* table) { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 case SkDisplacementMapEffect::kB_ChannelSelectorType: | 90 case SkDisplacementMapEffect::kB_ChannelSelectorType: |
| 91 computeDisplacement<typeX, SkDisplacementMapEffect::kB_ChannelSelectorTy
pe>( | 91 computeDisplacement<typeX, SkDisplacementMapEffect::kB_ChannelSelectorTy
pe>( |
| 92 scale, dst, displ, src); | 92 scale, dst, displ, src); |
| 93 break; | 93 break; |
| 94 case SkDisplacementMapEffect::kA_ChannelSelectorType: | 94 case SkDisplacementMapEffect::kA_ChannelSelectorType: |
| 95 computeDisplacement<typeX, SkDisplacementMapEffect::kA_ChannelSelectorTy
pe>( | 95 computeDisplacement<typeX, SkDisplacementMapEffect::kA_ChannelSelectorTy
pe>( |
| 96 scale, dst, displ, src); | 96 scale, dst, displ, src); |
| 97 break; | 97 break; |
| 98 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: | 98 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: |
| 99 default: | 99 default: |
| 100 SkASSERT(!"Unknown Y channel selector"); | 100 SkDEBUGFAIL("Unknown Y channel selector"); |
| 101 } | 101 } |
| 102 } | 102 } |
| 103 | 103 |
| 104 void computeDisplacement(SkDisplacementMapEffect::ChannelSelectorType xChannelSe
lector, | 104 void computeDisplacement(SkDisplacementMapEffect::ChannelSelectorType xChannelSe
lector, |
| 105 SkDisplacementMapEffect::ChannelSelectorType yChannelSe
lector, | 105 SkDisplacementMapEffect::ChannelSelectorType yChannelSe
lector, |
| 106 SkScalar scale, SkBitmap* dst, SkBitmap* displ, SkBitma
p* src) | 106 SkScalar scale, SkBitmap* dst, SkBitmap* displ, SkBitma
p* src) |
| 107 { | 107 { |
| 108 switch (xChannelSelector) { | 108 switch (xChannelSelector) { |
| 109 case SkDisplacementMapEffect::kR_ChannelSelectorType: | 109 case SkDisplacementMapEffect::kR_ChannelSelectorType: |
| 110 computeDisplacement<SkDisplacementMapEffect::kR_ChannelSelectorType>( | 110 computeDisplacement<SkDisplacementMapEffect::kR_ChannelSelectorType>( |
| 111 yChannelSelector, scale, dst, displ, src); | 111 yChannelSelector, scale, dst, displ, src); |
| 112 break; | 112 break; |
| 113 case SkDisplacementMapEffect::kG_ChannelSelectorType: | 113 case SkDisplacementMapEffect::kG_ChannelSelectorType: |
| 114 computeDisplacement<SkDisplacementMapEffect::kG_ChannelSelectorType>( | 114 computeDisplacement<SkDisplacementMapEffect::kG_ChannelSelectorType>( |
| 115 yChannelSelector, scale, dst, displ, src); | 115 yChannelSelector, scale, dst, displ, src); |
| 116 break; | 116 break; |
| 117 case SkDisplacementMapEffect::kB_ChannelSelectorType: | 117 case SkDisplacementMapEffect::kB_ChannelSelectorType: |
| 118 computeDisplacement<SkDisplacementMapEffect::kB_ChannelSelectorType>( | 118 computeDisplacement<SkDisplacementMapEffect::kB_ChannelSelectorType>( |
| 119 yChannelSelector, scale, dst, displ, src); | 119 yChannelSelector, scale, dst, displ, src); |
| 120 break; | 120 break; |
| 121 case SkDisplacementMapEffect::kA_ChannelSelectorType: | 121 case SkDisplacementMapEffect::kA_ChannelSelectorType: |
| 122 computeDisplacement<SkDisplacementMapEffect::kA_ChannelSelectorType>( | 122 computeDisplacement<SkDisplacementMapEffect::kA_ChannelSelectorType>( |
| 123 yChannelSelector, scale, dst, displ, src); | 123 yChannelSelector, scale, dst, displ, src); |
| 124 break; | 124 break; |
| 125 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: | 125 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: |
| 126 default: | 126 default: |
| 127 SkASSERT(!"Unknown X channel selector"); | 127 SkDEBUGFAIL("Unknown X channel selector"); |
| 128 } | 128 } |
| 129 } | 129 } |
| 130 | 130 |
| 131 } // end namespace | 131 } // end namespace |
| 132 | 132 |
| 133 /////////////////////////////////////////////////////////////////////////////// | 133 /////////////////////////////////////////////////////////////////////////////// |
| 134 | 134 |
| 135 SkDisplacementMapEffect::SkDisplacementMapEffect(ChannelSelectorType xChannelSel
ector, | 135 SkDisplacementMapEffect::SkDisplacementMapEffect(ChannelSelectorType xChannelSel
ector, |
| 136 ChannelSelectorType yChannelSel
ector, | 136 ChannelSelectorType yChannelSel
ector, |
| 137 SkScalar scale, | 137 SkScalar scale, |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 builder->fsCodeAppend("g"); | 449 builder->fsCodeAppend("g"); |
| 450 break; | 450 break; |
| 451 case SkDisplacementMapEffect::kB_ChannelSelectorType: | 451 case SkDisplacementMapEffect::kB_ChannelSelectorType: |
| 452 builder->fsCodeAppend("b"); | 452 builder->fsCodeAppend("b"); |
| 453 break; | 453 break; |
| 454 case SkDisplacementMapEffect::kA_ChannelSelectorType: | 454 case SkDisplacementMapEffect::kA_ChannelSelectorType: |
| 455 builder->fsCodeAppend("a"); | 455 builder->fsCodeAppend("a"); |
| 456 break; | 456 break; |
| 457 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: | 457 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: |
| 458 default: | 458 default: |
| 459 SkASSERT(!"Unknown X channel selector"); | 459 SkDEBUGFAIL("Unknown X channel selector"); |
| 460 } | 460 } |
| 461 | 461 |
| 462 switch (fYChannelSelector) { | 462 switch (fYChannelSelector) { |
| 463 case SkDisplacementMapEffect::kR_ChannelSelectorType: | 463 case SkDisplacementMapEffect::kR_ChannelSelectorType: |
| 464 builder->fsCodeAppend("r"); | 464 builder->fsCodeAppend("r"); |
| 465 break; | 465 break; |
| 466 case SkDisplacementMapEffect::kG_ChannelSelectorType: | 466 case SkDisplacementMapEffect::kG_ChannelSelectorType: |
| 467 builder->fsCodeAppend("g"); | 467 builder->fsCodeAppend("g"); |
| 468 break; | 468 break; |
| 469 case SkDisplacementMapEffect::kB_ChannelSelectorType: | 469 case SkDisplacementMapEffect::kB_ChannelSelectorType: |
| 470 builder->fsCodeAppend("b"); | 470 builder->fsCodeAppend("b"); |
| 471 break; | 471 break; |
| 472 case SkDisplacementMapEffect::kA_ChannelSelectorType: | 472 case SkDisplacementMapEffect::kA_ChannelSelectorType: |
| 473 builder->fsCodeAppend("a"); | 473 builder->fsCodeAppend("a"); |
| 474 break; | 474 break; |
| 475 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: | 475 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: |
| 476 default: | 476 default: |
| 477 SkASSERT(!"Unknown Y channel selector"); | 477 SkDEBUGFAIL("Unknown Y channel selector"); |
| 478 } | 478 } |
| 479 builder->fsCodeAppend("-vec2(0.5));\t\t"); | 479 builder->fsCodeAppend("-vec2(0.5));\t\t"); |
| 480 | 480 |
| 481 // FIXME : This can be achieved with a "clamp to border" texture repeat mode
and | 481 // FIXME : This can be achieved with a "clamp to border" texture repeat mode
and |
| 482 // a 0 border color instead of computing if cCoords is out of bounds
here. | 482 // a 0 border color instead of computing if cCoords is out of bounds
here. |
| 483 builder->fsCodeAppendf( | 483 builder->fsCodeAppendf( |
| 484 "bool %s = (%s.x < 0.0) || (%s.y < 0.0) || (%s.x > 1.0) || (%s.y > 1.0);
\t\t", | 484 "bool %s = (%s.x < 0.0) || (%s.y < 0.0) || (%s.x > 1.0) || (%s.y > 1.0);
\t\t", |
| 485 outOfBounds, cCoords, cCoords, cCoords, cCoords); | 485 outOfBounds, cCoords, cCoords, cCoords, cCoords); |
| 486 builder->fsCodeAppendf("%s = %s ? vec4(0.0) : ", outputColor, outOfBounds); | 486 builder->fsCodeAppendf("%s = %s ? vec4(0.0) : ", outputColor, outOfBounds); |
| 487 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, | 487 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 colorTex); | 532 colorTex); |
| 533 | 533 |
| 534 colorKey <<= GrGLEffectMatrix::kKeyBits; | 534 colorKey <<= GrGLEffectMatrix::kKeyBits; |
| 535 EffectKey xKey = displacementMap.xChannelSelector() << (2 * GrGLEffectMatrix
::kKeyBits); | 535 EffectKey xKey = displacementMap.xChannelSelector() << (2 * GrGLEffectMatrix
::kKeyBits); |
| 536 EffectKey yKey = displacementMap.yChannelSelector() << (2 * GrGLEffectMatrix
::kKeyBits + | 536 EffectKey yKey = displacementMap.yChannelSelector() << (2 * GrGLEffectMatrix
::kKeyBits + |
| 537 SkDisplacementMapEff
ect::kKeyBits); | 537 SkDisplacementMapEff
ect::kKeyBits); |
| 538 | 538 |
| 539 return xKey | yKey | displKey | colorKey; | 539 return xKey | yKey | displKey | colorKey; |
| 540 } | 540 } |
| 541 #endif | 541 #endif |
| OLD | NEW |