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

Side by Side Diff: samplecode/SampleFilterQuality.cpp

Issue 829043005: fatbits for all 4 views (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 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
« no previous file with comments | « no previous file | no next file » | 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 2015 Google Inc. 2 * Copyright 2015 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 9
10 #include "Resources.h" 10 #include "Resources.h"
11 #include "SampleCode.h" 11 #include "SampleCode.h"
12 #include "SkCanvas.h" 12 #include "SkCanvas.h"
13 #include "SkInterpolator.h" 13 #include "SkInterpolator.h"
14 #include "SkSurface.h" 14 #include "SkSurface.h"
15 #include "SkRandom.h" 15 #include "SkRandom.h"
16 #include "SkTime.h" 16 #include "SkTime.h"
17 17
18 static SkSurface* make_surface(SkCanvas* canvas, const SkImageInfo& info) {
19 SkSurface* surface = canvas->newSurface(info);
20 if (!surface) {
21 surface = SkSurface::NewRaster(info);
22 }
23 return surface;
24 }
25
18 #define N 128 26 #define N 128
27 #define ANGLE_DELTA 3
28 #define SCALE_DELTA (SK_Scalar1 / 32)
19 29
20 static SkImage* make_image() { 30 static SkImage* make_image() {
21 SkImageInfo info = SkImageInfo::MakeN32Premul(N, N); 31 SkImageInfo info = SkImageInfo::MakeN32(N, N, kOpaque_SkAlphaType);
22 SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info)); 32 SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info));
23 SkCanvas* canvas = surface->getCanvas(); 33 SkCanvas* canvas = surface->getCanvas();
34 canvas->drawColor(SK_ColorWHITE);
24 35
25 SkPath path; 36 SkPath path;
26 path.setFillType(SkPath::kEvenOdd_FillType); 37 path.setFillType(SkPath::kEvenOdd_FillType);
27 38
28 path.addRect(SkRect::MakeWH(N/2, N)); 39 path.addRect(SkRect::MakeWH(N/2, N));
29 path.addRect(SkRect::MakeWH(N, N/2)); 40 path.addRect(SkRect::MakeWH(N, N/2));
30 path.moveTo(0, 0); path.lineTo(N, 0); path.lineTo(0, N); path.close(); 41 path.moveTo(0, 0); path.lineTo(N, 0); path.lineTo(0, N); path.close();
31 42
32 canvas->drawPath(path, SkPaint()); 43 canvas->drawPath(path, SkPaint());
33 return surface->newImageSnapshot(); 44 return surface->newImageSnapshot();
34 } 45 }
35 46
47 static SkImage* zoom_up(SkImage* orig) {
48 const SkScalar S = 8; // amount to scale up
49 const int D = 2; // dimension scaling for the offscreen
50 // since we only view the center, don't need to produce the entire thing
51
52 SkImageInfo info = SkImageInfo::MakeN32(orig->width() * D, orig->height() * D,
53 kOpaque_SkAlphaType);
54 SkAutoTUnref<SkSurface> surface(orig->newSurface(info));
55 SkCanvas* canvas = surface->getCanvas();
56 canvas->drawColor(SK_ColorWHITE);
57 canvas->scale(S, S);
58 canvas->translate(-SkScalarHalf(orig->width()) * (S - D) / S,
59 -SkScalarHalf(orig->height()) * (S - D) / S);
60 canvas->drawImage(orig, 0, 0, NULL);
61
62 if (S > 3) {
63 SkPaint paint;
64 paint.setColor(SK_ColorWHITE);
65 for (int i = 1; i < orig->height(); ++i) {
66 SkScalar y = SkIntToScalar(i);
67 canvas->drawLine(0, y, SkIntToScalar(orig->width()), y, paint);
68 }
69 for (int i = 1; i < orig->width(); ++i) {
70 SkScalar x = SkIntToScalar(i);
71 canvas->drawLine(x, 0, x, SkIntToScalar(orig->height()), paint);
72 }
73 }
74 return surface->newImageSnapshot();
75 }
76
36 struct AnimValue { 77 struct AnimValue {
37 SkScalar fValue; 78 SkScalar fValue;
38 SkScalar fMin; 79 SkScalar fMin;
39 SkScalar fMax; 80 SkScalar fMax;
40 SkScalar fMod; 81 SkScalar fMod;
41 82
42 operator SkScalar() const { return fValue; } 83 operator SkScalar() const { return fValue; }
43 84
44 void set(SkScalar value, SkScalar min, SkScalar max) { 85 void set(SkScalar value, SkScalar min, SkScalar max) {
45 fValue = value; 86 fValue = value;
(...skipping 21 matching lines...) Expand all
67 if (fValue > fMax) { 108 if (fValue > fMax) {
68 fValue = fMax; 109 fValue = fMax;
69 } else if (fValue < fMin) { 110 } else if (fValue < fMin) {
70 fValue = fMin; 111 fValue = fMin;
71 } 112 }
72 } 113 }
73 return fValue; 114 return fValue;
74 } 115 }
75 }; 116 };
76 117
77 #define ANGLE_DELTA 3 118 static void draw_box_frame(SkCanvas* canvas, int width, int height) {
78 #define SCALE_DELTA (SK_Scalar1 / 32) 119 SkPaint p;
120 p.setStyle(SkPaint::kStroke_Style);
121 p.setColor(SK_ColorRED);
122 SkRect r = SkRect::MakeIWH(width, height);
123 r.inset(0.5f, 0.5f);
124 canvas->drawRect(r, p);
125 canvas->drawLine(r.left(), r.top(), r.right(), r.bottom(), p);
126 canvas->drawLine(r.left(), r.bottom(), r.right(), r.top(), p);
127 }
79 128
80 class FilterQualityView : public SampleView { 129 class FilterQualityView : public SampleView {
81 SkAutoTUnref<SkImage> fImage; 130 SkAutoTUnref<SkImage> fImage;
82 AnimValue fScale, fAngle; 131 AnimValue fScale, fAngle;
83 132 SkSize fCell;
84 SkInterpolator fTrans; 133 SkInterpolator fTrans;
134 bool fShowFatBits;
85 135
86 public: 136 public:
87 FilterQualityView() : fImage(make_image()), fTrans(2, 2) { 137 FilterQualityView() : fImage(make_image()), fTrans(2, 2), fShowFatBits(true) {
138 fCell.set(256, 256);
139
88 fScale.set(1, SK_Scalar1 / 8, 1); 140 fScale.set(1, SK_Scalar1 / 8, 1);
89 fAngle.setMod(0, 360); 141 fAngle.setMod(0, 360);
90 142
91 SkScalar values[2]; 143 SkScalar values[2];
92 fTrans.setMirror(true); 144 fTrans.setMirror(true);
93 fTrans.setReset(true); 145 fTrans.setReset(true);
94 146
95 fTrans.setRepeatCount(999); 147 fTrans.setRepeatCount(999);
96 values[0] = values[1] = 0; 148 values[0] = values[1] = 0;
97 fTrans.setKeyFrame(0, SkTime::GetMSecs(), values); 149 fTrans.setKeyFrame(0, SkTime::GetMSecs(), values);
98 values[0] = values[1] = 1; 150 values[0] = values[1] = 1;
99 fTrans.setKeyFrame(1, SkTime::GetMSecs() + 2000, values); 151 fTrans.setKeyFrame(1, SkTime::GetMSecs() + 2000, values);
100 } 152 }
101 153
102 protected: 154 protected:
103
104 // overrides from SkEventSink
105 bool onQuery(SkEvent* evt) SK_OVERRIDE { 155 bool onQuery(SkEvent* evt) SK_OVERRIDE {
106 if (SampleCode::TitleQ(*evt)) { 156 if (SampleCode::TitleQ(*evt)) {
107 SampleCode::TitleR(evt, "FilterQuality"); 157 SampleCode::TitleR(evt, "FilterQuality");
108 return true; 158 return true;
109 } 159 }
110 SkUnichar uni; 160 SkUnichar uni;
111 if (SampleCode::CharQ(*evt, &uni)) { 161 if (SampleCode::CharQ(*evt, &uni)) {
112 switch (uni) { 162 switch (uni) {
113 case '1': fAngle.inc(-ANGLE_DELTA); this->inval(NULL); return tr ue; 163 case '1': fAngle.inc(-ANGLE_DELTA); this->inval(NULL); return tr ue;
114 case '2': fAngle.inc( ANGLE_DELTA); this->inval(NULL); return tr ue; 164 case '2': fAngle.inc( ANGLE_DELTA); this->inval(NULL); return tr ue;
115 case '3': fScale.inc(-SCALE_DELTA); this->inval(NULL); return tr ue; 165 case '3': fScale.inc(-SCALE_DELTA); this->inval(NULL); return tr ue;
116 case '4': fScale.inc( SCALE_DELTA); this->inval(NULL); return tr ue; 166 case '4': fScale.inc( SCALE_DELTA); this->inval(NULL); return tr ue;
167 case '5': fShowFatBits = !fShowFatBits; this->inval(NULL); retur n true;
117 default: break; 168 default: break;
118 } 169 }
119 } 170 }
120 return this->INHERITED::onQuery(evt); 171 return this->INHERITED::onQuery(evt);
121 } 172 }
122 173
123 void drawHere(SkCanvas* canvas, SkScalar x, SkScalar y, SkPaint::FilterLevel filter) { 174 void drawTheImage(SkCanvas* canvas, const SkISize& size, SkPaint::FilterLeve l filter,
124 SkAutoCanvasRestore acr(canvas, true); 175 SkScalar dx, SkScalar dy) {
125 SkPaint paint; 176 SkPaint paint;
126 paint.setAntiAlias(true); 177 paint.setAntiAlias(true);
127 paint.setFilterLevel(filter); 178 paint.setFilterLevel(filter);
128 179
129 canvas->translate(x, y); 180 SkAutoCanvasRestore acr(canvas, true);
181
182 canvas->translate(dx, dy);
183
184 canvas->translate(SkScalarHalf(size.width()), SkScalarHalf(size.height() ));
130 canvas->scale(fScale, fScale); 185 canvas->scale(fScale, fScale);
131 canvas->rotate(fAngle); 186 canvas->rotate(fAngle);
132 canvas->drawImage(fImage, -SkScalarHalf(fImage->width()), -SkScalarHalf( fImage->height()), 187 canvas->drawImage(fImage, -SkScalarHalf(fImage->width()), -SkScalarHalf( fImage->height()),
133 &paint); 188 &paint);
189
190 if (false) {
191 acr.restore();
192 draw_box_frame(canvas, size.width(), size.height());
193 }
194 }
195
196 void drawHere(SkCanvas* canvas, SkPaint::FilterLevel filter, SkScalar dx, Sk Scalar dy) {
197 SkCanvas* origCanvas = canvas;
198 SkAutoCanvasRestore acr(canvas, true);
199
200 SkISize size = SkISize::Make(fImage->width(), fImage->height());
201
202 SkAutoTUnref<SkSurface> surface;
203 if (fShowFatBits) {
204 // scale up so we don't clip rotations
205 SkImageInfo info = SkImageInfo::MakeN32(fImage->width() * 2, fImage- >height() * 2,
206 kOpaque_SkAlphaType);
207 surface.reset(make_surface(canvas, info));
208 canvas = surface->getCanvas();
209 canvas->drawColor(SK_ColorWHITE);
210 size.set(info.width(), info.height());
211 } else {
212 canvas->translate(SkScalarHalf(fCell.width() - fImage->width()),
213 SkScalarHalf(fCell.height() - fImage->height()));
214 }
215 this->drawTheImage(canvas, size, filter, dx, dy);
216
217 if (surface) {
218 SkAutoTUnref<SkImage> orig(surface->newImageSnapshot());
219 SkAutoTUnref<SkImage> zoomed(zoom_up(orig));
220 origCanvas->drawImage(zoomed,
221 SkScalarHalf(fCell.width() - zoomed->width()),
222 SkScalarHalf(fCell.height() - zoomed->height() ));
223 }
224 }
225
226 void drawBorders(SkCanvas* canvas) {
227 SkPaint p;
228 p.setStyle(SkPaint::kStroke_Style);
229 p.setColor(SK_ColorBLUE);
230
231 SkRect r = SkRect::MakeWH(fCell.width() * 2, fCell.height() * 2);
232 r.inset(SK_ScalarHalf, SK_ScalarHalf);
233 canvas->drawRect(r, p);
234 canvas->drawLine(r.left(), r.centerY(), r.right(), r.centerY(), p);
235 canvas->drawLine(r.centerX(), r.top(), r.centerX(), r.bottom(), p);
134 } 236 }
135 237
136 void onDrawContent(SkCanvas* canvas) SK_OVERRIDE { 238 void onDrawContent(SkCanvas* canvas) SK_OVERRIDE {
239 fCell.set(this->height() / 2, this->height() / 2);
240
137 SkScalar trans[2]; 241 SkScalar trans[2];
138 fTrans.timeToValues(SkTime::GetMSecs(), trans); 242 fTrans.timeToValues(SkTime::GetMSecs(), trans);
139 canvas->translate(trans[0], trans[1]);
140 this->inval(NULL);
141 243
142 const struct { 244 for (int y = 0; y < 2; ++y) {
143 SkScalar fX; 245 for (int x = 0; x < 2; ++x) {
144 SkScalar fY; 246 int index = y * 2 + x;
145 SkPaint::FilterLevel fFilter; 247 SkAutoCanvasRestore acr(canvas, true);
146 } rec[] = { 248 canvas->translate(fCell.width() * x, fCell.height() * y);
147 { 100, 100, SkPaint::kNone_FilterLevel }, 249 SkRect r = SkRect::MakeWH(fCell.width(), fCell.height());
148 { 300, 100, SkPaint::kLow_FilterLevel }, 250 r.inset(4, 4);
149 { 100, 300, SkPaint::kMedium_FilterLevel }, 251 canvas->clipRect(r);
150 { 300, 300, SkPaint::kHigh_FilterLevel }, 252 this->drawHere(canvas, SkPaint::FilterLevel(index), trans[0], tr ans[1]);
151 }; 253 }
254 }
152 255
153 for (size_t i = 0; i < SK_ARRAY_COUNT(rec); ++i) { 256 this->drawBorders(canvas);
154 this->drawHere(canvas, rec[i].fX, rec[i].fY, rec[i].fFilter); 257
155 } 258 const SkScalar textX = fCell.width() * 2 + 30;
156 259
157 SkPaint paint; 260 SkPaint paint;
158 paint.setAntiAlias(true); 261 paint.setAntiAlias(true);
159 paint.setTextSize(40); 262 paint.setTextSize(36);
160 SkString str; 263 SkString str;
161 str.appendScalar(fScale); 264 str.appendScalar(fScale);
162 canvas->drawText(str.c_str(), str.size(), 450, 100, paint); 265 canvas->drawText(str.c_str(), str.size(), textX, 100, paint);
163 str.reset(); str.appendScalar(fAngle); 266 str.reset(); str.appendScalar(fAngle);
164 canvas->drawText(str.c_str(), str.size(), 450, 150, paint); 267 canvas->drawText(str.c_str(), str.size(), textX, 150, paint);
165 268
166 str.reset(); str.appendScalar(trans[0]); 269 str.reset(); str.appendScalar(trans[0]);
167 canvas->drawText(str.c_str(), str.size(), 450, 200, paint); 270 canvas->drawText(str.c_str(), str.size(), textX, 200, paint);
168 str.reset(); str.appendScalar(trans[1]); 271 str.reset(); str.appendScalar(trans[1]);
169 canvas->drawText(str.c_str(), str.size(), 450, 250, paint); 272 canvas->drawText(str.c_str(), str.size(), textX, 250, paint);
170 } 273
274 this->inval(NULL);
275 }
171 276
172 virtual bool handleKey(SkKey key) { 277 virtual bool handleKey(SkKey key) {
173 this->inval(NULL); 278 this->inval(NULL);
174 return true; 279 return true;
175 } 280 }
176 281
177 private: 282 private:
178 typedef SampleView INHERITED; 283 typedef SampleView INHERITED;
179 }; 284 };
180 285
181 ////////////////////////////////////////////////////////////////////////////// 286 //////////////////////////////////////////////////////////////////////////////
182 287
183 static SkView* MyFactory() { return new FilterQualityView; } 288 static SkView* MyFactory() { return new FilterQualityView; }
184 static SkViewRegister reg(MyFactory); 289 static SkViewRegister reg(MyFactory);
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698