| 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& offset, |
| 52 SkBitmap* src, |
| 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() + offset.fX, |
| 66 y + offset.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); |
| 68 const int srcY = y + SkScalarTruncToInt(displY); | 74 const int srcY = y + SkScalarTruncToInt(displY); |
| 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& offset, |
| 85 SkBitmap* src, |
| 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, offset, src, 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, offset, src, 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, offset, src, 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, offset, src, 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& offset, |
| 115 SkBitmap* src, |
| 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, offset, src, bounds); |
| 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, offset, src, bounds); |
| 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, offset, src, bounds); |
| 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, offset, src, bounds); |
| 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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 buffer.writeScalar(fScale); | 190 buffer.writeScalar(fScale); |
| 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* displInput = 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 (displInput && !displInput->filterImage(proxy, src, ctm, &displ, &displO
ffset))) { |
| 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); |
| 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 SkIRect colorBounds = bounds; |
| 240 colorBounds.offset(-colorOffset); |
| 241 |
| 242 computeDisplacement(fXChannelSelector, fYChannelSelector, scale, dst, |
| 243 &displ, colorOffset - displOffset, &color, colorBounds); |
| 223 | 244 |
| 224 offset->fX = bounds.left(); | 245 offset->fX = bounds.left(); |
| 225 offset->fY = bounds.top(); | 246 offset->fY = bounds.top(); |
| 226 return true; | 247 return true; |
| 227 } | 248 } |
| 228 | 249 |
| 229 /////////////////////////////////////////////////////////////////////////////// | 250 /////////////////////////////////////////////////////////////////////////////// |
| 230 | 251 |
| 231 #if SK_SUPPORT_GPU | 252 #if SK_SUPPORT_GPU |
| 232 class GrGLDisplacementMapEffect : public GrGLEffect { | 253 class GrGLDisplacementMapEffect : public GrGLEffect { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 254 | 275 |
| 255 typedef GrGLEffect INHERITED; | 276 typedef GrGLEffect INHERITED; |
| 256 }; | 277 }; |
| 257 | 278 |
| 258 /////////////////////////////////////////////////////////////////////////////// | 279 /////////////////////////////////////////////////////////////////////////////// |
| 259 | 280 |
| 260 class GrDisplacementMapEffect : public GrEffect { | 281 class GrDisplacementMapEffect : public GrEffect { |
| 261 public: | 282 public: |
| 262 static GrEffectRef* Create(SkDisplacementMapEffect::ChannelSelectorType xCha
nnelSelector, | 283 static GrEffectRef* Create(SkDisplacementMapEffect::ChannelSelectorType xCha
nnelSelector, |
| 263 SkDisplacementMapEffect::ChannelSelectorType yCha
nnelSelector, | 284 SkDisplacementMapEffect::ChannelSelectorType yCha
nnelSelector, |
| 264 SkScalar scale, GrTexture* displacement, GrTextur
e* color) { | 285 SkVector scale, |
| 286 GrTexture* displacement, const SkMatrix& offsetMa
trix, |
| 287 GrTexture* color) { |
| 265 AutoEffectUnref effect(SkNEW_ARGS(GrDisplacementMapEffect, (xChannelSele
ctor, | 288 AutoEffectUnref effect(SkNEW_ARGS(GrDisplacementMapEffect, (xChannelSele
ctor, |
| 266 yChannelSele
ctor, | 289 yChannelSele
ctor, |
| 267 scale, | 290 scale, |
| 268 displacement
, | 291 displacement
, |
| 292 offsetMatrix
, |
| 269 color))); | 293 color))); |
| 270 return CreateEffectRef(effect); | 294 return CreateEffectRef(effect); |
| 271 } | 295 } |
| 272 | 296 |
| 273 virtual ~GrDisplacementMapEffect(); | 297 virtual ~GrDisplacementMapEffect(); |
| 274 | 298 |
| 275 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; | 299 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; |
| 276 SkDisplacementMapEffect::ChannelSelectorType xChannelSelector() const | 300 SkDisplacementMapEffect::ChannelSelectorType xChannelSelector() const |
| 277 { return fXChannelSelector; } | 301 { return fXChannelSelector; } |
| 278 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector() const | 302 SkDisplacementMapEffect::ChannelSelectorType yChannelSelector() const |
| 279 { return fYChannelSelector; } | 303 { return fYChannelSelector; } |
| 280 SkScalar scale() const { return fScale; } | 304 const SkVector& scale() const { return fScale; } |
| 281 | 305 |
| 282 typedef GrGLDisplacementMapEffect GLEffect; | 306 typedef GrGLDisplacementMapEffect GLEffect; |
| 283 static const char* Name() { return "DisplacementMap"; } | 307 static const char* Name() { return "DisplacementMap"; } |
| 284 | 308 |
| 285 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags
) const SK_OVERRIDE; | 309 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags
) const SK_OVERRIDE; |
| 286 | 310 |
| 287 private: | 311 private: |
| 288 virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; | 312 virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; |
| 289 | 313 |
| 290 GrDisplacementMapEffect(SkDisplacementMapEffect::ChannelSelectorType xChanne
lSelector, | 314 GrDisplacementMapEffect(SkDisplacementMapEffect::ChannelSelectorType xChanne
lSelector, |
| 291 SkDisplacementMapEffect::ChannelSelectorType yChanne
lSelector, | 315 SkDisplacementMapEffect::ChannelSelectorType yChanne
lSelector, |
| 292 SkScalar scale, GrTexture* displacement, GrTexture*
color); | 316 const SkVector& scale, |
| 317 GrTexture* displacement, const SkMatrix& offsetMatri
x, |
| 318 GrTexture* color); |
| 293 | 319 |
| 294 GR_DECLARE_EFFECT_TEST; | 320 GR_DECLARE_EFFECT_TEST; |
| 295 | 321 |
| 296 GrCoordTransform fDisplacementTransform; | 322 GrCoordTransform fDisplacementTransform; |
| 297 GrTextureAccess fDisplacementAccess; | 323 GrTextureAccess fDisplacementAccess; |
| 298 GrCoordTransform fColorTransform; | 324 GrCoordTransform fColorTransform; |
| 299 GrTextureAccess fColorAccess; | 325 GrTextureAccess fColorAccess; |
| 300 SkDisplacementMapEffect::ChannelSelectorType fXChannelSelector; | 326 SkDisplacementMapEffect::ChannelSelectorType fXChannelSelector; |
| 301 SkDisplacementMapEffect::ChannelSelectorType fYChannelSelector; | 327 SkDisplacementMapEffect::ChannelSelectorType fYChannelSelector; |
| 302 SkScalar fScale; | 328 SkVector fScale; |
| 303 | 329 |
| 304 typedef GrEffect INHERITED; | 330 typedef GrEffect INHERITED; |
| 305 }; | 331 }; |
| 306 | 332 |
| 307 bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkBitmap& src,
const SkMatrix& ctm, | 333 bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkBitmap& src,
const SkMatrix& ctm, |
| 308 SkBitmap* result, SkIPoint* offset)
{ | 334 SkBitmap* result, SkIPoint* offset)
{ |
| 309 SkBitmap colorBM; | 335 SkBitmap colorBM; |
| 310 SkIPoint colorOffset = SkIPoint::Make(0, 0); | 336 SkIPoint colorOffset = SkIPoint::Make(0, 0); |
| 311 if (!SkImageFilterUtils::GetInputResultGPU(getColorInput(), proxy, src, ctm,
&colorBM, | 337 if (!SkImageFilterUtils::GetInputResultGPU(getColorInput(), proxy, src, ctm,
&colorBM, |
| 312 &colorOffset)) { | 338 &colorOffset)) { |
| 313 return false; | 339 return false; |
| 314 } | 340 } |
| 315 GrTexture* color = colorBM.getTexture(); | 341 GrTexture* color = colorBM.getTexture(); |
| 316 SkBitmap displacementBM; | 342 SkBitmap displacementBM; |
| 317 SkIPoint displacementOffset = SkIPoint::Make(0, 0); | 343 SkIPoint displacementOffset = SkIPoint::Make(0, 0); |
| 318 if (!SkImageFilterUtils::GetInputResultGPU(getDisplacementInput(), proxy, sr
c, ctm, | 344 if (!SkImageFilterUtils::GetInputResultGPU(getDisplacementInput(), proxy, sr
c, ctm, |
| 319 &displacementBM, &displacementOff
set)) { | 345 &displacementBM, &displacementOff
set)) { |
| 320 return false; | 346 return false; |
| 321 } | 347 } |
| 322 GrTexture* displacement = displacementBM.getTexture(); | 348 GrTexture* displacement = displacementBM.getTexture(); |
| 323 GrContext* context = color->getContext(); | 349 GrContext* context = color->getContext(); |
| 324 | 350 |
| 325 GrTextureDesc desc; | 351 GrTextureDesc desc; |
| 326 desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit; | 352 desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit; |
| 327 desc.fWidth = src.width(); | 353 desc.fWidth = colorBM.width(); |
| 328 desc.fHeight = src.height(); | 354 desc.fHeight = colorBM.height(); |
| 329 desc.fConfig = kSkia8888_GrPixelConfig; | 355 desc.fConfig = kSkia8888_GrPixelConfig; |
| 330 | 356 |
| 331 GrAutoScratchTexture ast(context, desc); | 357 GrAutoScratchTexture ast(context, desc); |
| 332 SkAutoTUnref<GrTexture> dst(ast.detach()); | 358 SkAutoTUnref<GrTexture> dst(ast.detach()); |
| 333 | 359 |
| 334 GrContext::AutoRenderTarget art(context, dst->asRenderTarget()); | 360 GrContext::AutoRenderTarget art(context, dst->asRenderTarget()); |
| 335 | 361 |
| 336 GrPaint paint; | 362 SkVector scale = SkVector::Make(fScale, fScale); |
| 337 paint.addColorEffect( | 363 ctm.mapVectors(&scale, 1); |
| 338 GrDisplacementMapEffect::Create(fXChannelSelector, | |
| 339 fYChannelSelector, | |
| 340 fScale, | |
| 341 displacement, | |
| 342 color))->unref(); | |
| 343 SkIRect bounds; | 364 SkIRect bounds; |
| 344 src.getBounds(&bounds); | 365 colorBM.getBounds(&bounds); |
| 366 bounds.offset(colorOffset); |
| 345 if (!this->applyCropRect(&bounds, ctm)) { | 367 if (!this->applyCropRect(&bounds, ctm)) { |
| 346 return false; | 368 return false; |
| 347 } | 369 } |
| 348 SkIRect displBounds; | 370 SkIRect displBounds; |
| 349 displacementBM.getBounds(&displBounds); | 371 displacementBM.getBounds(&displBounds); |
| 372 displBounds.offset(displacementOffset); |
| 350 if (!this->applyCropRect(&displBounds, ctm)) { | 373 if (!this->applyCropRect(&displBounds, ctm)) { |
| 351 return false; | 374 return false; |
| 352 } | 375 } |
| 353 if (!bounds.intersect(displBounds)) { | 376 if (!bounds.intersect(displBounds)) { |
| 354 return false; | 377 return false; |
| 355 } | 378 } |
| 356 SkRect srcRect = SkRect::Make(bounds); | 379 |
| 357 SkRect dstRect = SkRect::MakeWH(srcRect.width(), srcRect.height()); | 380 GrPaint paint; |
| 358 context->drawRectToRect(paint, dstRect, srcRect); | 381 SkMatrix offsetMatrix = GrEffect::MakeDivByTextureWHMatrix(displacement); |
| 382 offsetMatrix.preTranslate(SkIntToScalar(colorOffset.fX - displacementOffset.
fX), |
| 383 SkIntToScalar(colorOffset.fY - displacementOffset.
fY)); |
| 384 |
| 385 paint.addColorEffect( |
| 386 GrDisplacementMapEffect::Create(fXChannelSelector, |
| 387 fYChannelSelector, |
| 388 scale, |
| 389 displacement, |
| 390 offsetMatrix, |
| 391 color))->unref(); |
| 392 SkIRect colorBounds = bounds; |
| 393 colorBounds.offset(-colorOffset); |
| 394 SkMatrix matrix; |
| 395 matrix.setTranslate(-SkIntToScalar(colorBounds.x()), |
| 396 -SkIntToScalar(colorBounds.y())); |
| 397 context->concatMatrix(matrix); |
| 398 context->drawRect(paint, SkRect::Make(colorBounds)); |
| 359 offset->fX = bounds.left(); | 399 offset->fX = bounds.left(); |
| 360 offset->fY = bounds.top(); | 400 offset->fY = bounds.top(); |
| 361 return SkImageFilterUtils::WrapTexture(dst, bounds.width(), bounds.height(),
result); | 401 return SkImageFilterUtils::WrapTexture(dst, bounds.width(), bounds.height(),
result); |
| 362 } | 402 } |
| 363 | 403 |
| 364 /////////////////////////////////////////////////////////////////////////////// | 404 /////////////////////////////////////////////////////////////////////////////// |
| 365 | 405 |
| 366 GrDisplacementMapEffect::GrDisplacementMapEffect( | 406 GrDisplacementMapEffect::GrDisplacementMapEffect( |
| 367 SkDisplacementMapEffect::ChannelSelectorType xChann
elSelector, | 407 SkDisplacementMapEffect::ChannelSelectorType xChann
elSelector, |
| 368 SkDisplacementMapEffect::ChannelSelectorType yChann
elSelector, | 408 SkDisplacementMapEffect::ChannelSelectorType yChann
elSelector, |
| 369 SkScalar scale, | 409 const SkVector& scale, |
| 370 GrTexture* displacement, | 410 GrTexture* displacement, |
| 411 const SkMatrix& offsetMatrix, |
| 371 GrTexture* color) | 412 GrTexture* color) |
| 372 : fDisplacementTransform(kLocal_GrCoordSet, displacement) | 413 : fDisplacementTransform(kLocal_GrCoordSet, offsetMatrix, displacement) |
| 373 , fDisplacementAccess(displacement) | 414 , fDisplacementAccess(displacement) |
| 374 , fColorTransform(kLocal_GrCoordSet, color) | 415 , fColorTransform(kLocal_GrCoordSet, 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); |
| (...skipping 38 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]); |
| 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 |