Home | History | Annotate | Download | only in gm
      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:
     25     DiscardGM() {
     26     }
     27 
     28 protected:
     29     SkString onShortName() override {
     30         return SkString("discard");
     31     }
     32 
     33     SkISize onISize() override {
     34         return SkISize::Make(100, 100);
     35     }
     36 
     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