Index: gm/canvasstate.cpp |
diff --git a/gm/pathopsskpclip.cpp b/gm/canvasstate.cpp |
similarity index 21% |
copy from gm/pathopsskpclip.cpp |
copy to gm/canvasstate.cpp |
index b85b294fef113b03f97fdb4a67c78c2d32273149..1a26bf0df7c1c194677dabdaefb6fea2062c8014 100644 |
--- a/gm/pathopsskpclip.cpp |
+++ b/gm/canvasstate.cpp |
@@ -6,68 +6,108 @@ |
*/ |
#include "gm.h" |
-#include "SkBitmap.h" |
#include "SkCanvas.h" |
-#include "SkClipStack.h" |
-#include "SkDevice.h" |
+#include "SkPaint.h" |
#include "SkPath.h" |
-#include "SkPathOps.h" |
-#include "SkPicture.h" |
#include "SkRect.h" |
namespace skiagm { |
-class PathOpsSkpClipGM : public GM { |
+/* |
+ * This GM exercises the flags to SkCanvas::save(). The canvas' save() and |
+ * restore actions can be limited to only a portion of the canvas' state through |
+ * the use of flags when calling save. |
+ */ |
+class CanvasStateGM : public GM { |
+ SkSize fSize; |
+ enum { |
+ WIDTH = 150, |
+ HEIGHT = 150, |
+ }; |
+ |
+ SkPaint fFillPaint; |
+ SkPaint fStrokePaint; |
+ |
+ SkPath fPath; |
+ |
+ SkRect fOutlineRect; |
+ SkRect fFillRect; |
+ |
+ |
public: |
- PathOpsSkpClipGM() { |
+ CanvasStateGM() { |
+ fSize.set(SkIntToScalar(WIDTH), SkIntToScalar(HEIGHT)); |
+ |
+ fFillPaint.setColor(SK_ColorRED); |
+ fFillPaint.setStyle(SkPaint::kFill_Style); |
+ |
+ fStrokePaint.setColor(SK_ColorBLUE); |
+ fStrokePaint.setStyle(SkPaint::kStroke_Style); |
+ fStrokePaint.setStrokeWidth(1); |
+ |
+ fPath.moveTo(25, 25); |
+ fPath.lineTo(125, 25); |
+ fPath.lineTo(75, 125); |
+ fPath.close(); |
+ |
+ fOutlineRect = SkRect::MakeXYWH(1, 1, WIDTH-2, HEIGHT-2); |
+ fFillRect = SkRect::MakeXYWH(10, 10, WIDTH-20, HEIGHT-20); |
} |
protected: |
virtual SkString onShortName() SK_OVERRIDE { |
- return SkString("pathopsskpclip"); |
+ return SkString("canvas-state"); |
} |
virtual SkISize onISize() SK_OVERRIDE { |
- return make_isize(1200, 900); |
+ return SkISize::Make(WIDTH*3, HEIGHT*4); |
} |
virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
- SkPicture* pict = SkNEW(SkPicture); |
- SkCanvas* rec = pict->beginRecording(1200, 900); |
- SkPath p; |
- SkRect r = { |
- SkIntToScalar(100), |
- SkIntToScalar(200), |
- SkIntToScalar(400), |
- SkIntToScalar(700) |
- }; |
- p.addRoundRect(r, SkIntToScalar(50), SkIntToScalar(50)); |
- rec->clipPath(p, SkRegion::kIntersect_Op, true); |
- rec->translate(SkIntToScalar(250), SkIntToScalar(250)); |
- rec->clipPath(p, SkRegion::kIntersect_Op, true); |
- rec->drawColor(0xffff0000); |
- pict->endRecording(); |
- |
- canvas->setAllowSimplifyClip(true); |
+ |
+ SkCanvas::SaveFlags flags[] = { SkCanvas::kMatrix_SaveFlag, |
+ SkCanvas::kClip_SaveFlag, |
+ SkCanvas::kMatrixClip_SaveFlag }; |
+ |
+ // columns -- flags |
+ // rows -- permutations of setting the clip and matrix |
+ for (size_t i = 0; i < SK_ARRAY_COUNT(flags); ++i) { |
+ for (int j = 0; j < 2; ++j) { |
+ for (int k = 0; k < 2; ++k) { |
+ this->drawTestPattern(i, (2*j)+k, canvas, flags[i], j, k); |
+ } |
+ } |
+ } |
+ } |
+ |
+ |
+ virtual uint32_t onGetFlags() SK_OVERRIDE const { return kSkipPicture_Flag; } |
+ |
+private: |
+ void drawTestPattern(int x, int y, SkCanvas* canvas, |
+ SkCanvas::SaveFlags flags, bool doClip, bool doScale) { |
canvas->save(); |
- canvas->drawPicture(*pict); |
+ canvas->translate(x*WIDTH, y*HEIGHT); |
+ |
+ canvas->drawRect(fOutlineRect, fStrokePaint); |
+ canvas->save(flags); |
+ if(doClip) { |
+ canvas->clipPath(fPath); |
+ } |
+ if (doScale) { |
+ canvas->scale(0.5, 0.5); |
+ } |
canvas->restore(); |
+ canvas->drawRect(fFillRect, fFillPaint); |
- canvas->setAllowSimplifyClip(false); |
- canvas->save(); |
- canvas->translate(SkIntToScalar(1200 / 2), 0); |
- canvas->drawPicture(*pict); |
canvas->restore(); |
- SkSafeUnref(pict); |
} |
-private: |
typedef GM INHERITED; |
}; |
////////////////////////////////////////////////////////////////////////////// |
-static GM* MyFactory(void*) { return new PathOpsSkpClipGM; } |
-static GMRegistry reg(MyFactory); |
+DEF_GM( return SkNEW(CanvasStateGM); ) |
-} |
+} // end namespace |