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#if SK_SUPPORT_GPU 904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 1004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org#include "gm.h" 1104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org#include "SkCanvas.h" 1204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org#include "SkColorShader.h" 1304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org#include "SkPaint.h" 1404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org#include "SkSurface.h" 1504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 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.org virtual uint32_t onGetFlags() const SK_OVERRIDE { return kGPUOnly_Flag; } 2904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 3004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.orgprotected: 3104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org virtual SkString onShortName() SK_OVERRIDE { 3204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org return SkString("discard"); 3304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 3404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 3504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org virtual SkISize onISize() SK_OVERRIDE { 3604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org return SkISize::Make(100, 100); 3704f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 3804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 3904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 4004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org GrContext* context = canvas->getGrContext(); 4104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org if (NULL == context) { 4204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org return; 4304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 4404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 4504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org SkISize size = this->getISize(); 4604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org size.fWidth /= 10; 4704f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org size.fHeight /= 10; 4804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org SkImageInfo info = SkImageInfo::MakeN32Premul(size); 4904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org SkSurface* surface = SkSurface::NewRenderTarget(context, info); 5004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 5104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org if (NULL == surface) { 5204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org return; 5304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 5404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 5504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org canvas->clear(SK_ColorBLACK); 5604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 5704f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org SkRandom rand; 5804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org for (int x = 0; x < 10; ++x) { 5904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org for (int y = 0; y < 10; ++y) { 6004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org surface->getCanvas()->discard(); 6104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org // Make something that isn't too close to the background color, black. 6204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org SkColor color = rand.nextU() | 0xFF404040; 6304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org switch (rand.nextULessThan(3)) { 6404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org case 0: 6504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org surface->getCanvas()->drawColor(color); 6604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org break; 6704f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org case 1: 6804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org surface->getCanvas()->clear(color); 6904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org break; 7004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org case 2: 7104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org SkColorShader shader(color); 7204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org SkPaint paint; 7304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org paint.setShader(&shader); 7404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org surface->getCanvas()->drawPaint(paint); 7504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org break; 7604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 770b27f2ec0fd097b381016f92d07da0960fb84634bsalomon@google.com surface->draw(canvas, 10.f*x, 10.f*y, NULL); 7804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 7904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 8004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 8104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org surface->getCanvas()->discard(); 8204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org surface->unref(); 8304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org } 8404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 8504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.orgprivate: 8604f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org typedef GM INHERITED; 8704f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org}; 8804f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 8904f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 9004f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 9104f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.orgDEF_GM( return SkNEW(DiscardGM); ) 9204f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 9304f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org} // end namespace 9404f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org 9504f03d1fad46776a0d4231f77f1a70a904e66deccommit-bot@chromium.org#endif 96