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