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

Unified 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, 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/core/SkTLList.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gm/convexpolyclip.cpp
diff --git a/gm/convexpolyclip.cpp b/gm/convexpolyclip.cpp
index 18b99a7db882f77c30acc9737b1b79491a84798b..d29e5398b0c2e132a77394fb3a83181d07c43f82 100644
--- a/gm/convexpolyclip.cpp
+++ b/gm/convexpolyclip.cpp
@@ -83,7 +83,7 @@ protected:
}
virtual SkISize onISize() SK_OVERRIDE {
- return make_isize(435, 440);
+ return make_isize(435, 540);
}
virtual void onOnceBeforeDraw() SK_OVERRIDE {
@@ -92,7 +92,7 @@ protected:
tri.lineTo(100.f, 20.f);
tri.lineTo(15.f, 100.f);
- fPaths.addToTail(tri);
+ fClips.addToTail()->setPath(tri);
SkPath hexagon;
static const SkScalar kRadius = 45.f;
@@ -109,12 +109,14 @@ protected:
hexagon.lineTo(point);
}
}
- fPaths.addToTail(hexagon);
+ fClips.addToTail()->setPath(hexagon);
SkMatrix scaleM;
scaleM.setScale(1.1f, 0.4f, kRadius, kRadius);
hexagon.transform(scaleM);
- fPaths.addToTail(hexagon);
+ fClips.addToTail()->setPath(hexagon);
+
+ fClips.addToTail()->setRect(SkRect::MakeXYWH(8.3f, 11.6f, 78.2f, 72.6f));
SkPath rotRect;
SkRect rect = SkRect::MakeLTRB(10.f, 12.f, 80.f, 86.f);
@@ -122,13 +124,12 @@ protected:
SkMatrix rotM;
rotM.setRotate(23.f, rect.centerX(), rect.centerY());
rotRect.transform(rotM);
- fPaths.addToTail(rotRect);
-
+ fClips.addToTail()->setPath(rotRect);
+
fBmp = make_bmp(100, 100);
}
virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
- const SkPath* path;
SkScalar y = 0;
static const SkScalar kMargin = 10.f;
@@ -139,14 +140,15 @@ protected:
SkIntToScalar(size.fHeight));
canvas->drawBitmapRectToRect(fBmp, NULL, dstRect, &bgPaint);
- for (SkTLList<SkPath>::Iter iter(fPaths, SkTLList<SkPath>::Iter::kHead_IterStart);
- NULL != (path = iter.get());
+ for (SkTLList<Clip>::Iter iter(fClips, SkTLList<Clip>::Iter::kHead_IterStart);
+ NULL != iter.get();
iter.next()) {
+ const Clip* clip = iter.get();
SkScalar x = 0;
for (int aa = 0; aa < 2; ++aa) {
canvas->save();
canvas->translate(x, y);
- canvas->clipPath(*path, SkRegion::kIntersect_Op, SkToBool(aa));
+ clip->setOnCanvas(canvas, SkRegion::kIntersect_Op, SkToBool(aa));
canvas->drawBitmap(fBmp, 0, 0);
canvas->restore();
x += fBmp.width() + kMargin;
@@ -166,10 +168,10 @@ protected:
canvas->save();
canvas->translate(x, y);
- SkPath closedClipPath = *path;
- closedClipPath.close();
+ SkPath closedClipPath;
+ clip->asClosedPath(&closedClipPath);
canvas->drawPath(closedClipPath, clipOutlinePaint);
- canvas->clipPath(*path, SkRegion::kIntersect_Op, SkToBool(aa));
+ clip->setOnCanvas(canvas, SkRegion::kIntersect_Op, SkToBool(aa));
canvas->scale(1.f, 1.8f);
canvas->drawText(kTxt, SK_ARRAY_COUNT(kTxt)-1,
0, 1.5f * txtPaint.getTextSize(),
@@ -187,7 +189,66 @@ protected:
}
private:
- SkTLList<SkPath> fPaths;
+ class Clip {
+ public:
+ enum ClipType {
+ kNone_ClipType,
+ kPath_ClipType,
+ kRect_ClipType
+ };
+
+ Clip () : fClipType(kNone_ClipType) {}
+
+ void setOnCanvas(SkCanvas* canvas, SkRegion::Op op, bool aa) const {
+ switch (fClipType) {
+ case kPath_ClipType:
+ canvas->clipPath(fPath, op, aa);
+ break;
+ case kRect_ClipType:
+ canvas->clipRect(fRect, op, aa);
+ break;
+ case kNone_ClipType:
+ SkDEBUGFAIL("Uninitialized Clip.");
+ break;
+ }
+ }
+
+ void asClosedPath(SkPath* path) const {
+ switch (fClipType) {
+ case kPath_ClipType:
+ *path = fPath;
+ path->close();
+ break;
+ case kRect_ClipType:
+ path->reset();
+ path->addRect(fRect);
+ break;
+ case kNone_ClipType:
+ SkDEBUGFAIL("Uninitialized Clip.");
+ break;
+ }
+ }
+
+ void setPath(const SkPath& path) {
+ fClipType = kPath_ClipType;
+ fPath = path;
+ }
+
+ void setRect(const SkRect& rect) {
+ fClipType = kRect_ClipType;
+ 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).
+ fPath.reset();
+ }
+
+ ClipType getType() const { return fClipType; }
+
+ private:
+ 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
+ SkPath fPath;
+ SkRect fRect;
+ };
+
+ SkTLList<Clip> fClips;
SkBitmap fBmp;
typedef GM INHERITED;
« 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