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

Side by Side Diff: gm/convexpolyclip.cpp

Issue 147793007: Add rect clip to convex_poly_clip GM (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: simplify function name Created 6 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/core/SkTLList.h » ('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 /* 2 /*
3 * Copyright 2014 Google Inc. 3 * Copyright 2014 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "gm.h" 9 #include "gm.h"
10 10
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 ConvexPolyClip() { 76 ConvexPolyClip() {
77 this->setBGColor(0xFFFFFFFF); 77 this->setBGColor(0xFFFFFFFF);
78 } 78 }
79 79
80 protected: 80 protected:
81 virtual SkString onShortName() SK_OVERRIDE { 81 virtual SkString onShortName() SK_OVERRIDE {
82 return SkString("convex_poly_clip"); 82 return SkString("convex_poly_clip");
83 } 83 }
84 84
85 virtual SkISize onISize() SK_OVERRIDE { 85 virtual SkISize onISize() SK_OVERRIDE {
86 return make_isize(435, 440); 86 return make_isize(435, 540);
87 } 87 }
88 88
89 virtual void onOnceBeforeDraw() SK_OVERRIDE { 89 virtual void onOnceBeforeDraw() SK_OVERRIDE {
90 SkPath tri; 90 SkPath tri;
91 tri.moveTo(5.f, 5.f); 91 tri.moveTo(5.f, 5.f);
92 tri.lineTo(100.f, 20.f); 92 tri.lineTo(100.f, 20.f);
93 tri.lineTo(15.f, 100.f); 93 tri.lineTo(15.f, 100.f);
94 94
95 fPaths.addToTail(tri); 95 fClips.addToTail()->setPath(tri);
96 96
97 SkPath hexagon; 97 SkPath hexagon;
98 static const SkScalar kRadius = 45.f; 98 static const SkScalar kRadius = 45.f;
99 const SkPoint center = { kRadius, kRadius }; 99 const SkPoint center = { kRadius, kRadius };
100 for (int i = 0; i < 6; ++i) { 100 for (int i = 0; i < 6; ++i) {
101 SkScalar angle = 2 * SK_ScalarPI * i / 6; 101 SkScalar angle = 2 * SK_ScalarPI * i / 6;
102 SkPoint point; 102 SkPoint point;
103 point.fY = SkScalarSinCos(angle, &point.fX); 103 point.fY = SkScalarSinCos(angle, &point.fX);
104 point.scale(kRadius); 104 point.scale(kRadius);
105 point = center + point; 105 point = center + point;
106 if (0 == i) { 106 if (0 == i) {
107 hexagon.moveTo(point); 107 hexagon.moveTo(point);
108 } else { 108 } else {
109 hexagon.lineTo(point); 109 hexagon.lineTo(point);
110 } 110 }
111 } 111 }
112 fPaths.addToTail(hexagon); 112 fClips.addToTail()->setPath(hexagon);
113 113
114 SkMatrix scaleM; 114 SkMatrix scaleM;
115 scaleM.setScale(1.1f, 0.4f, kRadius, kRadius); 115 scaleM.setScale(1.1f, 0.4f, kRadius, kRadius);
116 hexagon.transform(scaleM); 116 hexagon.transform(scaleM);
117 fPaths.addToTail(hexagon); 117 fClips.addToTail()->setPath(hexagon);
118
119 fClips.addToTail()->setRect(SkRect::MakeXYWH(8.3f, 11.6f, 78.2f, 72.6f)) ;
118 120
119 SkPath rotRect; 121 SkPath rotRect;
120 SkRect rect = SkRect::MakeLTRB(10.f, 12.f, 80.f, 86.f); 122 SkRect rect = SkRect::MakeLTRB(10.f, 12.f, 80.f, 86.f);
121 rotRect.addRect(rect); 123 rotRect.addRect(rect);
122 SkMatrix rotM; 124 SkMatrix rotM;
123 rotM.setRotate(23.f, rect.centerX(), rect.centerY()); 125 rotM.setRotate(23.f, rect.centerX(), rect.centerY());
124 rotRect.transform(rotM); 126 rotRect.transform(rotM);
125 fPaths.addToTail(rotRect); 127 fClips.addToTail()->setPath(rotRect);
126 128
127 fBmp = make_bmp(100, 100); 129 fBmp = make_bmp(100, 100);
128 } 130 }
129 131
130 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 132 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
131 const SkPath* path;
132 SkScalar y = 0; 133 SkScalar y = 0;
133 static const SkScalar kMargin = 10.f; 134 static const SkScalar kMargin = 10.f;
134 135
135 SkPaint bgPaint; 136 SkPaint bgPaint;
136 bgPaint.setAlpha(0x15); 137 bgPaint.setAlpha(0x15);
137 SkISize size = canvas->getDeviceSize(); 138 SkISize size = canvas->getDeviceSize();
138 SkRect dstRect = SkRect::MakeWH(SkIntToScalar(size.fWidth), 139 SkRect dstRect = SkRect::MakeWH(SkIntToScalar(size.fWidth),
139 SkIntToScalar(size.fHeight)); 140 SkIntToScalar(size.fHeight));
140 canvas->drawBitmapRectToRect(fBmp, NULL, dstRect, &bgPaint); 141 canvas->drawBitmapRectToRect(fBmp, NULL, dstRect, &bgPaint);
141 142
142 for (SkTLList<SkPath>::Iter iter(fPaths, SkTLList<SkPath>::Iter::kHead_I terStart); 143 for (SkTLList<Clip>::Iter iter(fClips, SkTLList<Clip>::Iter::kHead_IterS tart);
143 NULL != (path = iter.get()); 144 NULL != iter.get();
144 iter.next()) { 145 iter.next()) {
146 const Clip* clip = iter.get();
145 SkScalar x = 0; 147 SkScalar x = 0;
146 for (int aa = 0; aa < 2; ++aa) { 148 for (int aa = 0; aa < 2; ++aa) {
147 canvas->save(); 149 canvas->save();
148 canvas->translate(x, y); 150 canvas->translate(x, y);
149 canvas->clipPath(*path, SkRegion::kIntersect_Op, SkToBool(aa)); 151 clip->setOnCanvas(canvas, SkRegion::kIntersect_Op, SkToBool(aa)) ;
150 canvas->drawBitmap(fBmp, 0, 0); 152 canvas->drawBitmap(fBmp, 0, 0);
151 canvas->restore(); 153 canvas->restore();
152 x += fBmp.width() + kMargin; 154 x += fBmp.width() + kMargin;
153 } 155 }
154 for (int aa = 0; aa < 2; ++aa) { 156 for (int aa = 0; aa < 2; ++aa) {
155 static const char kTxt[] = "Clip Me!"; 157 static const char kTxt[] = "Clip Me!";
156 SkPaint txtPaint; 158 SkPaint txtPaint;
157 txtPaint.setTextSize(23.f); 159 txtPaint.setTextSize(23.f);
158 txtPaint.setAntiAlias(true); 160 txtPaint.setAntiAlias(true);
159 txtPaint.setColor(SK_ColorDKGRAY); 161 txtPaint.setColor(SK_ColorDKGRAY);
160 162
161 SkPaint clipOutlinePaint; 163 SkPaint clipOutlinePaint;
162 clipOutlinePaint.setAntiAlias(true); 164 clipOutlinePaint.setAntiAlias(true);
163 clipOutlinePaint.setColor(0x50505050); 165 clipOutlinePaint.setColor(0x50505050);
164 clipOutlinePaint.setStyle(SkPaint::kStroke_Style); 166 clipOutlinePaint.setStyle(SkPaint::kStroke_Style);
165 clipOutlinePaint.setStrokeWidth(0); 167 clipOutlinePaint.setStrokeWidth(0);
166 168
167 canvas->save(); 169 canvas->save();
168 canvas->translate(x, y); 170 canvas->translate(x, y);
169 SkPath closedClipPath = *path; 171 SkPath closedClipPath;
170 closedClipPath.close(); 172 clip->asClosedPath(&closedClipPath);
171 canvas->drawPath(closedClipPath, clipOutlinePaint); 173 canvas->drawPath(closedClipPath, clipOutlinePaint);
172 canvas->clipPath(*path, SkRegion::kIntersect_Op, SkToBool(aa)); 174 clip->setOnCanvas(canvas, SkRegion::kIntersect_Op, SkToBool(aa)) ;
173 canvas->scale(1.f, 1.8f); 175 canvas->scale(1.f, 1.8f);
174 canvas->drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1, 176 canvas->drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1,
175 0, 1.5f * txtPaint.getTextSize(), 177 0, 1.5f * txtPaint.getTextSize(),
176 txtPaint); 178 txtPaint);
177 canvas->restore(); 179 canvas->restore();
178 x += fBmp.width() + kMargin; 180 x += fBmp.width() + kMargin;
179 } 181 }
180 182
181 y += fBmp.height() + kMargin; 183 y += fBmp.height() + kMargin;
182 } 184 }
183 } 185 }
184 186
185 virtual uint32_t onGetFlags() const { 187 virtual uint32_t onGetFlags() const {
186 return kAsBench_Flag; 188 return kAsBench_Flag;
187 } 189 }
188 190
189 private: 191 private:
190 SkTLList<SkPath> fPaths; 192 class Clip {
193 public:
194 enum ClipType {
195 kNone_ClipType,
196 kPath_ClipType,
197 kRect_ClipType
198 };
199
200 Clip () : fClipType(kNone_ClipType) {}
201
202 void setOnCanvas(SkCanvas* canvas, SkRegion::Op op, bool aa) const {
203 switch (fClipType) {
204 case kPath_ClipType:
205 canvas->clipPath(fPath, op, aa);
206 break;
207 case kRect_ClipType:
208 canvas->clipRect(fRect, op, aa);
209 break;
210 case kNone_ClipType:
211 SkDEBUGFAIL("Uninitialized Clip.");
212 break;
213 }
214 }
215
216 void asClosedPath(SkPath* path) const {
217 switch (fClipType) {
218 case kPath_ClipType:
219 *path = fPath;
220 path->close();
221 break;
222 case kRect_ClipType:
223 path->reset();
224 path->addRect(fRect);
225 break;
226 case kNone_ClipType:
227 SkDEBUGFAIL("Uninitialized Clip.");
228 break;
229 }
230 }
231
232 void setPath(const SkPath& path) {
233 fClipType = kPath_ClipType;
234 fPath = path;
235 }
236
237 void setRect(const SkRect& rect) {
238 fClipType = kRect_ClipType;
239 fRect = rect;
robertphillips 2014/02/03 22:32:45 if (kPath_ClipType == fClipType) { fPath.reset
bsalomon 2014/02/04 14:24:34 The path object is always valid (no union).
240 fPath.reset();
241 }
242
243 ClipType getType() const { return fClipType; }
244
245 private:
246 ClipType fClipType;
robertphillips 2014/02/03 22:32:45 union?
bsalomon 2014/02/04 14:24:34 SkPath can't be in a union, it'd have to be SkPath
247 SkPath fPath;
248 SkRect fRect;
249 };
250
251 SkTLList<Clip> fClips;
191 SkBitmap fBmp; 252 SkBitmap fBmp;
192 253
193 typedef GM INHERITED; 254 typedef GM INHERITED;
194 }; 255 };
195 256
196 DEF_GM( return SkNEW(ConvexPolyClip); ) 257 DEF_GM( return SkNEW(ConvexPolyClip); )
197 258
198 } 259 }
OLDNEW
« no previous file with comments | « no previous file | src/core/SkTLList.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698