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