• 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 "SkCanvas.h"
10 #include "SkColorShader.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         SkSurface* surface = SkSurface::NewRenderTarget(context, SkBudgeted::kNo, info);
49 
50         if (nullptr == surface) {
51             return;
52         }
53 
54         canvas->clear(SK_ColorBLACK);
55 
56         SkRandom rand;
57         for (int x = 0; x < 10; ++x) {
58             for (int y = 0; y < 10; ++y) {
59               surface->getCanvas()->discard();
60               // Make something that isn't too close to the background color, black.
61               SkColor color = sk_tool_utils::color_to_565(rand.nextU() | 0xFF404040);
62               switch (rand.nextULessThan(3)) {
63                   case 0:
64                       surface->getCanvas()->drawColor(color);
65                       break;
66                   case 1:
67                       surface->getCanvas()->clear(color);
68                       break;
69                   case 2:
70                       SkColorShader shader(color);
71                       SkPaint paint;
72                       paint.setShader(&shader);
73                       surface->getCanvas()->drawPaint(paint);
74                       break;
75               }
76               surface->draw(canvas, 10.f*x, 10.f*y, nullptr);
77             }
78         }
79 
80         surface->getCanvas()->discard();
81         surface->unref();
82     }
83 
84 private:
85     typedef GM INHERITED;
86 };
87 
88 //////////////////////////////////////////////////////////////////////////////
89 
90 DEF_GM(return new DiscardGM;)
91 
92 } // end namespace
93 
94 #endif
95