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 "SkCanvas.h" 10 #include "SkColorShader.h" 11 #include "SkPaint.h" 12 #include "SkSurface.h" 13 14 #if SK_SUPPORT_GPU 15 16 namespace skiagm { 17 18 /* 19 * This GM exercises SkCanvas::discard() by creating an offscreen SkSurface and repeatedly 20 * discarding it, drawing to it, and then drawing it to the main canvas. 21 */ 22 class DiscardGM : public GM { 23 24 public: DiscardGM()25 DiscardGM() { 26 } 27 28 protected: onShortName()29 SkString onShortName() override { 30 return SkString("discard"); 31 } 32 onISize()33 SkISize onISize() override { 34 return SkISize::Make(100, 100); 35 } 36 onDraw(SkCanvas * canvas)37 void onDraw(SkCanvas* canvas) override { 38 GrContext* context = canvas->getGrContext(); 39 if (NULL == context) { 40 return; 41 } 42 43 SkISize size = this->getISize(); 44 size.fWidth /= 10; 45 size.fHeight /= 10; 46 SkImageInfo info = SkImageInfo::MakeN32Premul(size); 47 SkSurface* surface = SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted, info); 48 49 if (NULL == 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 = 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 SkColorShader shader(color); 70 SkPaint paint; 71 paint.setShader(&shader); 72 surface->getCanvas()->drawPaint(paint); 73 break; 74 } 75 surface->draw(canvas, 10.f*x, 10.f*y, NULL); 76 } 77 } 78 79 surface->getCanvas()->discard(); 80 surface->unref(); 81 } 82 83 private: 84 typedef GM INHERITED; 85 }; 86 87 ////////////////////////////////////////////////////////////////////////////// 88 89 DEF_GM( return SkNEW(DiscardGM); ) 90 91 } // end namespace 92 93 #endif 94