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