1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2017 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "gm.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPicture.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPictureRecorder.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShader.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSurface.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PictureShaderCacheGM : public skiagm::GM { 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot PictureShaderCacheGM(SkScalar tileSize) 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : fTileSize(tileSize) { 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot protected: 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void drawTile(SkCanvas* canvas) { 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(SK_ColorGREEN); 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setStyle(SkPaint::kFill_Style); 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAntiAlias(true); 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawCircle(fTileSize / 4, fTileSize / 4, fTileSize / 4, paint); 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(SkRect::MakeXYWH(fTileSize / 2, fTileSize / 2, 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fTileSize / 2, fTileSize / 2), paint); 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(SK_ColorRED); 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawLine(fTileSize / 2, fTileSize * 1 / 3, 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fTileSize / 2, fTileSize * 2 / 3, paint); 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawLine(fTileSize * 1 / 3, fTileSize / 2, 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fTileSize * 2 / 3, fTileSize / 2, paint); 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onOnceBeforeDraw() override { 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPictureRecorder recorder; 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCanvas* pictureCanvas = recorder.beginRecording(fTileSize, fTileSize, nullptr, 0); 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->drawTile(pictureCanvas); 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPicture = recorder.finishRecordingAsPicture(); 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString onShortName() override { 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("pictureshadercache"); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize onISize() override { 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkISize::Make(100, 100); 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(SkCanvas* canvas) override { 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setShader(SkShader::MakePictureShader(fPicture, SkShader::kRepeat_TileMode, 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkShader::kRepeat_TileMode, nullptr, 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot nullptr)); 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Render in a funny color space that converts green to yellow. 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkMatrix44 greenToYellow(SkMatrix44::kIdentity_Constructor); 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot greenToYellow.setFloat(0, 1, 1.0f); 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkColorSpace> gty = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma, 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot greenToYellow); 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100, std::move(gty)); 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkSurface> surface(SkSurface::MakeRaster(info)); 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot surface->getCanvas()->drawRect(SkRect::MakeWH(fTileSize, fTileSize), paint); 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // When we draw to the canvas, we should see green because we should *not* reuse the 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // cached picture shader. 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(SkRect::MakeWH(fTileSize, fTileSize), paint); 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar fTileSize; 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkPicture> fPicture; 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBitmap fBitmap; 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GM INHERITED; 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM(return new PictureShaderCacheGM(100);) 86