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 |