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

Side by Side Diff: gm/spritebitmap.cpp

Issue 1390913005: add applyFilter() to SkImage (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 2 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
« no previous file with comments | « no previous file | include/core/SkDevice.h » ('j') | include/core/SkImageFilter.h » ('J')
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 "gm.h" 8 #include "gm.h"
9 #include "SkCanvas.h" 9 #include "SkCanvas.h"
10 #include "SkBlurImageFilter.h" 10 #include "SkBlurImageFilter.h"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 draw_2_bitmaps(canvas, bm, true, dx, dy); 90 draw_2_bitmaps(canvas, bm, true, dx, dy);
91 dy += bm.height() + 20; 91 dy += bm.height() + 20;
92 draw_2_bitmaps(canvas, bm, true, dx, dy, filter); 92 draw_2_bitmaps(canvas, bm, true, dx, dy, filter);
93 } 93 }
94 94
95 private: 95 private:
96 typedef GM INHERITED; 96 typedef GM INHERITED;
97 }; 97 };
98 DEF_GM( return new SpriteBitmapGM; ) 98 DEF_GM( return new SpriteBitmapGM; )
99 99
100 //////////////////////////////////////////////////////////////////////////////// ///////////////////
101
102 #include "SkColorFilterImageFilter.h"
103 #include "SkModeColorFilter.h"
104 #include "SkMorphologyImageFilter.h"
105 #include "SkOffsetImageFilter.h"
106
107 static SkImage* make_image(SkCanvas* rootCanvas) {
108 SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
109 SkAutoTUnref<SkSurface> surface(rootCanvas->newSurface(info));
110 if (!surface) {
111 surface.reset(SkSurface::NewRaster(info));
112 }
113
114 SkPaint paint;
115 paint.setAntiAlias(true);
116 paint.setColor(SK_ColorRED);
117 surface->getCanvas()->drawCircle(50, 50, 50, paint);
118 return surface->newImageSnapshot();
119 }
120
121 static void show_image(SkCanvas* canvas, SkImage* image, const SkIPoint& offset) {
122 SkScalar x = SkIntToScalar(offset.x());
123 SkScalar y = SkIntToScalar(offset.y());
124
125 SkPaint paint;
126 paint.setColor(sk_tool_utils::color_to_565(0xFFEEEEEE));
127
128 SkRect r = SkRect::MakeIWH(image->width(), image->height());
129 r.offset(x, y);
130 canvas->drawRect(r, paint);
131
132 canvas->drawImage(image, x, y, nullptr);
133 }
134
135 typedef SkImageFilter* (*ImageFilterFactory)();
136
137 // +[]{...} did not work on windows (VS)
138 // (ImageFilterFactory)[]{...} did not work on linux (gcc)
139 // hence this cast function
140 template <typename T> ImageFilterFactory IFCCast(T arg) { return arg; }
141
142 /**
143 * Compare output of drawSprite and drawBitmap (esp. clipping and imagefilters)
144 */
145 class ApplyFilterGM : public skiagm::GM {
146 public:
147 ApplyFilterGM() {}
148
149 protected:
150 SkString onShortName() override {
151 return SkString("apply-filter");
152 }
153
154 SkISize onISize() override {
155 return SkISize::Make(640, 480);
156 }
157
158 void onDraw(SkCanvas* canvas) override {
159 SkAutoTUnref<SkImage> image0(make_image(canvas));
160
161 const ImageFilterFactory factories[] = {
162 IFCCast([]{ return SkBlurImageFilter::Create(8, 8); }),
163 IFCCast([]{ SkAutoTUnref<SkColorFilter> cf(new SkModeColorFilter(SK_ ColorBLUE,
164 SkXfermode: :kSrcIn_Mode));
165 return (SkImageFilter*)SkColorFilterImageFilter::Create(cf);
166 }),
167 IFCCast([]{ return SkDilateImageFilter::Create(8, 8); }),
168 IFCCast([]{ return SkErodeImageFilter::Create(8, 8); }),
169 IFCCast([]{ return SkOffsetImageFilter::Create(8, 8); }),
170 };
171
172 const SkScalar spacer = image0->width() * 3.0f / 2;
173
174 for (auto&& factory : factories) {
175 SkAutoTUnref<SkImageFilter> filter(factory());
176
177 SkIPoint offset1, offset2;
178 SkAutoTUnref<SkImage> image1(image0->applyFilter(filter, &offset1, t rue));
179 SkAutoTUnref<SkImage> image2(image0->applyFilter(filter, &offset2, f alse));
180
181 canvas->save();
182 canvas->translate(30, 30);
183 show_image(canvas, image0, SkIPoint::Make(0, 0)); // original
184 canvas->translate(spacer, 0);
185 show_image(canvas, image1, offset1); // snug
186 canvas->translate(spacer, 0);
187 show_image(canvas, image2, offset2); // not snug
188
189 // Try drawing the original w/ the filter, to see that it "draws" th e same as
190 // when we have manually applied the filter (above).
191 {
192 SkPaint paint;
193 paint.setImageFilter(filter);
194
195 SkBitmap bm;
196 image0->asLegacyBitmap(&bm, SkImage::kRO_LegacyBitmapMode);
197 SkPoint loc = { 0, 0 };
198 canvas->translate(spacer, 0);
199 canvas->getTotalMatrix().mapPoints(&loc, 1);
200 canvas->drawSprite(bm, (int)loc.x(), (int)loc.y(), &paint); // l ike snug
201
202 canvas->translate(spacer, 0);
203 canvas->drawImage(image0, 0, 0, &paint); // like not snug
204 }
205 canvas->restore();
206
207 canvas->translate(0, spacer);
208 }
209 }
210
211 private:
212 typedef GM INHERITED;
213 };
214 DEF_GM( return new ApplyFilterGM; )
215
OLDNEW
« no previous file with comments | « no previous file | include/core/SkDevice.h » ('j') | include/core/SkImageFilter.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698