Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/effects/SkDisplacementMapEffect.cpp

Issue 137053003: Apply the CTM to filter parameters for 4 pixel-moving filters. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Fixed 100-col issues Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/effects/SkBlurImageFilter.cpp ('k') | src/effects/SkDropShadowImageFilter.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/effects/SkBlurImageFilter.cpp ('k') | src/effects/SkDropShadowImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698