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

Side by Side Diff: gm/imagefilterscropped.cpp

Issue 781153002: Fix Morphology effects sourcing outside of the crop rect. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years 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 | « no previous file | src/effects/SkGpuBlurUtils.cpp » ('j') | src/effects/SkGpuBlurUtils.cpp » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 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 "gm.h" 8 #include "gm.h"
9 #include "SkCanvas.h" 9 #include "SkCanvas.h"
10 #include "SkColorFilter.h" 10 #include "SkColorFilter.h"
11 #include "SkColorPriv.h" 11 #include "SkColorPriv.h"
12 #include "SkShader.h" 12 #include "SkShader.h"
13 13
14 #include "SkBlurImageFilter.h" 14 #include "SkBlurImageFilter.h"
15 #include "SkMorphologyImageFilter.h"
15 #include "SkColorFilterImageFilter.h" 16 #include "SkColorFilterImageFilter.h"
17 #include "SkBitmapSource.h"
16 #include "SkMergeImageFilter.h" 18 #include "SkMergeImageFilter.h"
17 #include "SkOffsetImageFilter.h" 19 #include "SkOffsetImageFilter.h"
18 #include "SkTestImageFilters.h" 20 #include "SkTestImageFilters.h"
19 21
20 /////////////////////////////////////////////////////////////////////////////// 22 ///////////////////////////////////////////////////////////////////////////////
21 23
22 static void draw_paint(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) { 24 static void draw_paint(SkCanvas* canvas, const SkRect& r, SkImageFilter* imf) {
23 SkPaint paint; 25 SkPaint paint;
24 paint.setImageFilter(imf); 26 paint.setImageFilter(imf);
25 paint.setColor(SK_ColorBLACK); 27 paint.setColor(SK_ColorBLACK);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 public: 104 public:
103 ImageFiltersCroppedGM () {} 105 ImageFiltersCroppedGM () {}
104 106
105 protected: 107 protected:
106 virtual SkString onShortName() { 108 virtual SkString onShortName() {
107 return SkString("imagefilterscropped"); 109 return SkString("imagefilterscropped");
108 } 110 }
109 111
110 virtual SkISize onISize() { return SkISize::Make(400, 640); } 112 virtual SkISize onISize() { return SkISize::Make(400, 640); }
111 113
114 void make_checkerboard() {
115 fCheckerboard.allocN32Pixels(80, 80);
116 SkCanvas canvas(fCheckerboard);
117 canvas.clear(0x00000000);
Justin Novosad 2014/12/22 20:11:11 0 -> SK_ColorTRANSPARENT
cwallez 2015/01/19 21:34:38 Done.
118 SkPaint darkPaint;
119 darkPaint.setColor(0xFF404040);
120 SkPaint lightPaint;
121 lightPaint.setColor(0xFFA0A0A0);
122 for (int y = 0; y < 80; y += 16) {
123 for (int x = 0; x < 80; x += 16) {
124 canvas.save();
125 canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
126 canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
127 canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
128 canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
129 canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
130 canvas.restore();
131 }
132 }
133 }
134
112 void draw_frame(SkCanvas* canvas, const SkRect& r) { 135 void draw_frame(SkCanvas* canvas, const SkRect& r) {
113 SkPaint paint; 136 SkPaint paint;
114 paint.setStyle(SkPaint::kStroke_Style); 137 paint.setStyle(SkPaint::kStroke_Style);
115 paint.setColor(SK_ColorRED); 138 paint.setColor(SK_ColorRED);
116 canvas->drawRect(r, paint); 139 canvas->drawRect(r, paint);
117 } 140 }
118 141
119 virtual uint32_t onGetFlags() const { 142 virtual uint32_t onGetFlags() const {
120 // Because of the use of drawSprite, this test is excluded 143 // Because of the use of drawSprite, this test is excluded
121 // from scaled replay tests because drawSprite ignores the 144 // from scaled replay tests because drawSprite ignores the
122 // reciprocal scale that is applied at record time, which is 145 // reciprocal scale that is applied at record time, which is
123 // the intended behavior of drawSprite. 146 // the intended behavior of drawSprite.
124 return kSkipScaledReplay_Flag | kSkipTiled_Flag; 147 return kSkipScaledReplay_Flag | kSkipTiled_Flag;
125 } 148 }
126 149
150 virtual void onOnceBeforeDraw() SK_OVERRIDE{
151 make_checkerboard();
152 }
153
127 virtual void onDraw(SkCanvas* canvas) { 154 virtual void onDraw(SkCanvas* canvas) {
128 void (*drawProc[])(SkCanvas*, const SkRect&, SkImageFilter*) = { 155 void (*drawProc[])(SkCanvas*, const SkRect&, SkImageFilter*) = {
129 draw_sprite, draw_bitmap, draw_path, draw_paint, draw_text 156 draw_sprite, draw_bitmap, draw_path, draw_paint, draw_text
130 }; 157 };
131 158
132 SkAutoTUnref<SkColorFilter> cf( 159 SkAutoTUnref<SkColorFilter> cf(
133 SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mod e)); 160 SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mod e));
134 SkImageFilter::CropRect cropRect(SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)), SkImageFilter::CropRect::kHasAll_CropEdge); 161 SkImageFilter::CropRect cropRect(SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)), SkImageFilter::CropRect::kHasAll_CropEdge);
135 SkImageFilter::CropRect bogusRect(SkRect::Make(SkIRect::MakeXYWH(-100, - 100, 10, 10)), SkImageFilter::CropRect::kHasAll_CropEdge); 162 SkImageFilter::CropRect bogusRect(SkRect::Make(SkIRect::MakeXYWH(-100, - 100, 10, 10)), SkImageFilter::CropRect::kHasAll_CropEdge);
136 163
137 SkAutoTUnref<SkImageFilter> offset(SkOffsetImageFilter::Create( 164 SkAutoTUnref<SkImageFilter> offset(SkOffsetImageFilter::Create(
138 SkIntToScalar(-10), SkIntToScalar(-10))); 165 SkIntToScalar(-10), SkIntToScalar(-10)));
139 166
140 SkAutoTUnref<SkImageFilter> cfOffset(SkColorFilterImageFilter::Create(cf .get(), offset.get())); 167 SkAutoTUnref<SkImageFilter> cfOffset(SkColorFilterImageFilter::Create(cf .get(), offset.get()));
141
142 SkImageFilter* filters[] = { 168 SkImageFilter* filters[] = {
143 NULL, 169 NULL,
144 SkColorFilterImageFilter::Create(cf.get(), NULL, &cropRect), 170 SkColorFilterImageFilter::Create(cf.get(), NULL, &cropRect),
145 SkBlurImageFilter::Create(1.0f, 1.0f, NULL, &cropRect), 171 SkErodeImageFilter::Create(1, 1, NULL, &cropRect),
146 SkBlurImageFilter::Create(8.0f, 0.0f, NULL, &cropRect), 172 SkErodeImageFilter::Create(8, 0, SkErodeImageFilter::Create(0, 8, NU LL, &cropRect), &cropRect),
147 SkBlurImageFilter::Create(0.0f, 8.0f, NULL, &cropRect), 173 SkErodeImageFilter::Create(0, 8, SkErodeImageFilter::Create(8, 0, NU LL, &cropRect), &cropRect),
148 SkBlurImageFilter::Create(8.0f, 8.0f, NULL, &cropRect), 174 SkErodeImageFilter::Create(8, 8, NULL, &cropRect),
149 SkMergeImageFilter::Create(NULL, cfOffset.get(), SkXfermode::kSrcOve r_Mode, &cropRect), 175 SkMergeImageFilter::Create(NULL, cfOffset.get(), SkXfermode::kSrcOve r_Mode, &cropRect),
150 SkBlurImageFilter::Create(8.0f, 8.0f, NULL, &bogusRect), 176 SkErodeImageFilter::Create(8, 8, NULL, &bogusRect),
151 SkColorFilterImageFilter::Create(cf.get(), NULL, &bogusRect), 177 SkColorFilterImageFilter::Create(cf.get(), NULL, &bogusRect),
152 }; 178 };
153 179
154 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); 180 SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64));
155 SkScalar MARGIN = SkIntToScalar(16); 181 SkScalar MARGIN = SkIntToScalar(16);
156 SkScalar DX = r.width() + MARGIN; 182 SkScalar DX = r.width() + MARGIN;
157 SkScalar DY = r.height() + MARGIN; 183 SkScalar DY = r.height() + MARGIN;
158 184
159 canvas->translate(MARGIN, MARGIN); 185 canvas->translate(MARGIN, MARGIN);
160 for (size_t j = 0; j < SK_ARRAY_COUNT(drawProc); ++j) { 186 for (size_t j = 0; j < SK_ARRAY_COUNT(drawProc); ++j) {
161 canvas->save(); 187 canvas->save();
162 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { 188 for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
189 SkPaint paint;
190 canvas->drawBitmap(fCheckerboard, 0, 0);
163 drawProc[j](canvas, r, filters[i]); 191 drawProc[j](canvas, r, filters[i]);
164 canvas->translate(0, DY); 192 canvas->translate(0, DY);
165 } 193 }
166 canvas->restore(); 194 canvas->restore();
167 canvas->translate(DX, 0); 195 canvas->translate(DX, 0);
168 } 196 }
169 197
170 for(size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) { 198 for(size_t j = 0; j < SK_ARRAY_COUNT(filters); ++j) {
171 SkSafeUnref(filters[j]); 199 SkSafeUnref(filters[j]);
172 } 200 }
173 } 201 }
174 202
175 private: 203 private:
204 SkBitmap fCheckerboard;
176 typedef GM INHERITED; 205 typedef GM INHERITED;
177 }; 206 };
178 207
179 /////////////////////////////////////////////////////////////////////////////// 208 ///////////////////////////////////////////////////////////////////////////////
180 209
181 static skiagm::GM* MyFactory(void*) { return new ImageFiltersCroppedGM; } 210 static skiagm::GM* MyFactory(void*) { return new ImageFiltersCroppedGM; }
182 static skiagm::GMRegistry reg(MyFactory); 211 static skiagm::GMRegistry reg(MyFactory);
OLDNEW
« no previous file with comments | « no previous file | src/effects/SkGpuBlurUtils.cpp » ('j') | src/effects/SkGpuBlurUtils.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698