1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2014 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#include "sk_tool_utils.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandom.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSurface.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if SK_SUPPORT_GPU 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiagm { 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * This GM exercises SkCanvas::discard() by creating an offscreen SkSurface and repeatedly 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * discarding it, drawing to it, and then drawing it to the main canvas. 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass DiscardGM : public GM { 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot DiscardGM() { 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString onShortName() override { 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("discard"); 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize onISize() override { 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkISize::Make(100, 100); 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(SkCanvas* canvas) override { 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrContext* context = canvas->getGrContext(); 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (nullptr == context) { 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return; 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize size = this->getISize(); 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size.fWidth /= 10; 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size.fHeight /= 10; 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkImageInfo info = SkImageInfo::MakeN32Premul(size); 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot auto surface = SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (nullptr == surface) { 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return; 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->clear(SK_ColorBLACK); 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand; 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int x = 0; x < 10; ++x) { 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int y = 0; y < 10; ++y) { 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot surface->getCanvas()->discard(); 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Make something that isn't too close to the background color, black. 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor color = sk_tool_utils::color_to_565(rand.nextU() | 0xFF404040); 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (rand.nextULessThan(3)) { 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 0: 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot surface->getCanvas()->drawColor(color); 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 1: 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot surface->getCanvas()->clear(color); 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 2: 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setShader(SkShader::MakeColorShader(color)); 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot surface->getCanvas()->drawPaint(paint); 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot surface->draw(canvas, 10.f*x, 10.f*y, nullptr); 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot surface->getCanvas()->discard(); 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GM INHERITED; 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////// 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM(return new DiscardGM;) 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} // end namespace 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 92