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

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: Fix displacement offsets, GM clipping, colors 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
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& 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
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
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
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
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
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

Powered by Google App Engine
This is Rietveld 408576698