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

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

Issue 646213004: Adding an option to render only the shadow in SkDropShadowImageFilter (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Added dropshadowimagefilter to ignored-tests Created 6 years, 1 month 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
« no previous file with comments | « src/core/SkReadBuffer.h ('k') | tests/ImageFilterTest.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 "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 "SkReadBuffer.h" 15 #include "SkReadBuffer.h"
16 #include "SkWriteBuffer.h" 16 #include "SkWriteBuffer.h"
17 17
18 SkDropShadowImageFilter::SkDropShadowImageFilter(SkScalar dx, SkScalar dy, 18 SkDropShadowImageFilter::SkDropShadowImageFilter(SkScalar dx, SkScalar dy,
19 SkScalar sigmaX, SkScalar sigma Y, SkColor color, 19 SkScalar sigmaX, SkScalar sigma Y, SkColor color,
20 SkImageFilter* input, const Cro pRect* cropRect, 20 ShadowMode shadowMode, SkImageF ilter* input,
21 uint32_t uniqueID) 21 const CropRect* cropRect, uint3 2_t uniqueID)
22 : INHERITED(1, &input, cropRect, uniqueID) 22 : INHERITED(1, &input, cropRect, uniqueID)
23 , fDx(dx) 23 , fDx(dx)
24 , fDy(dy) 24 , fDy(dy)
25 , fSigmaX(sigmaX) 25 , fSigmaX(sigmaX)
26 , fSigmaY(sigmaY) 26 , fSigmaY(sigmaY)
27 , fColor(color) 27 , fColor(color)
28 , fShadowMode(shadowMode)
28 { 29 {
29 } 30 }
30 31
31 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING 32 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
32 SkDropShadowImageFilter::SkDropShadowImageFilter(SkReadBuffer& buffer) 33 SkDropShadowImageFilter::SkDropShadowImageFilter(SkReadBuffer& buffer)
33 : INHERITED(1, buffer) { 34 : INHERITED(1, buffer) {
34 fDx = buffer.readScalar(); 35 fDx = buffer.readScalar();
35 fDy = buffer.readScalar(); 36 fDy = buffer.readScalar();
36 fSigmaX = buffer.readScalar(); 37 fSigmaX = buffer.readScalar();
37 fSigmaY = buffer.readScalar(); 38 fSigmaY = buffer.readScalar();
38 fColor = buffer.readColor(); 39 fColor = buffer.readColor();
40 fShadowMode = buffer.isVersionLT(SkReadBuffer::kDropShadowMode_Version) ?
41 kDrawShadowAndForeground_ShadowMode :
42 static_cast<ShadowMode>(buffer.readInt());
39 buffer.validate(SkScalarIsFinite(fDx) && 43 buffer.validate(SkScalarIsFinite(fDx) &&
40 SkScalarIsFinite(fDy) && 44 SkScalarIsFinite(fDy) &&
41 SkScalarIsFinite(fSigmaX) && 45 SkScalarIsFinite(fSigmaX) &&
42 SkScalarIsFinite(fSigmaY)); 46 SkScalarIsFinite(fSigmaY));
43 } 47 }
44 #endif 48 #endif
45 49
46 SkFlattenable* SkDropShadowImageFilter::CreateProc(SkReadBuffer& buffer) { 50 SkFlattenable* SkDropShadowImageFilter::CreateProc(SkReadBuffer& buffer) {
47 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); 51 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
48 SkScalar dx = buffer.readScalar(); 52 SkScalar dx = buffer.readScalar();
49 SkScalar dy = buffer.readScalar(); 53 SkScalar dy = buffer.readScalar();
50 SkScalar sigmaX = buffer.readScalar(); 54 SkScalar sigmaX = buffer.readScalar();
51 SkScalar sigmaY = buffer.readScalar(); 55 SkScalar sigmaY = buffer.readScalar();
52 SkColor color = buffer.readColor(); 56 SkColor color = buffer.readColor();
53 return Create(dx, dy, sigmaX, sigmaY, color, common.getInput(0), &common.cro pRect(), common.uniqueID()); 57 ShadowMode shadowMode = buffer.isVersionLT(SkReadBuffer::kDropShadowMode_Ver sion) ?
58 kDrawShadowAndForeground_ShadowMode :
59 static_cast<ShadowMode>(buffer.readInt());
60 return Create(dx, dy, sigmaX, sigmaY, color, shadowMode, common.getInput(0),
61 &common.cropRect(), common.uniqueID());
54 } 62 }
55 63
56 void SkDropShadowImageFilter::flatten(SkWriteBuffer& buffer) const { 64 void SkDropShadowImageFilter::flatten(SkWriteBuffer& buffer) const {
57 this->INHERITED::flatten(buffer); 65 this->INHERITED::flatten(buffer);
58 buffer.writeScalar(fDx); 66 buffer.writeScalar(fDx);
59 buffer.writeScalar(fDy); 67 buffer.writeScalar(fDy);
60 buffer.writeScalar(fSigmaX); 68 buffer.writeScalar(fSigmaX);
61 buffer.writeScalar(fSigmaY); 69 buffer.writeScalar(fSigmaY);
62 buffer.writeColor(fColor); 70 buffer.writeColor(fColor);
71 buffer.writeInt(static_cast<int>(fShadowMode));
63 } 72 }
64 73
65 bool SkDropShadowImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source , 74 bool SkDropShadowImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source ,
66 const Context& ctx, 75 const Context& ctx,
67 SkBitmap* result, SkIPoint* offset) const 76 SkBitmap* result, SkIPoint* offset) const
68 { 77 {
69 SkBitmap src = source; 78 SkBitmap src = source;
70 SkIPoint srcOffset = SkIPoint::Make(0, 0); 79 SkIPoint srcOffset = SkIPoint::Make(0, 0);
71 if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctx, &src, &srcO ffset)) 80 if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctx, &src, &srcO ffset))
72 return false; 81 return false;
(...skipping 18 matching lines...) Expand all
91 SkColorFilter::CreateModeFilter(fColor, SkXfermode::kSrcIn_Mode)); 100 SkColorFilter::CreateModeFilter(fColor, SkXfermode::kSrcIn_Mode));
92 SkPaint paint; 101 SkPaint paint;
93 paint.setImageFilter(blurFilter.get()); 102 paint.setImageFilter(blurFilter.get());
94 paint.setColorFilter(colorFilter.get()); 103 paint.setColorFilter(colorFilter.get());
95 paint.setXfermodeMode(SkXfermode::kSrcOver_Mode); 104 paint.setXfermodeMode(SkXfermode::kSrcOver_Mode);
96 SkVector offsetVec = SkVector::Make(fDx, fDy); 105 SkVector offsetVec = SkVector::Make(fDx, fDy);
97 ctx.ctm().mapVectors(&offsetVec, 1); 106 ctx.ctm().mapVectors(&offsetVec, 1);
98 canvas.translate(SkIntToScalar(srcOffset.fX - bounds.fLeft), 107 canvas.translate(SkIntToScalar(srcOffset.fX - bounds.fLeft),
99 SkIntToScalar(srcOffset.fY - bounds.fTop)); 108 SkIntToScalar(srcOffset.fY - bounds.fTop));
100 canvas.drawBitmap(src, offsetVec.fX, offsetVec.fY, &paint); 109 canvas.drawBitmap(src, offsetVec.fX, offsetVec.fY, &paint);
101 canvas.drawBitmap(src, 0, 0); 110 if (fShadowMode == kDrawShadowAndForeground_ShadowMode) {
111 canvas.drawBitmap(src, 0, 0);
112 }
102 *result = device->accessBitmap(false); 113 *result = device->accessBitmap(false);
103 offset->fX = bounds.fLeft; 114 offset->fX = bounds.fLeft;
104 offset->fY = bounds.fTop; 115 offset->fY = bounds.fTop;
105 return true; 116 return true;
106 } 117 }
107 118
108 void SkDropShadowImageFilter::computeFastBounds(const SkRect& src, SkRect* dst) const { 119 void SkDropShadowImageFilter::computeFastBounds(const SkRect& src, SkRect* dst) const {
109 if (getInput(0)) { 120 if (getInput(0)) {
110 getInput(0)->computeFastBounds(src, dst); 121 getInput(0)->computeFastBounds(src, dst);
111 } else { 122 } else {
112 *dst = src; 123 *dst = src;
113 } 124 }
114 125
115 SkRect shadowBounds = *dst; 126 SkRect shadowBounds = *dst;
116 shadowBounds.offset(fDx, fDy); 127 shadowBounds.offset(fDx, fDy);
117 shadowBounds.outset(SkScalarMul(fSigmaX, SkIntToScalar(3)), 128 shadowBounds.outset(SkScalarMul(fSigmaX, SkIntToScalar(3)),
118 SkScalarMul(fSigmaY, SkIntToScalar(3))); 129 SkScalarMul(fSigmaY, SkIntToScalar(3)));
119 dst->join(shadowBounds); 130 if (fShadowMode == kDrawShadowAndForeground_ShadowMode) {
131 dst->join(shadowBounds);
132 } else {
133 *dst = shadowBounds;
134 }
120 } 135 }
121 136
122 bool SkDropShadowImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm, 137 bool SkDropShadowImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm,
123 SkIRect* dst) const { 138 SkIRect* dst) const {
124 SkIRect bounds = src; 139 SkIRect bounds = src;
125 SkVector offsetVec = SkVector::Make(fDx, fDy); 140 SkVector offsetVec = SkVector::Make(fDx, fDy);
126 ctm.mapVectors(&offsetVec, 1); 141 ctm.mapVectors(&offsetVec, 1);
127 bounds.offset(-SkScalarCeilToInt(offsetVec.x()), 142 bounds.offset(-SkScalarCeilToInt(offsetVec.x()),
128 -SkScalarCeilToInt(offsetVec.y())); 143 -SkScalarCeilToInt(offsetVec.y()));
129 SkVector sigma = SkVector::Make(fSigmaX, fSigmaY); 144 SkVector sigma = SkVector::Make(fSigmaX, fSigmaY);
130 ctm.mapVectors(&sigma, 1); 145 ctm.mapVectors(&sigma, 1);
131 bounds.outset(SkScalarCeilToInt(SkScalarMul(sigma.x(), SkIntToScalar(3))), 146 bounds.outset(SkScalarCeilToInt(SkScalarMul(sigma.x(), SkIntToScalar(3))),
132 SkScalarCeilToInt(SkScalarMul(sigma.y(), SkIntToScalar(3)))); 147 SkScalarCeilToInt(SkScalarMul(sigma.y(), SkIntToScalar(3))));
133 bounds.join(src); 148 if (fShadowMode == kDrawShadowAndForeground_ShadowMode) {
149 bounds.join(src);
150 }
134 if (getInput(0) && !getInput(0)->filterBounds(bounds, ctm, &bounds)) { 151 if (getInput(0) && !getInput(0)->filterBounds(bounds, ctm, &bounds)) {
135 return false; 152 return false;
136 } 153 }
137 *dst = bounds; 154 *dst = bounds;
138 return true; 155 return true;
139 } 156 }
OLDNEW
« no previous file with comments | « src/core/SkReadBuffer.h ('k') | tests/ImageFilterTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698