/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkCanvas.h" #include "SkPaint.h" #include "SkRandom.h" #include "SkSurface.h" #include "ToolUtils.h" #include "gm.h" namespace skiagm { /* * This GM exercises SkCanvas::discard() by creating an offscreen SkSurface and repeatedly * discarding it, drawing to it, and then drawing it to the main canvas. */ class DiscardGM : public GpuGM { public: DiscardGM() { } protected: SkString onShortName() override { return SkString("discard"); } SkISize onISize() override { return SkISize::Make(100, 100); } DrawResult onDraw(GrContext* context, GrRenderTargetContext*, SkCanvas* canvas, SkString* errorMsg) override { SkISize size = this->getISize(); size.fWidth /= 10; size.fHeight /= 10; SkImageInfo info = SkImageInfo::MakeN32Premul(size); auto surface = SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info); if (nullptr == surface) { *errorMsg = "Could not create render target."; return DrawResult::kFail; } canvas->clear(SK_ColorBLACK); SkRandom rand; for (int x = 0; x < 10; ++x) { for (int y = 0; y < 10; ++y) { surface->getCanvas()->discard(); // Make something that isn't too close to the background color, black. SkColor color = ToolUtils::color_to_565(rand.nextU() | 0xFF404040); switch (rand.nextULessThan(3)) { case 0: surface->getCanvas()->drawColor(color); break; case 1: surface->getCanvas()->clear(color); break; case 2: SkPaint paint; paint.setShader(SkShader::MakeColorShader(color)); surface->getCanvas()->drawPaint(paint); break; } surface->draw(canvas, 10.f*x, 10.f*y, nullptr); } } surface->getCanvas()->discard(); return DrawResult::kOk; } private: typedef GM INHERITED; }; ////////////////////////////////////////////////////////////////////////////// DEF_GM(return new DiscardGM;) } // end namespace