• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
DiscardGM()24     DiscardGM() {
25     }
26 
27 protected:
onShortName()28     SkString onShortName() override {
29         return SkString("discard");
30     }
31 
onISize()32     SkISize onISize() override {
33         return SkISize::Make(100, 100);
34     }
35 
onDraw(SkCanvas * canvas)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