104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org/* 204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org * Copyright 2014 Google Inc. 304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org * 404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org * found in the LICENSE file. 604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org */ 704f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org#include "gm.h" 904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org#include "SkCanvas.h" 1004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org#include "SkColorShader.h" 1104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org#include "SkPaint.h" 1204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org#include "SkSurface.h" 1304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 14f037e0bf138a4e842f39e19864d05010a54950c9reed#if SK_SUPPORT_GPU 15f037e0bf138a4e842f39e19864d05010a54950c9reed 1604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.orgnamespace skiagm { 1704f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 1804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org/* 1904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org * This GM exercises SkCanvas::discard() by creating an offscreen SkSurface and repeatedly 2004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org * discarding it, drawing to it, and then drawing it to the main canvas. 2104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org */ 2204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.orgclass DiscardGM : public GM { 2304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 2404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.orgpublic: 2504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org DiscardGM() { 2604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 2704f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 2804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.orgprotected: 2936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 3004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org return SkString("discard"); 3104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 3204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 3336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override { 3404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org return SkISize::Make(100, 100); 3504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 3604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 3736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 3804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org GrContext* context = canvas->getGrContext(); 3904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org if (NULL == context) { 4004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org return; 4104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 4204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 4304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org SkISize size = this->getISize(); 4404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org size.fWidth /= 10; 4504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org size.fHeight /= 10; 4604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org SkImageInfo info = SkImageInfo::MakeN32Premul(size); 47afe3005be3392e43bc51eb7eb2017eefaed85ad1bsalomon SkSurface* surface = SkSurface::NewRenderTarget(context, SkSurface::kNo_Budgeted, info); 4804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 4904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org if (NULL == surface) { 5004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org return; 5104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 5204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 5304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org canvas->clear(SK_ColorBLACK); 5404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 5504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org SkRandom rand; 5604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org for (int x = 0; x < 10; ++x) { 5704f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org for (int y = 0; y < 10; ++y) { 5804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org surface->getCanvas()->discard(); 5904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org // Make something that isn't too close to the background color, black. 6004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org SkColor color = rand.nextU() | 0xFF404040; 6104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org switch (rand.nextULessThan(3)) { 6204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org case 0: 6304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org surface->getCanvas()->drawColor(color); 6404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org break; 6504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org case 1: 6604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org surface->getCanvas()->clear(color); 6704f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org break; 6804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org case 2: 6904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org SkColorShader shader(color); 7004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org SkPaint paint; 7104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org paint.setShader(&shader); 7204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org surface->getCanvas()->drawPaint(paint); 7304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org break; 7404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 750b27f2ec0fd097b381016f92d07da0960fb84634bsalomon@google.com surface->draw(canvas, 10.f*x, 10.f*y, NULL); 7604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 7704f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 7804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 7904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org surface->getCanvas()->discard(); 8004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org surface->unref(); 8104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 8204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 8304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.orgprivate: 8404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org typedef GM INHERITED; 8504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org}; 8604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 8704f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 8804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 8904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.orgDEF_GM( return SkNEW(DiscardGM); ) 9004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 9104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org} // end namespace 9204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 9304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org#endif 94