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

Side by Side Diff: gm/bleed.cpp

Issue 65133003: [GPU] Use view matrix + rect to implement subrect for drawBitmap when there is a mask filter and ble (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: cleanup Created 7 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/gpu/SkGpuDevice.cpp » ('j') | src/gpu/SkGpuDevice.cpp » ('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 "SkBlurMask.h" 9 #include "SkBlurMask.h"
10 #include "SkBlurMaskFilter.h" 10 #include "SkBlurMaskFilter.h"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 class BleedGM : public skiagm::GM { 86 class BleedGM : public skiagm::GM {
87 public: 87 public:
88 BleedGM() {} 88 BleedGM() {}
89 89
90 protected: 90 protected:
91 virtual SkString onShortName() SK_OVERRIDE { 91 virtual SkString onShortName() SK_OVERRIDE {
92 return SkString("bleed"); 92 return SkString("bleed");
93 } 93 }
94 94
95 virtual SkISize onISize() SK_OVERRIDE { 95 virtual SkISize onISize() SK_OVERRIDE {
96 return SkISize::Make(kWidth, kHeight); 96 return SkISize::Make(kWidth, 780);
97 } 97 }
98 98
99 virtual void onOnceBeforeDraw() SK_OVERRIDE { 99 virtual void onOnceBeforeDraw() SK_OVERRIDE {
100 make_ringed_bitmap(&fBitmapSmall, kSmallTextureSize, kSmallTextureSize); 100 make_ringed_bitmap(&fBitmapSmall, kSmallTextureSize, kSmallTextureSize);
101 101
102 // To exercise the GPU's tiling path we need a texture 102 // To exercise the GPU's tiling path we need a texture
103 // too big for the GPU to handle in one go 103 // too big for the GPU to handle in one go
104 make_ringed_bitmap(&fBitmapBig, 2*kMaxTextureSize, 2*kMaxTextureSize); 104 make_ringed_bitmap(&fBitmapBig, 2*kMaxTextureSize, 2*kMaxTextureSize);
105 } 105 }
106 106
107 // Draw only the center of the small bitmap 107 // Draw only the center of the small bitmap
108 void drawCase1(SkCanvas* canvas, int transX, int transY, 108 void drawCase1(SkCanvas* canvas, int transX, int transY,
109 SkCanvas::DrawBitmapRectFlags flags, SkPaint::FilterLevel fil ter) { 109 SkCanvas::DrawBitmapRectFlags flags, SkPaint::FilterLevel fil ter) {
110 SkRect src = SkRect::MakeXYWH(2, 2, 110 SkRect src = SkRect::MakeXYWH(2, 2,
111 kSmallTextureSize-4, 111 SkIntToScalar(kSmallTextureSize-4),
112 kSmallTextureSize-4); 112 SkIntToScalar(kSmallTextureSize-4));
113 SkRect dst = SkRect::MakeXYWH(0, 0, SkIntToScalar(kBlockSize), SkIntToSc alar(kBlockSize)); 113 SkRect dst = SkRect::MakeXYWH(0, 0, SkIntToScalar(kBlockSize), SkIntToSc alar(kBlockSize));
114 114
115 SkPaint paint; 115 SkPaint paint;
116 paint.setFilterLevel(filter); 116 paint.setFilterLevel(filter);
117 117
118 canvas->save(); 118 canvas->save();
119 canvas->translate(SkIntToScalar(transX), SkIntToScalar(transY)); 119 canvas->translate(SkIntToScalar(transX), SkIntToScalar(transY));
120 canvas->drawBitmapRectToRect(fBitmapSmall, &src, dst, &paint, flags); 120 canvas->drawBitmapRectToRect(fBitmapSmall, &src, dst, &paint, flags);
121 canvas->restore(); 121 canvas->restore();
122 } 122 }
(...skipping 29 matching lines...) Expand all
152 canvas->save(); 152 canvas->save();
153 canvas->translate(SkIntToScalar(transX), SkIntToScalar(transY)); 153 canvas->translate(SkIntToScalar(transX), SkIntToScalar(transY));
154 canvas->drawBitmapRectToRect(fBitmapBig, &src, dst, &paint, flags); 154 canvas->drawBitmapRectToRect(fBitmapBig, &src, dst, &paint, flags);
155 canvas->restore(); 155 canvas->restore();
156 } 156 }
157 157
158 // Draw the center of the small bitmap with a mask filter 158 // Draw the center of the small bitmap with a mask filter
159 void drawCase4(SkCanvas* canvas, int transX, int transY, 159 void drawCase4(SkCanvas* canvas, int transX, int transY,
160 SkCanvas::DrawBitmapRectFlags flags, SkPaint::FilterLevel fil ter) { 160 SkCanvas::DrawBitmapRectFlags flags, SkPaint::FilterLevel fil ter) {
161 SkRect src = SkRect::MakeXYWH(2, 2, 161 SkRect src = SkRect::MakeXYWH(2, 2,
162 kSmallTextureSize-4, 162 SkIntToScalar(kSmallTextureSize-4),
163 kSmallTextureSize-4); 163 SkIntToScalar(kSmallTextureSize-4));
164 SkRect dst = SkRect::MakeXYWH(0, 0, SkIntToScalar(kBlockSize), SkIntToSc alar(kBlockSize)); 164 SkRect dst = SkRect::MakeXYWH(0, 0, SkIntToScalar(kBlockSize), SkIntToSc alar(kBlockSize));
165 165
166 SkPaint paint; 166 SkPaint paint;
167 paint.setFilterLevel(filter); 167 paint.setFilterLevel(filter);
168 SkMaskFilter* mf = SkBlurMaskFilter::Create(SkBlurMaskFilter::kNormal_Bl urStyle, 168 SkMaskFilter* mf = SkBlurMaskFilter::Create(SkBlurMaskFilter::kNormal_Bl urStyle,
169 SkBlurMask::ConvertRadiusToSigma(SkIntT oScalar(3))); 169 SkBlurMask::ConvertRadiusToSigma(SkIntT oScalar(3)));
170 paint.setMaskFilter(mf)->unref(); 170 paint.setMaskFilter(mf)->unref();
171 171
172 canvas->save(); 172 canvas->save();
173 canvas->translate(SkIntToScalar(transX), SkIntToScalar(transY)); 173 canvas->translate(SkIntToScalar(transX), SkIntToScalar(transY));
174 canvas->drawBitmapRectToRect(fBitmapSmall, &src, dst, &paint, flags); 174 canvas->drawBitmapRectToRect(fBitmapSmall, &src, dst, &paint, flags);
175 canvas->restore(); 175 canvas->restore();
176 } 176 }
177 177
178 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 178 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
179 179
180 canvas->clear(SK_ColorGRAY); 180 canvas->clear(SK_ColorGREEN);
181 181
182 // Currently there are no test cases with medium filtering since medium uses mip-mapping and 182 for (int m = 0; m < 2; ++m) {
183 // these draws are always upscaling. 183 canvas->save();
184 if (m) {
185 static const SkScalar kBottom = SkIntToScalar(kRow3Y + kBlockSiz e + kBlockSpacing);
186 canvas->translate(0, kBottom);
187 SkMatrix rotate;
188 rotate.setRotate(15.f, 0, kBottom + kBlockSpacing);
189 canvas->concat(rotate);
190 canvas->scale(0.71f, 1.22f);
191 }
184 192
185 // First draw a column with no bleeding, tiling, or filtering 193 // First draw a column with no bleeding, tiling, or filtering
186 this->drawCase1(canvas, kCol0X, kRow0Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kNone_FilterLevel); 194 this->drawCase1(canvas, kCol0X, kRow0Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kNone_FilterLevel);
187 this->drawCase2(canvas, kCol0X, kRow1Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kNone_FilterLevel); 195 this->drawCase2(canvas, kCol0X, kRow1Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kNone_FilterLevel);
188 this->drawCase3(canvas, kCol0X, kRow2Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kNone_FilterLevel); 196 this->drawCase3(canvas, kCol0X, kRow2Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kNone_FilterLevel);
189 this->drawCase4(canvas, kCol0X, kRow3Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kNone_FilterLevel); 197 this->drawCase4(canvas, kCol0X, kRow3Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kNone_FilterLevel);
190 198
191 // Then draw a column with no bleeding or tiling but with low filtering 199 // Then draw a column with no bleeding or tiling but with low filter ing
192 this->drawCase1(canvas, kCol1X, kRow0Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kLow_FilterLevel); 200 this->drawCase1(canvas, kCol1X, kRow0Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kLow_FilterLevel);
193 this->drawCase2(canvas, kCol1X, kRow1Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kLow_FilterLevel); 201 this->drawCase2(canvas, kCol1X, kRow1Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kLow_FilterLevel);
194 this->drawCase3(canvas, kCol1X, kRow2Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kLow_FilterLevel); 202 this->drawCase3(canvas, kCol1X, kRow2Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kLow_FilterLevel);
195 this->drawCase4(canvas, kCol1X, kRow3Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kLow_FilterLevel); 203 this->drawCase4(canvas, kCol1X, kRow3Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kLow_FilterLevel);
196 204
197 // Then draw a column with no bleeding or tiling but with high filtering 205 // Then draw a column with no bleeding or tiling but with high filte ring
198 this->drawCase1(canvas, kCol2X, kRow0Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kHigh_FilterLevel); 206 this->drawCase1(canvas, kCol2X, kRow0Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kHigh_FilterLevel);
199 this->drawCase2(canvas, kCol2X, kRow1Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kHigh_FilterLevel); 207 this->drawCase2(canvas, kCol2X, kRow1Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kHigh_FilterLevel);
200 this->drawCase3(canvas, kCol2X, kRow2Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kHigh_FilterLevel); 208 this->drawCase3(canvas, kCol2X, kRow2Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kHigh_FilterLevel);
201 this->drawCase4(canvas, kCol2X, kRow3Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kHigh_FilterLevel); 209 this->drawCase4(canvas, kCol2X, kRow3Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kHigh_FilterLevel);
202 210
203 #if SK_SUPPORT_GPU 211 #if SK_SUPPORT_GPU
204 GrContext* ctx = canvas->getGrContext(); 212 GrContext* ctx = canvas->getGrContext();
205 int oldMaxTextureSize = 0; 213 int oldMaxTextureSize = 0;
206 if (NULL != ctx) { 214 if (NULL != ctx) {
207 // shrink the max texture size so all our textures can be reasonably sized 215 // shrink the max texture size so all our textures can be reason ably sized
208 oldMaxTextureSize = ctx->getMaxTextureSize(); 216 oldMaxTextureSize = ctx->getMaxTextureSize();
209 ctx->setMaxTextureSizeOverride(kMaxTextureSize); 217 ctx->setMaxTextureSizeOverride(kMaxTextureSize);
210 } 218 }
211 #endif 219 #endif
212 220
213 // Then draw a column with no bleeding but with tiling and low filtering 221 // Then draw a column with no bleeding but with tiling and low filte ring
214 this->drawCase1(canvas, kCol3X, kRow0Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kLow_FilterLevel); 222 this->drawCase1(canvas, kCol3X, kRow0Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kLow_FilterLevel);
215 this->drawCase2(canvas, kCol3X, kRow1Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kLow_FilterLevel); 223 this->drawCase2(canvas, kCol3X, kRow1Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kLow_FilterLevel);
216 this->drawCase3(canvas, kCol3X, kRow2Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kLow_FilterLevel); 224 this->drawCase3(canvas, kCol3X, kRow2Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kLow_FilterLevel);
217 this->drawCase4(canvas, kCol3X, kRow3Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kLow_FilterLevel); 225 this->drawCase4(canvas, kCol3X, kRow3Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kLow_FilterLevel);
218 226
219 // Then draw a column with no bleeding but with tiling and high filterin g 227 // Then draw a column with no bleeding but with tiling and high filt ering
220 this->drawCase1(canvas, kCol4X, kRow0Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kHigh_FilterLevel); 228 this->drawCase1(canvas, kCol4X, kRow0Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kHigh_FilterLevel);
221 this->drawCase2(canvas, kCol4X, kRow1Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kHigh_FilterLevel); 229 this->drawCase2(canvas, kCol4X, kRow1Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kHigh_FilterLevel);
222 this->drawCase3(canvas, kCol4X, kRow2Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kHigh_FilterLevel); 230 this->drawCase3(canvas, kCol4X, kRow2Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kHigh_FilterLevel);
223 this->drawCase4(canvas, kCol4X, kRow3Y, SkCanvas::kNone_DrawBitmapRectFl ag, SkPaint::kHigh_FilterLevel); 231 this->drawCase4(canvas, kCol4X, kRow3Y, SkCanvas::kNone_DrawBitmapRe ctFlag, SkPaint::kHigh_FilterLevel);
224 232
225 // Then draw a column with bleeding, tiling, and low filtering 233 // Then draw a column with bleeding, tiling, and low filtering
226 this->drawCase1(canvas, kCol5X, kRow0Y, SkCanvas::kBleed_DrawBitmapRectF lag, SkPaint::kLow_FilterLevel); 234 this->drawCase1(canvas, kCol5X, kRow0Y, SkCanvas::kBleed_DrawBitmapR ectFlag, SkPaint::kLow_FilterLevel);
227 this->drawCase2(canvas, kCol5X, kRow1Y, SkCanvas::kBleed_DrawBitmapRectF lag, SkPaint::kLow_FilterLevel); 235 this->drawCase2(canvas, kCol5X, kRow1Y, SkCanvas::kBleed_DrawBitmapR ectFlag, SkPaint::kLow_FilterLevel);
228 this->drawCase3(canvas, kCol5X, kRow2Y, SkCanvas::kBleed_DrawBitmapRectF lag, SkPaint::kLow_FilterLevel); 236 this->drawCase3(canvas, kCol5X, kRow2Y, SkCanvas::kBleed_DrawBitmapR ectFlag, SkPaint::kLow_FilterLevel);
229 this->drawCase4(canvas, kCol5X, kRow3Y, SkCanvas::kBleed_DrawBitmapRectF lag, SkPaint::kLow_FilterLevel); 237 this->drawCase4(canvas, kCol5X, kRow3Y, SkCanvas::kBleed_DrawBitmapR ectFlag, SkPaint::kLow_FilterLevel);
230 238
231 // Finally draw a column with bleeding, tiling, and high filtering 239 // Finally draw a column with bleeding, tiling, and high filtering
232 this->drawCase1(canvas, kCol6X, kRow0Y, SkCanvas::kBleed_DrawBitmapRectF lag, SkPaint::kHigh_FilterLevel); 240 this->drawCase1(canvas, kCol6X, kRow0Y, SkCanvas::kBleed_DrawBitmapR ectFlag, SkPaint::kHigh_FilterLevel);
233 this->drawCase2(canvas, kCol6X, kRow1Y, SkCanvas::kBleed_DrawBitmapRectF lag, SkPaint::kHigh_FilterLevel); 241 this->drawCase2(canvas, kCol6X, kRow1Y, SkCanvas::kBleed_DrawBitmapR ectFlag, SkPaint::kHigh_FilterLevel);
234 this->drawCase3(canvas, kCol6X, kRow2Y, SkCanvas::kBleed_DrawBitmapRectF lag, SkPaint::kHigh_FilterLevel); 242 this->drawCase3(canvas, kCol6X, kRow2Y, SkCanvas::kBleed_DrawBitmapR ectFlag, SkPaint::kHigh_FilterLevel);
235 this->drawCase4(canvas, kCol6X, kRow3Y, SkCanvas::kBleed_DrawBitmapRectF lag, SkPaint::kHigh_FilterLevel); 243 this->drawCase4(canvas, kCol6X, kRow3Y, SkCanvas::kBleed_DrawBitmapR ectFlag, SkPaint::kHigh_FilterLevel);
236 244
237 #if SK_SUPPORT_GPU 245 #if SK_SUPPORT_GPU
238 if (NULL != ctx) { 246 if (NULL != ctx) {
239 ctx->setMaxTextureSizeOverride(oldMaxTextureSize); 247 ctx->setMaxTextureSizeOverride(oldMaxTextureSize);
248 }
249 #endif
250 canvas->restore();
240 } 251 }
241 #endif
242 } 252 }
243 253
244 private: 254 private:
245 static const int kBlockSize = 70; 255 static const int kBlockSize = 70;
246 static const int kBlockSpacing = 5; 256 static const int kBlockSpacing = 5;
247 257
248 static const int kCol0X = kBlockSpacing; 258 static const int kCol0X = kBlockSpacing;
249 static const int kCol1X = 2*kBlockSpacing + kBlockSize; 259 static const int kCol1X = 2*kBlockSpacing + kBlockSize;
250 static const int kCol2X = 3*kBlockSpacing + 2*kBlockSize; 260 static const int kCol2X = 3*kBlockSpacing + 2*kBlockSize;
251 static const int kCol3X = 4*kBlockSpacing + 3*kBlockSize; 261 static const int kCol3X = 4*kBlockSpacing + 3*kBlockSize;
252 static const int kCol4X = 5*kBlockSpacing + 4*kBlockSize; 262 static const int kCol4X = 5*kBlockSpacing + 4*kBlockSize;
253 static const int kCol5X = 6*kBlockSpacing + 5*kBlockSize; 263 static const int kCol5X = 6*kBlockSpacing + 5*kBlockSize;
254 static const int kCol6X = 7*kBlockSpacing + 6*kBlockSize; 264 static const int kCol6X = 7*kBlockSpacing + 6*kBlockSize;
255 static const int kWidth = 8*kBlockSpacing + 7*kBlockSize; 265 static const int kWidth = 8*kBlockSpacing + 7*kBlockSize;
256 266
257 static const int kRow0Y = kBlockSpacing; 267 static const int kRow0Y = kBlockSpacing;
258 static const int kRow1Y = 2*kBlockSpacing + kBlockSize; 268 static const int kRow1Y = 2*kBlockSpacing + kBlockSize;
259 static const int kRow2Y = 3*kBlockSpacing + 2*kBlockSize; 269 static const int kRow2Y = 3*kBlockSpacing + 2*kBlockSize;
260 static const int kRow3Y = 4*kBlockSpacing + 3*kBlockSize; 270 static const int kRow3Y = 4*kBlockSpacing + 3*kBlockSize;
261 static const int kHeight = 5*kBlockSpacing + 4*kBlockSize;
262 271
263 static const int kSmallTextureSize = 6; 272 static const int kSmallTextureSize = 6;
264 static const int kMaxTextureSize = 32; 273 static const int kMaxTextureSize = 32;
265 274
266 SkBitmap fBitmapSmall; 275 SkBitmap fBitmapSmall;
267 SkBitmap fBitmapBig; 276 SkBitmap fBitmapBig;
268 277
269 typedef GM INHERITED; 278 typedef GM INHERITED;
270 }; 279 };
271 280
272 DEF_GM( return new BleedGM(); ) 281 DEF_GM( return new BleedGM(); )
OLDNEW
« no previous file with comments | « no previous file | src/gpu/SkGpuDevice.cpp » ('j') | src/gpu/SkGpuDevice.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698