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 |