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

Side by Side Diff: src/effects/SkDropShadowImageFilter.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 "SkDropShadowImageFilter.h" 8 #include "SkDropShadowImageFilter.h"
9 9
10 #include "SkBitmap.h" 10 #include "SkBitmap.h"
11 #include "SkBlurImageFilter.h" 11 #include "SkBlurImageFilter.h"
12 #include "SkCanvas.h" 12 #include "SkCanvas.h"
13 #include "SkColorMatrixFilter.h" 13 #include "SkColorMatrixFilter.h"
14 #include "SkDevice.h" 14 #include "SkDevice.h"
15 #include "SkFlattenableBuffers.h" 15 #include "SkFlattenableBuffers.h"
16 16
17 SkDropShadowImageFilter::SkDropShadowImageFilter(SkScalar dx, SkScalar dy, SkSca lar sigma, SkColor color, SkImageFilter* input) 17 SkDropShadowImageFilter::SkDropShadowImageFilter(SkScalar dx, SkScalar dy, SkSca lar sigma, SkColor color, SkImageFilter* input)
18 : INHERITED(input) 18 : INHERITED(input)
19 , fDx(dx) 19 , fOffset(SkVector::Make(dx, dy))
20 , fDy(dy) 20 , fSigma(SkVector::Make(sigma, sigma))
21 , fSigmaX(sigma)
22 , fSigmaY(sigma)
23 , fColor(color) 21 , fColor(color)
24 { 22 {
25 } 23 }
26 24
27 SkDropShadowImageFilter::SkDropShadowImageFilter(SkScalar dx, SkScalar dy, SkSca lar sigmaX, SkScalar sigmaY, SkColor color, SkImageFilter* input, const CropRect * cropRect) 25 SkDropShadowImageFilter::SkDropShadowImageFilter(SkScalar dx, SkScalar dy, SkSca lar sigmaX, SkScalar sigmaY, SkColor color, SkImageFilter* input, const CropRect * cropRect)
28 : INHERITED(input, cropRect) 26 : INHERITED(input, cropRect)
29 , fDx(dx) 27 , fOffset(SkVector::Make(dx, dy))
30 , fDy(dy) 28 , fSigma(SkVector::Make(sigmaX, sigmaY))
31 , fSigmaX(sigmaX)
32 , fSigmaY(sigmaY)
33 , fColor(color) 29 , fColor(color)
34 { 30 {
35 } 31 }
36 32
37 SkDropShadowImageFilter::SkDropShadowImageFilter(SkFlattenableReadBuffer& buffer ) 33 SkDropShadowImageFilter::SkDropShadowImageFilter(SkFlattenableReadBuffer& buffer )
38 : INHERITED(1, buffer) { 34 : INHERITED(1, buffer) {
39 fDx = buffer.readScalar(); 35 buffer.readPoint(&fOffset);
40 fDy = buffer.readScalar(); 36 buffer.readPoint(&fSigma);
41 fSigmaX = buffer.readScalar();
42 fSigmaY = buffer.readScalar();
43 fColor = buffer.readColor(); 37 fColor = buffer.readColor();
44 buffer.validate(SkScalarIsFinite(fDx) && 38 buffer.validate(SkScalarIsFinite(fOffset.fX) &&
45 SkScalarIsFinite(fDy) && 39 SkScalarIsFinite(fOffset.fY) &&
46 SkScalarIsFinite(fSigmaX) && 40 SkScalarIsFinite(fSigma.fX) &&
47 SkScalarIsFinite(fSigmaY)); 41 SkScalarIsFinite(fSigma.fY));
48 } 42 }
49 43
50 void SkDropShadowImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const 44 void SkDropShadowImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const
51 { 45 {
52 this->INHERITED::flatten(buffer); 46 this->INHERITED::flatten(buffer);
53 buffer.writeScalar(fDx); 47 buffer.writePoint(fOffset);
54 buffer.writeScalar(fDy); 48 buffer.writePoint(fSigma);
55 buffer.writeScalar(fSigmaX);
56 buffer.writeScalar(fSigmaY);
57 buffer.writeColor(fColor); 49 buffer.writeColor(fColor);
58 } 50 }
59 51
60 bool SkDropShadowImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source , const SkMatrix& matrix, SkBitmap* result, SkIPoint* offset) 52 bool SkDropShadowImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source , const SkMatrix& matrix, SkBitmap* result, SkIPoint* offset)
61 { 53 {
62 SkBitmap src = source; 54 SkBitmap src = source;
63 SkIPoint srcOffset = SkIPoint::Make(0, 0); 55 SkIPoint srcOffset = SkIPoint::Make(0, 0);
64 if (getInput(0) && !getInput(0)->filterImage(proxy, source, matrix, &src, &s rcOffset)) 56 if (getInput(0) && !getInput(0)->filterImage(proxy, source, matrix, &src, &s rcOffset))
65 return false; 57 return false;
66 58
67 SkIRect bounds; 59 SkIRect bounds;
68 src.getBounds(&bounds); 60 src.getBounds(&bounds);
69 bounds.offset(srcOffset); 61 bounds.offset(srcOffset);
70 if (!this->applyCropRect(&bounds, matrix)) { 62 if (!this->applyCropRect(&bounds, matrix)) {
71 return false; 63 return false;
72 } 64 }
73 65
74 SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds .height())); 66 SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds .height()));
75 if (NULL == device.get()) { 67 if (NULL == device.get()) {
76 return false; 68 return false;
77 } 69 }
78 SkCanvas canvas(device.get()); 70 SkCanvas canvas(device.get());
79 71
80 SkAutoTUnref<SkImageFilter> blurFilter(new SkBlurImageFilter(fSigmaX, fSigma Y)); 72 SkVector sigma;
73 matrix.mapVectors(&sigma, &fSigma, 1);
74 SkAutoTUnref<SkImageFilter> blurFilter(new SkBlurImageFilter(sigma.fX, sigma .fY));
81 SkAutoTUnref<SkColorFilter> colorFilter(SkColorFilter::CreateModeFilter(fCol or, SkXfermode::kSrcIn_Mode)); 75 SkAutoTUnref<SkColorFilter> colorFilter(SkColorFilter::CreateModeFilter(fCol or, SkXfermode::kSrcIn_Mode));
82 SkPaint paint; 76 SkPaint paint;
83 paint.setImageFilter(blurFilter.get()); 77 paint.setImageFilter(blurFilter.get());
84 paint.setColorFilter(colorFilter.get()); 78 paint.setColorFilter(colorFilter.get());
85 paint.setXfermodeMode(SkXfermode::kSrcOver_Mode); 79 paint.setXfermodeMode(SkXfermode::kSrcOver_Mode);
80 SkVector offsetVec;
81 matrix.mapVectors(&offsetVec, &fOffset, 1);
86 canvas.translate(-SkIntToScalar(bounds.fLeft), -SkIntToScalar(bounds.fTop)); 82 canvas.translate(-SkIntToScalar(bounds.fLeft), -SkIntToScalar(bounds.fTop));
87 canvas.drawBitmap(src, fDx, fDy, &paint); 83 canvas.drawBitmap(src, offsetVec.fX, offsetVec.fY, &paint);
88 canvas.drawBitmap(src, 0, 0); 84 canvas.drawBitmap(src, 0, 0);
89 *result = device->accessBitmap(false); 85 *result = device->accessBitmap(false);
90 offset->fX = bounds.fLeft; 86 offset->fX = bounds.fLeft;
91 offset->fY = bounds.fTop; 87 offset->fY = bounds.fTop;
92 return true; 88 return true;
93 } 89 }
OLDNEW
« src/effects/SkDisplacementMapEffect.cpp ('K') | « src/effects/SkDisplacementMapEffect.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698