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