savelayer.cpp revision 4837724a7e5b1ccb3c8d2ef139f0b93b53203299
1/* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "gm.h" 9#include "SkCanvas.h" 10 11// This should be on SkCanvas imho 12static void rotateAbout(SkCanvas* canvas, SkScalar degrees, 13 SkScalar px, SkScalar py) { 14 canvas->translate(px, py); 15 canvas->rotate(degrees); 16 canvas->translate(-px, -py); 17} 18 19class SaveLayerGM : public skiagm::GM { 20 void drawStuff(SkCanvas* canvas, const SkRect& r) { 21 SkPaint paint; 22 paint.setAntiAlias(true); 23 canvas->drawOval(r, paint); 24 } 25 26public: 27 SaveLayerGM() {} 28 29protected: 30 SkString onShortName() { 31 return SkString("savelayer"); 32 } 33 34 virtual SkISize onISize() { return SkISize::Make(100, 100); } 35 36 virtual void onDraw(SkCanvas* canvas) { 37 SkPaint hairpaint; 38 hairpaint.setAntiAlias(true); 39 hairpaint.setStyle(SkPaint::kStroke_Style); 40 hairpaint.setColor(SK_ColorRED); 41 42 canvas->translate(50, 50); 43 44 SkRect r = SkRect::MakeWH(100, 60); 45 SkRect r2 = r; 46 r2.inset(5, 5); 47 48 this->drawStuff(canvas, r); 49 canvas->drawRect(r, hairpaint); 50 canvas->translate(r.width() * 5/4, 0); 51 52 canvas->saveLayer(&r2, NULL); 53 this->drawStuff(canvas, r); 54 canvas->restore(); 55 canvas->drawRect(r, hairpaint); 56 canvas->translate(r.width() * 5/4, 0); 57 58 // We need to ensure that we still clip against r2 (after it is rotated) 59 // even though the layer's bounds will be larger (since they are the 60 // enclosing rect of rotated-r2). 61 62 rotateAbout(canvas, 30, r.centerX(), r.centerY()); 63 canvas->saveLayer(&r2, NULL); 64 this->drawStuff(canvas, r); 65 canvas->restore(); 66 canvas->drawRect(r, hairpaint); 67 } 68 69private: 70 typedef GM INHERITED; 71}; 72 73////////////////////////////////////////////////////////////////////////////// 74 75static skiagm::GM* MyFactory(void*) { return new SaveLayerGM; } 76static skiagm::GMRegistry reg(MyFactory); 77