blob: 106a6becc06e6fbf36f40bfe45e2783dfd122957 [file] [log] [blame]
commit-bot@chromium.org04f03d12014-04-24 21:03:00 +00001/*
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
commit-bot@chromium.org04f03d12014-04-24 21:03:00 +00008#include "gm.h"
9#include "SkCanvas.h"
10#include "SkColorShader.h"
11#include "SkPaint.h"
bsalomon4ee6bd82015-05-27 13:23:23 -070012#include "SkRandom.h"
commit-bot@chromium.org04f03d12014-04-24 21:03:00 +000013#include "SkSurface.h"
14
reedf037e0b2014-10-30 11:34:15 -070015#if SK_SUPPORT_GPU
16
commit-bot@chromium.org04f03d12014-04-24 21:03:00 +000017namespace 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 */
23class DiscardGM : public GM {
24
25public:
26 DiscardGM() {
27 }
28
commit-bot@chromium.org04f03d12014-04-24 21:03:00 +000029protected:
mtklein36352bf2015-03-25 18:17:31 -070030 SkString onShortName() override {
commit-bot@chromium.org04f03d12014-04-24 21:03:00 +000031 return SkString("discard");
32 }
33
mtklein36352bf2015-03-25 18:17:31 -070034 SkISize onISize() override {
commit-bot@chromium.org04f03d12014-04-24 21:03:00 +000035 return SkISize::Make(100, 100);
36 }
37
mtklein36352bf2015-03-25 18:17:31 -070038 void onDraw(SkCanvas* canvas) override {
commit-bot@chromium.org04f03d12014-04-24 21:03:00 +000039 GrContext* context = canvas->getGrContext();
40 if (NULL == context) {
41 return;
42 }
43
44 SkISize size = this->getISize();
45 size.fWidth /= 10;
46 size.fHeight /= 10;
47 SkImageInfo info = SkImageInfo::MakeN32Premul(size);
bsalomonafe30052015-01-16 07:32:33 -080048 SkSurface* surface = SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted, info);
commit-bot@chromium.org04f03d12014-04-24 21:03:00 +000049
50 if (NULL == 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 = 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 }
bsalomon@google.com0b27f2e2014-04-24 21:23:37 +000076 surface->draw(canvas, 10.f*x, 10.f*y, NULL);
commit-bot@chromium.org04f03d12014-04-24 21:03:00 +000077 }
78 }
79
80 surface->getCanvas()->discard();
81 surface->unref();
82 }
83
84private:
85 typedef GM INHERITED;
86};
87
88//////////////////////////////////////////////////////////////////////////////
89
90DEF_GM( return SkNEW(DiscardGM); )
91
92} // end namespace
93
94#endif