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