Chromium Code Reviews| 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 29 matching lines...) Expand all Loading... | |
| 40 return SkUnPreMultiply::ApplyScale(table[SkGetPackedA32(l)], SkGetPackedB32( l)); | 40 return SkUnPreMultiply::ApplyScale(table[SkGetPackedA32(l)], SkGetPackedB32( l)); |
| 41 } | 41 } |
| 42 | 42 |
| 43 template<> uint32_t getValue<SkDisplacementMapEffect::kA_ChannelSelectorType>( | 43 template<> uint32_t getValue<SkDisplacementMapEffect::kA_ChannelSelectorType>( |
| 44 SkColor l, const SkUnPreMultiply::Scale*) { | 44 SkColor l, const SkUnPreMultiply::Scale*) { |
| 45 return SkGetPackedA32(l); | 45 return SkGetPackedA32(l); |
| 46 } | 46 } |
| 47 | 47 |
| 48 template<SkDisplacementMapEffect::ChannelSelectorType typeX, | 48 template<SkDisplacementMapEffect::ChannelSelectorType typeX, |
| 49 SkDisplacementMapEffect::ChannelSelectorType typeY> | 49 SkDisplacementMapEffect::ChannelSelectorType typeY> |
| 50 void computeDisplacement(SkScalar scale, SkBitmap* dst, SkBitmap* displ, SkBitma p* src, const SkIRect& bounds) | 50 void computeDisplacement(const SkVector& scale, SkBitmap* dst, |
| 51 SkBitmap* displ, const SkIPoint& displOffset, | |
| 52 SkBitmap* src, const SkIPoint& srcOffset, | |
| 53 const SkIRect& bounds) | |
| 51 { | 54 { |
| 52 static const SkScalar Inv8bit = SkScalarDiv(SK_Scalar1, 255.0f); | 55 static const SkScalar Inv8bit = SkScalarDiv(SK_Scalar1, 255.0f); |
| 53 const int srcW = src->width(); | 56 const int srcW = src->width(); |
| 54 const int srcH = src->height(); | 57 const int srcH = src->height(); |
| 55 const SkScalar scaleForColor = SkScalarMul(scale, Inv8bit); | 58 const SkVector scaleForColor = SkVector::Make(SkScalarMul(scale.fX, Inv8bit) , |
| 56 const SkScalar scaleAdj = SK_ScalarHalf - SkScalarMul(scale, SK_ScalarHalf); | 59 SkScalarMul(scale.fY, Inv8bit) ); |
| 60 const SkVector scaleAdj = SkVector::Make(SK_ScalarHalf - SkScalarMul(scale.f X, SK_ScalarHalf), | |
| 61 SK_ScalarHalf - SkScalarMul(scale.f Y, SK_ScalarHalf)); | |
| 57 const SkUnPreMultiply::Scale* table = SkUnPreMultiply::GetScaleTable(); | 62 const SkUnPreMultiply::Scale* table = SkUnPreMultiply::GetScaleTable(); |
| 58 SkPMColor* dstPtr = dst->getAddr32(0, 0); | 63 SkPMColor* dstPtr = dst->getAddr32(0, 0); |
| 59 for (int y = bounds.top(); y < bounds.bottom(); ++y) { | 64 for (int y = bounds.top(); y < bounds.bottom(); ++y) { |
| 60 const SkPMColor* displPtr = displ->getAddr32(bounds.left(), y); | 65 const SkPMColor* displPtr = displ->getAddr32(bounds.left() - displOffset .fX, |
| 66 y - displOffset.fY); | |
| 61 for (int x = bounds.left(); x < bounds.right(); ++x, ++displPtr) { | 67 for (int x = bounds.left(); x < bounds.right(); ++x, ++displPtr) { |
| 62 const SkScalar displX = SkScalarMul(scaleForColor, | 68 const SkScalar displX = SkScalarMul(scaleForColor.fX, |
| 63 SkIntToScalar(getValue<typeX>(*displPtr, table))) + scaleAdj; | 69 SkIntToScalar(getValue<typeX>(*displPtr, table))) + scaleAdj.fX; |
| 64 const SkScalar displY = SkScalarMul(scaleForColor, | 70 const SkScalar displY = SkScalarMul(scaleForColor.fY, |
| 65 SkIntToScalar(getValue<typeY>(*displPtr, table))) + scaleAdj; | 71 SkIntToScalar(getValue<typeY>(*displPtr, table))) + scaleAdj.fY; |
| 66 // Truncate the displacement values | 72 // Truncate the displacement values |
| 67 const int srcX = x + SkScalarTruncToInt(displX); | 73 const int srcX = x + SkScalarTruncToInt(displX) - srcOffset.fX; |
| 68 const int srcY = y + SkScalarTruncToInt(displY); | 74 const int srcY = y + SkScalarTruncToInt(displY) - srcOffset.fY; |
| 69 *dstPtr++ = ((srcX < 0) || (srcX >= srcW) || (srcY < 0) || (srcY >= srcH)) ? | 75 *dstPtr++ = ((srcX < 0) || (srcX >= srcW) || (srcY < 0) || (srcY >= srcH)) ? |
| 70 0 : *(src->getAddr32(srcX, srcY)); | 76 0 : *(src->getAddr32(srcX, srcY)); |
| 71 } | 77 } |
| 72 } | 78 } |
| 73 } | 79 } |
| 74 | 80 |
| 75 template<SkDisplacementMapEffect::ChannelSelectorType typeX> | 81 template<SkDisplacementMapEffect::ChannelSelectorType typeX> |
| 76 void computeDisplacement(SkDisplacementMapEffect::ChannelSelectorType yChannelSe lector, | 82 void computeDisplacement(SkDisplacementMapEffect::ChannelSelectorType yChannelSe lector, |
| 77 SkScalar scale, SkBitmap* dst, SkBitmap* displ, SkBitma p* src, const SkIRect& bounds) | 83 const SkVector& scale, SkBitmap* dst, |
| 84 SkBitmap* displ, const SkIPoint& displOffset, | |
| 85 SkBitmap* src, const SkIPoint& srcOffset, | |
| 86 const SkIRect& bounds) | |
| 78 { | 87 { |
| 79 switch (yChannelSelector) { | 88 switch (yChannelSelector) { |
| 80 case SkDisplacementMapEffect::kR_ChannelSelectorType: | 89 case SkDisplacementMapEffect::kR_ChannelSelectorType: |
| 81 computeDisplacement<typeX, SkDisplacementMapEffect::kR_ChannelSelectorTy pe>( | 90 computeDisplacement<typeX, SkDisplacementMapEffect::kR_ChannelSelectorTy pe>( |
| 82 scale, dst, displ, src, bounds); | 91 scale, dst, displ, displOffset, src, srcOffset, bounds); |
| 83 break; | 92 break; |
| 84 case SkDisplacementMapEffect::kG_ChannelSelectorType: | 93 case SkDisplacementMapEffect::kG_ChannelSelectorType: |
| 85 computeDisplacement<typeX, SkDisplacementMapEffect::kG_ChannelSelectorTy pe>( | 94 computeDisplacement<typeX, SkDisplacementMapEffect::kG_ChannelSelectorTy pe>( |
| 86 scale, dst, displ, src, bounds); | 95 scale, dst, displ, displOffset, src, srcOffset, bounds); |
| 87 break; | 96 break; |
| 88 case SkDisplacementMapEffect::kB_ChannelSelectorType: | 97 case SkDisplacementMapEffect::kB_ChannelSelectorType: |
| 89 computeDisplacement<typeX, SkDisplacementMapEffect::kB_ChannelSelectorTy pe>( | 98 computeDisplacement<typeX, SkDisplacementMapEffect::kB_ChannelSelectorTy pe>( |
| 90 scale, dst, displ, src, bounds); | 99 scale, dst, displ, displOffset, src, srcOffset, bounds); |
| 91 break; | 100 break; |
| 92 case SkDisplacementMapEffect::kA_ChannelSelectorType: | 101 case SkDisplacementMapEffect::kA_ChannelSelectorType: |
| 93 computeDisplacement<typeX, SkDisplacementMapEffect::kA_ChannelSelectorTy pe>( | 102 computeDisplacement<typeX, SkDisplacementMapEffect::kA_ChannelSelectorTy pe>( |
| 94 scale, dst, displ, src, bounds); | 103 scale, dst, displ, displOffset, src, srcOffset, bounds); |
| 95 break; | 104 break; |
| 96 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: | 105 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: |
| 97 default: | 106 default: |
| 98 SkDEBUGFAIL("Unknown Y channel selector"); | 107 SkDEBUGFAIL("Unknown Y channel selector"); |
| 99 } | 108 } |
| 100 } | 109 } |
| 101 | 110 |
| 102 void computeDisplacement(SkDisplacementMapEffect::ChannelSelectorType xChannelSe lector, | 111 void computeDisplacement(SkDisplacementMapEffect::ChannelSelectorType xChannelSe lector, |
| 103 SkDisplacementMapEffect::ChannelSelectorType yChannelSe lector, | 112 SkDisplacementMapEffect::ChannelSelectorType yChannelSe lector, |
| 104 SkScalar scale, SkBitmap* dst, SkBitmap* displ, SkBitma p* src, const SkIRect& bounds) | 113 const SkVector& scale, SkBitmap* dst, |
| 114 SkBitmap* displ, const SkIPoint& displOffset, | |
| 115 SkBitmap* src, const SkIPoint& srcOffset, | |
| 116 const SkIRect& bounds) | |
| 105 { | 117 { |
| 106 switch (xChannelSelector) { | 118 switch (xChannelSelector) { |
| 107 case SkDisplacementMapEffect::kR_ChannelSelectorType: | 119 case SkDisplacementMapEffect::kR_ChannelSelectorType: |
| 108 computeDisplacement<SkDisplacementMapEffect::kR_ChannelSelectorType>( | 120 computeDisplacement<SkDisplacementMapEffect::kR_ChannelSelectorType>( |
| 109 yChannelSelector, scale, dst, displ, src, bounds); | 121 yChannelSelector, scale, dst, displ, displOffset, src, srcOffset, bo unds); |
| 110 break; | 122 break; |
| 111 case SkDisplacementMapEffect::kG_ChannelSelectorType: | 123 case SkDisplacementMapEffect::kG_ChannelSelectorType: |
| 112 computeDisplacement<SkDisplacementMapEffect::kG_ChannelSelectorType>( | 124 computeDisplacement<SkDisplacementMapEffect::kG_ChannelSelectorType>( |
| 113 yChannelSelector, scale, dst, displ, src, bounds); | 125 yChannelSelector, scale, dst, displ, displOffset, src, srcOffset, bo unds); |
| 114 break; | 126 break; |
| 115 case SkDisplacementMapEffect::kB_ChannelSelectorType: | 127 case SkDisplacementMapEffect::kB_ChannelSelectorType: |
| 116 computeDisplacement<SkDisplacementMapEffect::kB_ChannelSelectorType>( | 128 computeDisplacement<SkDisplacementMapEffect::kB_ChannelSelectorType>( |
| 117 yChannelSelector, scale, dst, displ, src, bounds); | 129 yChannelSelector, scale, dst, displ, displOffset, src, srcOffset, bo unds); |
| 118 break; | 130 break; |
| 119 case SkDisplacementMapEffect::kA_ChannelSelectorType: | 131 case SkDisplacementMapEffect::kA_ChannelSelectorType: |
| 120 computeDisplacement<SkDisplacementMapEffect::kA_ChannelSelectorType>( | 132 computeDisplacement<SkDisplacementMapEffect::kA_ChannelSelectorType>( |
| 121 yChannelSelector, scale, dst, displ, src, bounds); | 133 yChannelSelector, scale, dst, displ, displOffset, src, srcOffset, bo unds); |
| 122 break; | 134 break; |
| 123 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: | 135 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: |
| 124 default: | 136 default: |
| 125 SkDEBUGFAIL("Unknown X channel selector"); | 137 SkDEBUGFAIL("Unknown X channel selector"); |
| 126 } | 138 } |
| 127 } | 139 } |
| 128 | 140 |
| 129 bool channel_selector_type_is_valid(SkDisplacementMapEffect::ChannelSelectorType cst) { | 141 bool channel_selector_type_is_valid(SkDisplacementMapEffect::ChannelSelectorType cst) { |
| 130 switch (cst) { | 142 switch (cst) { |
| 131 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: | 143 case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 179 } | 191 } |
| 180 | 192 |
| 181 bool SkDisplacementMapEffect::onFilterImage(Proxy* proxy, | 193 bool SkDisplacementMapEffect::onFilterImage(Proxy* proxy, |
| 182 const SkBitmap& src, | 194 const SkBitmap& src, |
| 183 const SkMatrix& ctm, | 195 const SkMatrix& ctm, |
| 184 SkBitmap* dst, | 196 SkBitmap* dst, |
| 185 SkIPoint* offset) { | 197 SkIPoint* offset) { |
| 186 SkBitmap displ = src, color = src; | 198 SkBitmap displ = src, color = src; |
| 187 SkImageFilter* colorInput = getColorInput(); | 199 SkImageFilter* colorInput = getColorInput(); |
| 188 SkImageFilter* displacementInput = getDisplacementInput(); | 200 SkImageFilter* displacementInput = getDisplacementInput(); |
| 189 if ((colorInput && !colorInput->filterImage(proxy, src, ctm, &color, offset) ) || | 201 SkIPoint colorOffset = SkIPoint::Make(0, 0), displOffset = SkIPoint::Make(0, 0); |
| 190 (displacementInput && !displacementInput->filterImage(proxy, src, ctm, & displ, offset))) { | 202 if ((colorInput && !colorInput->filterImage(proxy, src, ctm, &color, &colorO ffset)) || |
| 203 (displacementInput && !displacementInput->filterImage(proxy, src, ctm, & displ, &displOffset))) { | |
| 191 return false; | 204 return false; |
| 192 } | 205 } |
| 193 if ((displ.config() != SkBitmap::kARGB_8888_Config) || | 206 if ((displ.config() != SkBitmap::kARGB_8888_Config) || |
| 194 (color.config() != SkBitmap::kARGB_8888_Config)) { | 207 (color.config() != SkBitmap::kARGB_8888_Config)) { |
| 195 return false; | 208 return false; |
| 196 } | 209 } |
| 197 | 210 |
| 198 SkAutoLockPixels alp_displacement(displ), alp_color(color); | 211 SkAutoLockPixels alp_displacement(displ), alp_color(color); |
| 199 if (!displ.getPixels() || !color.getPixels()) { | 212 if (!displ.getPixels() || !color.getPixels()) { |
| 200 return false; | 213 return false; |
| 201 } | 214 } |
| 202 SkIRect bounds; | 215 SkIRect bounds; |
| 203 color.getBounds(&bounds); | 216 color.getBounds(&bounds); |
| 217 bounds.offset(colorOffset); | |
|
sugoi
2014/01/17 21:56:27
We offset the source here and then we subtract a c
Stephen White
2014/01/18 01:23:19
We have to offset it to intersect it below. But we
| |
| 204 if (!this->applyCropRect(&bounds, ctm)) { | 218 if (!this->applyCropRect(&bounds, ctm)) { |
| 205 return false; | 219 return false; |
| 206 } | 220 } |
| 207 SkIRect displBounds; | 221 SkIRect displBounds; |
| 208 displ.getBounds(&displBounds); | 222 displ.getBounds(&displBounds); |
| 223 displBounds.offset(displOffset); | |
| 209 if (!this->applyCropRect(&displBounds, ctm)) { | 224 if (!this->applyCropRect(&displBounds, ctm)) { |
| 210 return false; | 225 return false; |
| 211 } | 226 } |
| 212 if (!bounds.intersect(displBounds)) { | 227 if (!bounds.intersect(displBounds)) { |
| 213 return false; | 228 return false; |
| 214 } | 229 } |
| 215 | 230 |
| 216 dst->setConfig(color.config(), bounds.width(), bounds.height()); | 231 dst->setConfig(color.config(), bounds.width(), bounds.height()); |
| 217 dst->allocPixels(); | 232 dst->allocPixels(); |
| 218 if (!dst->getPixels()) { | 233 if (!dst->getPixels()) { |
| 219 return false; | 234 return false; |
| 220 } | 235 } |
| 221 | 236 |
| 222 computeDisplacement(fXChannelSelector, fYChannelSelector, fScale, dst, &disp l, &color, bounds); | 237 SkVector scale = SkVector::Make(fScale, fScale); |
| 238 ctm.mapVectors(&scale, 1); | |
| 239 | |
| 240 computeDisplacement(fXChannelSelector, fYChannelSelector, scale, dst, | |
| 241 &displ, displOffset, &color, colorOffset, bounds); | |
| 223 | 242 |
| 224 offset->fX = bounds.left(); | 243 offset->fX = bounds.left(); |
| 225 offset->fY = bounds.top(); | 244 offset->fY = bounds.top(); |
| 226 return true; | 245 return true; |
| 227 } | 246 } |
| 228 | 247 |
| 229 /////////////////////////////////////////////////////////////////////////////// | 248 /////////////////////////////////////////////////////////////////////////////// |
| 230 | 249 |
| 231 #if SK_SUPPORT_GPU | 250 #if SK_SUPPORT_GPU |
| 232 class GrGLDisplacementMapEffect : public GrGLEffect { | 251 class GrGLDisplacementMapEffect : public GrGLEffect { |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 254 | 273 |
| 255 typedef GrGLEffect INHERITED; | 274 typedef GrGLEffect INHERITED; |
| 256 }; | 275 }; |
| 257 | 276 |
| 258 /////////////////////////////////////////////////////////////////////////////// | 277 /////////////////////////////////////////////////////////////////////////////// |
| 259 | 278 |
| 260 class GrDisplacementMapEffect : public GrEffect { | 279 class GrDisplacementMapEffect : public GrEffect { |
| 261 public: | 280 public: |
| 262 static GrEffectRef* Create(SkDisplacementMapEffect::ChannelSelectorType xCha nnelSelector, | 281 static GrEffectRef* Create(SkDisplacementMapEffect::ChannelSelectorType xCha nnelSelector, |
| 263 SkDisplacementMapEffect::ChannelSelectorType yCha nnelSelector, | 282 SkDisplacementMapEffect::ChannelSelectorType yCha nnelSelector, |
| 264 SkScalar scale, GrTexture* displacement, GrTextur e* color) { | 283 SkVector scale, |
| 284 GrTexture* displacement, const SkMatrix& displace mentMatrix, | |
| 285 GrTexture* color, const SkMatrix& colorMatrix) { | |
| 265 AutoEffectUnref effect(SkNEW_ARGS(GrDisplacementMapEffect, (xChannelSele ctor, | 286 AutoEffectUnref effect(SkNEW_ARGS(GrDisplacementMapEffect, (xChannelSele ctor, |
| 266 yChannelSele ctor, | 287 yChannelSele ctor, |
| 267 scale, | 288 scale, |
| 268 displacement , | 289 displacement , |
| 269 color))); | 290 displacement Matrix, |
| 291 color, | |
| 292 colorMatrix) )); | |
| 270 return CreateEffectRef(effect); | 293 return CreateEffectRef(effect); |
| 271 } | 294 } |
| 272 | 295 |
| 273 virtual ~GrDisplacementMapEffect(); | 296 virtual ~GrDisplacementMapEffect(); |
| 274 | 297 |
| 275 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; | 298 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; |
| 276 SkDisplacementMapEffect::ChannelSelectorType xChannelSelector() const | 299 SkDisplacementMapEffect::ChannelSelectorType xChannelSelector() const |
| 277 { return fXChannelSelector; } | 300 { return fXChannelSelector; } |
| 278 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector() const | 301 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector() const |
| 279 { return fYChannelSelector; } | 302 { return fYChannelSelector; } |
| 280 SkScalar scale() const { return fScale; } | 303 const SkVector& scale() const { return fScale; } |
| 281 | 304 |
| 282 typedef GrGLDisplacementMapEffect GLEffect; | 305 typedef GrGLDisplacementMapEffect GLEffect; |
| 283 static const char* Name() { return "DisplacementMap"; } | 306 static const char* Name() { return "DisplacementMap"; } |
| 284 | 307 |
| 285 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags ) const SK_OVERRIDE; | 308 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags ) const SK_OVERRIDE; |
| 286 | 309 |
| 287 private: | 310 private: |
| 288 virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; | 311 virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; |
| 289 | 312 |
| 290 GrDisplacementMapEffect(SkDisplacementMapEffect::ChannelSelectorType xChanne lSelector, | 313 GrDisplacementMapEffect(SkDisplacementMapEffect::ChannelSelectorType xChanne lSelector, |
| 291 SkDisplacementMapEffect::ChannelSelectorType yChanne lSelector, | 314 SkDisplacementMapEffect::ChannelSelectorType yChanne lSelector, |
| 292 SkScalar scale, GrTexture* displacement, GrTexture* color); | 315 const SkVector& scale, |
| 316 GrTexture* displacement, const SkMatrix& displacemen tMatrix, | |
| 317 GrTexture* color, const SkMatrix& colorMatrix); | |
| 293 | 318 |
| 294 GR_DECLARE_EFFECT_TEST; | 319 GR_DECLARE_EFFECT_TEST; |
| 295 | 320 |
| 296 GrCoordTransform fDisplacementTransform; | 321 GrCoordTransform fDisplacementTransform; |
| 297 GrTextureAccess fDisplacementAccess; | 322 GrTextureAccess fDisplacementAccess; |
| 298 GrCoordTransform fColorTransform; | 323 GrCoordTransform fColorTransform; |
| 299 GrTextureAccess fColorAccess; | 324 GrTextureAccess fColorAccess; |
| 300 SkDisplacementMapEffect::ChannelSelectorType fXChannelSelector; | 325 SkDisplacementMapEffect::ChannelSelectorType fXChannelSelector; |
| 301 SkDisplacementMapEffect::ChannelSelectorType fYChannelSelector; | 326 SkDisplacementMapEffect::ChannelSelectorType fYChannelSelector; |
| 302 SkScalar fScale; | 327 SkVector fScale; |
| 303 | 328 |
| 304 typedef GrEffect INHERITED; | 329 typedef GrEffect INHERITED; |
| 305 }; | 330 }; |
| 306 | 331 |
| 307 bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkBitmap& src, const SkMatrix& ctm, | 332 bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkBitmap& src, const SkMatrix& ctm, |
| 308 SkBitmap* result, SkIPoint* offset) { | 333 SkBitmap* result, SkIPoint* offset) { |
| 309 SkBitmap colorBM; | 334 SkBitmap colorBM; |
| 310 SkIPoint colorOffset = SkIPoint::Make(0, 0); | 335 SkIPoint colorOffset = SkIPoint::Make(0, 0); |
| 311 if (!SkImageFilterUtils::GetInputResultGPU(getColorInput(), proxy, src, ctm, &colorBM, | 336 if (!SkImageFilterUtils::GetInputResultGPU(getColorInput(), proxy, src, ctm, &colorBM, |
| 312 &colorOffset)) { | 337 &colorOffset)) { |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 326 desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit; | 351 desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit; |
| 327 desc.fWidth = src.width(); | 352 desc.fWidth = src.width(); |
| 328 desc.fHeight = src.height(); | 353 desc.fHeight = src.height(); |
| 329 desc.fConfig = kSkia8888_GrPixelConfig; | 354 desc.fConfig = kSkia8888_GrPixelConfig; |
| 330 | 355 |
| 331 GrAutoScratchTexture ast(context, desc); | 356 GrAutoScratchTexture ast(context, desc); |
| 332 SkAutoTUnref<GrTexture> dst(ast.detach()); | 357 SkAutoTUnref<GrTexture> dst(ast.detach()); |
| 333 | 358 |
| 334 GrContext::AutoRenderTarget art(context, dst->asRenderTarget()); | 359 GrContext::AutoRenderTarget art(context, dst->asRenderTarget()); |
| 335 | 360 |
| 336 GrPaint paint; | 361 SkVector scale = SkVector::Make(fScale, fScale); |
| 337 paint.addColorEffect( | 362 ctm.mapVectors(&scale, 1); |
| 338 GrDisplacementMapEffect::Create(fXChannelSelector, | |
| 339 fYChannelSelector, | |
| 340 fScale, | |
| 341 displacement, | |
| 342 color))->unref(); | |
| 343 SkIRect bounds; | 363 SkIRect bounds; |
| 344 src.getBounds(&bounds); | 364 src.getBounds(&bounds); |
| 365 bounds.offset(colorOffset); | |
| 345 if (!this->applyCropRect(&bounds, ctm)) { | 366 if (!this->applyCropRect(&bounds, ctm)) { |
| 346 return false; | 367 return false; |
| 347 } | 368 } |
| 348 SkIRect displBounds; | 369 SkIRect displBounds; |
| 349 displacementBM.getBounds(&displBounds); | 370 displacementBM.getBounds(&displBounds); |
| 371 displBounds.offset(displacementOffset); | |
| 350 if (!this->applyCropRect(&displBounds, ctm)) { | 372 if (!this->applyCropRect(&displBounds, ctm)) { |
| 351 return false; | 373 return false; |
| 352 } | 374 } |
| 353 if (!bounds.intersect(displBounds)) { | 375 if (!bounds.intersect(displBounds)) { |
| 354 return false; | 376 return false; |
| 355 } | 377 } |
| 356 SkRect srcRect = SkRect::Make(bounds); | 378 |
| 357 SkRect dstRect = SkRect::MakeWH(srcRect.width(), srcRect.height()); | 379 GrPaint paint; |
| 358 context->drawRectToRect(paint, dstRect, srcRect); | 380 SkMatrix colorMatrix = GrEffect::MakeDivByTextureWHMatrix(color); |
| 381 colorMatrix.preTranslate(-SkIntToScalar(colorOffset.fX), | |
| 382 -SkIntToScalar(colorOffset.fY)); | |
| 383 SkMatrix displacementMatrix = GrEffect::MakeDivByTextureWHMatrix(displacemen t); | |
| 384 displacementMatrix.preTranslate(-SkIntToScalar(displacementOffset.fX), | |
| 385 -SkIntToScalar(displacementOffset.fY)); | |
| 386 paint.addColorEffect( | |
| 387 GrDisplacementMapEffect::Create(fXChannelSelector, | |
| 388 fYChannelSelector, | |
| 389 scale, | |
| 390 displacement, | |
| 391 displacementMatrix, | |
| 392 color, | |
| 393 colorMatrix))->unref(); | |
| 394 SkMatrix matrix; | |
| 395 matrix.setTranslate(-SkIntToScalar(bounds.left()), -SkIntToScalar(bounds.top ())); | |
|
sugoi
2014/01/17 21:56:27
Same comment about offsetting the bounds and trans
Stephen White
2014/01/18 01:23:19
Fixed (although I don't think it'll make it any fa
| |
| 396 context->concatMatrix(matrix); | |
| 397 context->drawRect(paint, SkRect::Make(bounds)); | |
| 359 offset->fX = bounds.left(); | 398 offset->fX = bounds.left(); |
| 360 offset->fY = bounds.top(); | 399 offset->fY = bounds.top(); |
| 361 return SkImageFilterUtils::WrapTexture(dst, bounds.width(), bounds.height(), result); | 400 return SkImageFilterUtils::WrapTexture(dst, bounds.width(), bounds.height(), result); |
| 362 } | 401 } |
| 363 | 402 |
| 364 /////////////////////////////////////////////////////////////////////////////// | 403 /////////////////////////////////////////////////////////////////////////////// |
| 365 | 404 |
| 366 GrDisplacementMapEffect::GrDisplacementMapEffect( | 405 GrDisplacementMapEffect::GrDisplacementMapEffect( |
| 367 SkDisplacementMapEffect::ChannelSelectorType xChann elSelector, | 406 SkDisplacementMapEffect::ChannelSelectorType xChann elSelector, |
| 368 SkDisplacementMapEffect::ChannelSelectorType yChann elSelector, | 407 SkDisplacementMapEffect::ChannelSelectorType yChann elSelector, |
| 369 SkScalar scale, | 408 const SkVector& scale, |
| 370 GrTexture* displacement, | 409 GrTexture* displacement, |
| 371 GrTexture* color) | 410 const SkMatrix& displacementMatrix, |
| 372 : fDisplacementTransform(kLocal_GrCoordSet, displacement) | 411 GrTexture* color, |
| 412 const SkMatrix& colorMatrix) | |
| 413 : fDisplacementTransform(kLocal_GrCoordSet, displacementMatrix, displacement ) | |
| 373 , fDisplacementAccess(displacement) | 414 , fDisplacementAccess(displacement) |
| 374 , fColorTransform(kLocal_GrCoordSet, color) | 415 , fColorTransform(kLocal_GrCoordSet, colorMatrix, color) |
| 375 , fColorAccess(color) | 416 , fColorAccess(color) |
| 376 , fXChannelSelector(xChannelSelector) | 417 , fXChannelSelector(xChannelSelector) |
| 377 , fYChannelSelector(yChannelSelector) | 418 , fYChannelSelector(yChannelSelector) |
| 378 , fScale(scale) { | 419 , fScale(scale) { |
| 379 this->addCoordTransform(&fDisplacementTransform); | 420 this->addCoordTransform(&fDisplacementTransform); |
| 380 this->addTextureAccess(&fDisplacementAccess); | 421 this->addTextureAccess(&fDisplacementAccess); |
| 381 this->addCoordTransform(&fColorTransform); | 422 this->addCoordTransform(&fColorTransform); |
| 382 this->addTextureAccess(&fColorAccess); | 423 this->addTextureAccess(&fColorAccess); |
| 383 this->setWillNotUseInputColor(); | 424 this->setWillNotUseInputColor(); |
| 384 } | 425 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 421 GrEffectUnitTest::kAlphaTextureIdx; | 462 GrEffectUnitTest::kAlphaTextureIdx; |
| 422 int texIdxColor = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx : | 463 int texIdxColor = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx : |
| 423 GrEffectUnitTest::kAlphaTextureIdx; | 464 GrEffectUnitTest::kAlphaTextureIdx; |
| 424 static const int kMaxComponent = 4; | 465 static const int kMaxComponent = 4; |
| 425 SkDisplacementMapEffect::ChannelSelectorType xChannelSelector = | 466 SkDisplacementMapEffect::ChannelSelectorType xChannelSelector = |
| 426 static_cast<SkDisplacementMapEffect::ChannelSelectorType>( | 467 static_cast<SkDisplacementMapEffect::ChannelSelectorType>( |
| 427 random->nextRangeU(1, kMaxComponent)); | 468 random->nextRangeU(1, kMaxComponent)); |
| 428 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector = | 469 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector = |
| 429 static_cast<SkDisplacementMapEffect::ChannelSelectorType>( | 470 static_cast<SkDisplacementMapEffect::ChannelSelectorType>( |
| 430 random->nextRangeU(1, kMaxComponent)); | 471 random->nextRangeU(1, kMaxComponent)); |
| 431 SkScalar scale = random->nextRangeScalar(0, 100.0f); | 472 SkVector scale = SkVector::Make(random->nextRangeScalar(0, 100.0f), |
| 473 random->nextRangeScalar(0, 100.0f)); | |
| 432 | 474 |
| 433 return GrDisplacementMapEffect::Create(xChannelSelector, yChannelSelector, s cale, | 475 return GrDisplacementMapEffect::Create(xChannelSelector, yChannelSelector, s cale, |
| 434 textures[texIdxDispl], textures[texId xColor]); | 476 textures[texIdxDispl], SkMatrix::I(), |
| 477 textures[texIdxColor], SkMatrix::I()) ; | |
| 435 } | 478 } |
| 436 | 479 |
| 437 /////////////////////////////////////////////////////////////////////////////// | 480 /////////////////////////////////////////////////////////////////////////////// |
| 438 | 481 |
| 439 GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrBackendEffectFactor y& factory, | 482 GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrBackendEffectFactor y& factory, |
| 440 const GrDrawEffect& drawEff ect) | 483 const GrDrawEffect& drawEff ect) |
| 441 : INHERITED(factory) | 484 : INHERITED(factory) |
| 442 , fXChannelSelector(drawEffect.castEffect<GrDisplacementMapEffect>().xChanne lSelector()) | 485 , fXChannelSelector(drawEffect.castEffect<GrDisplacementMapEffect>().xChanne lSelector()) |
| 443 , fYChannelSelector(drawEffect.castEffect<GrDisplacementMapEffect>().yChanne lSelector()) { | 486 , fYChannelSelector(drawEffect.castEffect<GrDisplacementMapEffect>().yChanne lSelector()) { |
| 444 } | 487 } |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 521 builder->fsCodeAppendf("%s = %s ? vec4(0.0) : ", outputColor, outOfBounds); | 564 builder->fsCodeAppendf("%s = %s ? vec4(0.0) : ", outputColor, outOfBounds); |
| 522 builder->fsAppendTextureLookup(samplers[1], cCoords, coords[1].type()); | 565 builder->fsAppendTextureLookup(samplers[1], cCoords, coords[1].type()); |
| 523 builder->fsCodeAppend(";\n"); | 566 builder->fsCodeAppend(";\n"); |
| 524 } | 567 } |
| 525 | 568 |
| 526 void GrGLDisplacementMapEffect::setData(const GrGLUniformManager& uman, | 569 void GrGLDisplacementMapEffect::setData(const GrGLUniformManager& uman, |
| 527 const GrDrawEffect& drawEffect) { | 570 const GrDrawEffect& drawEffect) { |
| 528 const GrDisplacementMapEffect& displacementMap = | 571 const GrDisplacementMapEffect& displacementMap = |
| 529 drawEffect.castEffect<GrDisplacementMapEffect>(); | 572 drawEffect.castEffect<GrDisplacementMapEffect>(); |
| 530 GrTexture* colorTex = displacementMap.texture(1); | 573 GrTexture* colorTex = displacementMap.texture(1); |
| 531 SkScalar scaleX = SkScalarDiv(displacementMap.scale(), SkIntToScalar(colorTe x->width())); | 574 SkScalar scaleX = SkScalarDiv(displacementMap.scale().fX, SkIntToScalar(colo rTex->width())); |
| 532 SkScalar scaleY = SkScalarDiv(displacementMap.scale(), SkIntToScalar(colorTe x->height())); | 575 SkScalar scaleY = SkScalarDiv(displacementMap.scale().fY, SkIntToScalar(colo rTex->height())); |
| 533 uman.set2f(fScaleUni, SkScalarToFloat(scaleX), | 576 uman.set2f(fScaleUni, SkScalarToFloat(scaleX), |
| 534 colorTex->origin() == kTopLeft_GrSurfaceOrigin ? | 577 colorTex->origin() == kTopLeft_GrSurfaceOrigin ? |
| 535 SkScalarToFloat(scaleY) : SkScalarToFloat(-scaleY)); | 578 SkScalarToFloat(scaleY) : SkScalarToFloat(-scaleY)); |
| 536 } | 579 } |
| 537 | 580 |
| 538 GrGLEffect::EffectKey GrGLDisplacementMapEffect::GenKey(const GrDrawEffect& draw Effect, | 581 GrGLEffect::EffectKey GrGLDisplacementMapEffect::GenKey(const GrDrawEffect& draw Effect, |
| 539 const GrGLCaps&) { | 582 const GrGLCaps&) { |
| 540 const GrDisplacementMapEffect& displacementMap = | 583 const GrDisplacementMapEffect& displacementMap = |
| 541 drawEffect.castEffect<GrDisplacementMapEffect>(); | 584 drawEffect.castEffect<GrDisplacementMapEffect>(); |
| 542 | 585 |
| 543 EffectKey xKey = displacementMap.xChannelSelector(); | 586 EffectKey xKey = displacementMap.xChannelSelector(); |
| 544 EffectKey yKey = displacementMap.yChannelSelector() << SkDisplacementMapEffe ct::kKeyBits; | 587 EffectKey yKey = displacementMap.yChannelSelector() << SkDisplacementMapEffe ct::kKeyBits; |
| 545 | 588 |
| 546 return xKey | yKey; | 589 return xKey | yKey; |
| 547 } | 590 } |
| 548 #endif | 591 #endif |
| OLD | NEW |