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