1c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org/*
2c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org * Copyright 2014 Google Inc.
3c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org *
4c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
5c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org * found in the LICENSE file.
6c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org */
7c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
8c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org#include "gm.h"
9c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
10c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org#include "SkBitmap.h"
11c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org#include "SkPaint.h"
12c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org#include "SkPicture.h"
13770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com#include "SkPictureRecorder.h"
14c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org#include "SkShader.h"
15c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
16c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.orgstatic struct {
17c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    SkShader::TileMode tmx;
18c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    SkShader::TileMode tmy;
19c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org} kTileConfigs[] = {
20c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    { SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode },
21c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    { SkShader::kRepeat_TileMode, SkShader::kClamp_TileMode  },
22c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    { SkShader::kMirror_TileMode, SkShader::kRepeat_TileMode },
23c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org};
24c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
255aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.orgclass PictureShaderGM : public skiagm::GM {
26c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.orgpublic:
27c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    PictureShaderGM(SkScalar tileSize, SkScalar sceneSize)
28c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        : fTileSize(tileSize)
29c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        , fSceneSize(sceneSize) {
3063c684a8a609d39da11b4a656223cebf52ca85dccaryclark    }
31c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
3263c684a8a609d39da11b4a656223cebf52ca85dccaryclark protected:
3336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onOnceBeforeDraw() override {
3463c684a8a609d39da11b4a656223cebf52ca85dccaryclark       // Build the picture.
3584b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com        SkPictureRecorder recorder;
3663c684a8a609d39da11b4a656223cebf52ca85dccaryclark        SkCanvas* pictureCanvas = recorder.beginRecording(fTileSize, fTileSize, NULL, 0);
37c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        this->drawTile(pictureCanvas);
385aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org        fPicture.reset(recorder.endRecording());
39c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
40c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        // Build a reference bitmap.
4163c684a8a609d39da11b4a656223cebf52ca85dccaryclark        fBitmap.allocN32Pixels(SkScalarCeilToInt(fTileSize), SkScalarCeilToInt(fTileSize));
425aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org        fBitmap.eraseColor(SK_ColorTRANSPARENT);
435aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org        SkCanvas bitmapCanvas(fBitmap);
44c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        this->drawTile(&bitmapCanvas);
45c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    }
46c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
47a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
4836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
49c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        return SkString("pictureshader");
50c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    }
51c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
5236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
53b0878797b45f93b3bfe6084094c74affd10207dffmalita        return SkISize::Make(1400, 1450);
54c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    }
55c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
5636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
57c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        this->drawSceneColumn(canvas, SkPoint::Make(0, 0), 1, 1, 0);
58c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        this->drawSceneColumn(canvas, SkPoint::Make(0, fSceneSize * 6.4f), 1, 2, 0);
59c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        this->drawSceneColumn(canvas, SkPoint::Make(fSceneSize * 2.4f, 0), 1, 1, 1);
60c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        this->drawSceneColumn(canvas, SkPoint::Make(fSceneSize * 2.4f, fSceneSize * 6.4f), 1, 1, 2);
61c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        this->drawSceneColumn(canvas, SkPoint::Make(fSceneSize * 4.8f, 0), 2, 1, 0);
62c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        this->drawSceneColumn(canvas, SkPoint::Make(fSceneSize * 9.6f, 0), 2, 2, 0);
63b0878797b45f93b3bfe6084094c74affd10207dffmalita
64b0878797b45f93b3bfe6084094c74affd10207dffmalita        // One last custom row to exercise negative scaling
65b0878797b45f93b3bfe6084094c74affd10207dffmalita        SkMatrix ctm, localMatrix;
66b0878797b45f93b3bfe6084094c74affd10207dffmalita        ctm.setTranslate(fSceneSize * 2.1f, fSceneSize * 13.8f);
67b0878797b45f93b3bfe6084094c74affd10207dffmalita        ctm.preScale(-1, -1);
68b0878797b45f93b3bfe6084094c74affd10207dffmalita        localMatrix.setScale(2, 2);
69b0878797b45f93b3bfe6084094c74affd10207dffmalita        this->drawScene(canvas, ctm, localMatrix, 0);
70b0878797b45f93b3bfe6084094c74affd10207dffmalita
71b0878797b45f93b3bfe6084094c74affd10207dffmalita        ctm.setTranslate(fSceneSize * 2.4f, fSceneSize * 12.8f);
72b0878797b45f93b3bfe6084094c74affd10207dffmalita        localMatrix.setScale(-1, -1);
73b0878797b45f93b3bfe6084094c74affd10207dffmalita        this->drawScene(canvas, ctm, localMatrix, 0);
74b0878797b45f93b3bfe6084094c74affd10207dffmalita
75b0878797b45f93b3bfe6084094c74affd10207dffmalita        ctm.setTranslate(fSceneSize * 4.8f, fSceneSize * 12.3f);
76b0878797b45f93b3bfe6084094c74affd10207dffmalita        ctm.preScale(2, 2);
77b0878797b45f93b3bfe6084094c74affd10207dffmalita        this->drawScene(canvas, ctm, localMatrix, 0);
78b0878797b45f93b3bfe6084094c74affd10207dffmalita
79b0878797b45f93b3bfe6084094c74affd10207dffmalita        ctm.setTranslate(fSceneSize * 13.8f, fSceneSize * 14.3f);
80b0878797b45f93b3bfe6084094c74affd10207dffmalita        ctm.preScale(-2, -2);
81b0878797b45f93b3bfe6084094c74affd10207dffmalita        localMatrix.setTranslate(fTileSize / 4, fTileSize / 4);
82b0878797b45f93b3bfe6084094c74affd10207dffmalita        localMatrix.preRotate(45);
83b0878797b45f93b3bfe6084094c74affd10207dffmalita        localMatrix.preScale(-2, -2);
84b0878797b45f93b3bfe6084094c74affd10207dffmalita        this->drawScene(canvas, ctm, localMatrix, 0);
85c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    }
86c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
87c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.orgprivate:
88c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    void drawSceneColumn(SkCanvas* canvas, const SkPoint& pos, SkScalar scale, SkScalar localScale,
89c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org                         unsigned tileMode) {
90c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        SkMatrix ctm, localMatrix;
91c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
92c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        ctm.setTranslate(pos.x(), pos.y());
93c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        ctm.preScale(scale, scale);
94c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        localMatrix.setScale(localScale, localScale);
95c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        this->drawScene(canvas, ctm, localMatrix, tileMode);
96c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
97c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        ctm.setTranslate(pos.x(), pos.y() + fSceneSize * 1.2f * scale);
98c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        ctm.preScale(scale, scale);
99c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        localMatrix.setTranslate(fTileSize / 4, fTileSize / 4);
100c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        localMatrix.preScale(localScale, localScale);
101c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        this->drawScene(canvas, ctm, localMatrix, tileMode);
102c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
103c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        ctm.setTranslate(pos.x(), pos.y() + fSceneSize * 2.4f * scale);
104c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        ctm.preScale(scale, scale);
105c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        localMatrix.setRotate(45);
106c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        localMatrix.preScale(localScale, localScale);
107c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        this->drawScene(canvas, ctm, localMatrix, tileMode);
108c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
109c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        ctm.setTranslate(pos.x(), pos.y() + fSceneSize * 3.6f * scale);
110c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        ctm.preScale(scale, scale);
111c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        localMatrix.setSkew(1, 0);
112c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        localMatrix.preScale(localScale, localScale);
113c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        this->drawScene(canvas, ctm, localMatrix, tileMode);
114c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
115c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        ctm.setTranslate(pos.x(), pos.y() + fSceneSize * 4.8f * scale);
116c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        ctm.preScale(scale, scale);
117c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        localMatrix.setTranslate(fTileSize / 4, fTileSize / 4);
118c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        localMatrix.preRotate(45);
119c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        localMatrix.preScale(localScale, localScale);
120c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        this->drawScene(canvas, ctm, localMatrix, tileMode);
121c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    }
122c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
123c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    void drawTile(SkCanvas* canvas) {
124c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        SkPaint paint;
125c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        paint.setColor(SK_ColorGREEN);
126c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        paint.setStyle(SkPaint::kFill_Style);
127c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        paint.setAntiAlias(true);
128c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
129c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        canvas->drawCircle(fTileSize / 4, fTileSize / 4, fTileSize / 4, paint);
130c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        canvas->drawRect(SkRect::MakeXYWH(fTileSize / 2, fTileSize / 2,
131c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org                                          fTileSize / 2, fTileSize / 2), paint);
132c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
133c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        paint.setColor(SK_ColorRED);
134c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        canvas->drawLine(fTileSize / 2, fTileSize * 1 / 3,
135c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org                         fTileSize / 2, fTileSize * 2 / 3, paint);
136c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        canvas->drawLine(fTileSize * 1 / 3, fTileSize / 2,
137c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org                         fTileSize * 2 / 3, fTileSize / 2, paint);
138c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    }
139c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
140c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    void drawScene(SkCanvas* canvas, const SkMatrix& matrix, const SkMatrix& localMatrix,
141c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org                   unsigned tileMode) {
142c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        SkASSERT(tileMode < SK_ARRAY_COUNT(kTileConfigs));
143c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
144c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        SkPaint paint;
145c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        paint.setStyle(SkPaint::kFill_Style);
146c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        paint.setColor(SK_ColorLTGRAY);
147c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
148c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        canvas->save();
149c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        canvas->concat(matrix);
150c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        canvas->drawRect(SkRect::MakeWH(fSceneSize, fSceneSize), paint);
151c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        canvas->drawRect(SkRect::MakeXYWH(fSceneSize * 1.1f, 0, fSceneSize, fSceneSize), paint);
152c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
1535aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org        SkAutoTUnref<SkShader> pictureShader(SkShader::CreatePictureShader(
1545aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org                    fPicture,
1555aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org                    kTileConfigs[tileMode].tmx,
1565aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org                    kTileConfigs[tileMode].tmy,
157b5f7826c51af2862aebcabe61e1ba684f925e488fmalita                    &localMatrix,
158b5f7826c51af2862aebcabe61e1ba684f925e488fmalita                    NULL));
1595aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org        paint.setShader(pictureShader.get());
160c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        canvas->drawRect(SkRect::MakeWH(fSceneSize, fSceneSize), paint);
161c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
162c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        canvas->translate(fSceneSize * 1.1f, 0);
163c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
1645aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org        SkAutoTUnref<SkShader> bitmapShader(SkShader::CreateBitmapShader(
1655aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org                    fBitmap,
1665aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org                    kTileConfigs[tileMode].tmx,
1675aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org                    kTileConfigs[tileMode].tmy,
1685aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org                    &localMatrix));
1695aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org        paint.setShader(bitmapShader.get());
170c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        canvas->drawRect(SkRect::MakeWH(fSceneSize, fSceneSize), paint);
171c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
172c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org        canvas->restore();
173c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    }
174c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
175c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    SkScalar    fTileSize;
176c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    SkScalar    fSceneSize;
177c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
1785aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org    SkAutoTUnref<SkPicture> fPicture;
1795aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.org    SkBitmap fBitmap;
180c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
181c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org    typedef GM INHERITED;
182c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org};
183c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.org
184c5d9bb0f677069f62ec76373b9730e70e7352455commit-bot@chromium.orgDEF_GM( return SkNEW_ARGS(PictureShaderGM, (50, 100)); )
185797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary
186797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanaryDEF_SIMPLE_GM(tiled_picture_shader, canvas, 400, 400) {
187797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    // https://code.google.com/p/skia/issues/detail?id=3398
188797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    SkRect tile = SkRect::MakeWH(100, 100);
189797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary
190797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    SkPictureRecorder recorder;
191797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    SkCanvas* c = recorder.beginRecording(tile);
192797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary
193797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    SkRect r = tile;
194797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    r.inset(4, 4);
195797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    SkPaint p;
196797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    p.setColor(0xFF303F9F);  // dark blue
197797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    c->drawRect(r, p);
198797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    p.setColor(0xFFC5CAE9);  // light blue
199797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    p.setStrokeWidth(10);
200797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    c->drawLine(20, 20, 80, 80, p);
201797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary
202797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    SkAutoTUnref<SkPicture> picture(recorder.endRecording());
203797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    SkAutoTUnref<SkShader> shader(SkShader::CreatePictureShader(
204797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary	      picture.get(),
205797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary	      SkShader::kRepeat_TileMode,
206797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary	      SkShader::kRepeat_TileMode,
207797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary	      NULL,
208797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary	      NULL));
209797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary
210797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    p.setColor(0xFF8BC34A);  // green
211797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    canvas->drawPaint(p);
212797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary
213797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    canvas->clipRect(SkRect::MakeXYWH(0, 0, 400, 350));
214797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    p.setColor(0xFFB6B6B6);  // gray
215797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    canvas->drawPaint(p);
216797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    p.setShader(shader.get());
217797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary
218797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary    canvas->drawPaint(p);
219797f58a5297ccdc9226e716cbb69f9b8c5328ac9halcanary}
220