148dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com/*
248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com * Copyright 2011 Google Inc.
348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com *
448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com * found in the LICENSE file.
648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com */
748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
848dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com#include "gm.h"
933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
10b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon#include "SkShader.h"
11b323a5ed1f26a5b8e4e9f8f78225bdf95dc5a177Mike Klein#include "SkTraceEvent.h"
1248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comusing namespace skiagm;
1348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
1448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comGM::GM() {
15b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org    fMode = kGM_Mode;
1648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    fBGColor = SK_ColorWHITE;
17aef73617d1bcede80145a13639668f958a3863d8reed@google.com    fCanvasIsDeferred = false;
187775d66aa0e5958c9ea55ddb8317af4d9b019220reed@google.com    fHaveCalledOnceBeforeDraw = false;
1948dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
20880914c35c8f7fc2e9c57134134c883baf66e538tfarina
2148dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comGM::~GM() {}
2248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
2348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comvoid GM::draw(SkCanvas* canvas) {
24b323a5ed1f26a5b8e4e9f8f78225bdf95dc5a177Mike Klein    TRACE_EVENT1("GM", TRACE_FUNC, "name", TRACE_STR_COPY(this->getName()));
2548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    this->drawBackground(canvas);
2648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    this->drawContent(canvas);
2748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
2848dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
2948dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comvoid GM::drawContent(SkCanvas* canvas) {
30b323a5ed1f26a5b8e4e9f8f78225bdf95dc5a177Mike Klein    TRACE_EVENT0("GM", TRACE_FUNC);
317775d66aa0e5958c9ea55ddb8317af4d9b019220reed@google.com    if (!fHaveCalledOnceBeforeDraw) {
327775d66aa0e5958c9ea55ddb8317af4d9b019220reed@google.com        fHaveCalledOnceBeforeDraw = true;
337775d66aa0e5958c9ea55ddb8317af4d9b019220reed@google.com        this->onOnceBeforeDraw();
347775d66aa0e5958c9ea55ddb8317af4d9b019220reed@google.com    }
3548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    this->onDraw(canvas);
3648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
3748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
3848dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comvoid GM::drawBackground(SkCanvas* canvas) {
39b323a5ed1f26a5b8e4e9f8f78225bdf95dc5a177Mike Klein    TRACE_EVENT0("GM", TRACE_FUNC);
407775d66aa0e5958c9ea55ddb8317af4d9b019220reed@google.com    if (!fHaveCalledOnceBeforeDraw) {
417775d66aa0e5958c9ea55ddb8317af4d9b019220reed@google.com        fHaveCalledOnceBeforeDraw = true;
427775d66aa0e5958c9ea55ddb8317af4d9b019220reed@google.com        this->onOnceBeforeDraw();
437775d66aa0e5958c9ea55ddb8317af4d9b019220reed@google.com    }
4448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    this->onDrawBackground(canvas);
4548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
4648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
4738aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.orgconst char* GM::getName() {
4848dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    if (fShortName.size() == 0) {
4948dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com        fShortName = this->onShortName();
5048dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    }
5148dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    return fShortName.c_str();
5248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
5348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
5448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comvoid GM::setBGColor(SkColor color) {
5548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    fBGColor = color;
5648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
5748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
5876113a9b7716748c70ea0ecf7aacbabe4cce5009reedbool GM::animate(const SkAnimTimer& timer) {
5976113a9b7716748c70ea0ecf7aacbabe4cce5009reed    return this->onAnimate(timer);
60d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed}
61d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed
62d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed/////////////////////////////////////////////////////////////////////////////////////////////
63d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed
6448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comvoid GM::onDrawBackground(SkCanvas* canvas) {
65374772bd61951f01bf84fe17bf53d8867681c9aereed    canvas->drawColor(fBGColor, SkBlendMode::kSrc);
6648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com}
6748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
682d6ef528e57928160aba6b628b2d84180ced97c3reed@google.comvoid GM::drawSizeBounds(SkCanvas* canvas, SkColor color) {
692d6ef528e57928160aba6b628b2d84180ced97c3reed@google.com    SkISize size = this->getISize();
702d6ef528e57928160aba6b628b2d84180ced97c3reed@google.com    SkRect r = SkRect::MakeWH(SkIntToScalar(size.width()),
712d6ef528e57928160aba6b628b2d84180ced97c3reed@google.com                              SkIntToScalar(size.height()));
722d6ef528e57928160aba6b628b2d84180ced97c3reed@google.com    SkPaint paint;
732d6ef528e57928160aba6b628b2d84180ced97c3reed@google.com    paint.setColor(color);
742d6ef528e57928160aba6b628b2d84180ced97c3reed@google.com    canvas->drawRect(r, paint);
752d6ef528e57928160aba6b628b2d84180ced97c3reed@google.com}
762d6ef528e57928160aba6b628b2d84180ced97c3reed@google.com
772a24338c777462e04a2b26295f9c034155ee8f3ehalcanaryvoid GM::DrawGpuOnlyMessage(SkCanvas* canvas) {
78b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    SkBitmap bmp;
79b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    bmp.allocN32Pixels(128, 64);
80b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    SkCanvas bmpCanvas(bmp);
81b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    bmpCanvas.drawColor(SK_ColorWHITE);
82b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    SkPaint paint;
83b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    paint.setAntiAlias(true);
84b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    paint.setTextSize(20);
85b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    paint.setColor(SK_ColorRED);
86f597c42c50718d5c39769077040de1768c89bbd3caryclark    sk_tool_utils::set_portable_typeface(&paint);
87dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    constexpr char kTxt[] = "GPU Only";
882a475eae622adc1e8fa29206be1eaf862c23548eCary Clark    bmpCanvas.drawString(kTxt, 20, 40, paint);
89b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    SkMatrix localM;
90b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    localM.setRotate(35.f);
91b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    localM.postTranslate(10.f, 0.f);
928a21c9fe7f5fef9e87115defef27bd7218419f28reed    paint.setShader(SkShader::MakeBitmapShader(bmp, SkShader::kMirror_TileMode,
938a21c9fe7f5fef9e87115defef27bd7218419f28reed                                               SkShader::kMirror_TileMode,
948a21c9fe7f5fef9e87115defef27bd7218419f28reed                                               &localM));
95b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    paint.setFilterQuality(kMedium_SkFilterQuality);
96b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    canvas->drawPaint(paint);
97b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon    return;
98b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon}
99b62da80cbf6643c1944d3ebf8df233f286bd3fdebsalomon
10048dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com// need to explicitly declare this, or we get some weird infinite loop llist
101bcbc1788b478b1e54079318ad073e8490aa66faetfarinatemplate GMRegistry* GMRegistry::gHead;
102f62c63490f0cba13eaadce720b58a95720b2df86halcanary
103f62c63490f0cba13eaadce720b58a95720b2df86halcanaryvoid skiagm::SimpleGM::onDraw(SkCanvas* canvas) {
104f62c63490f0cba13eaadce720b58a95720b2df86halcanary    fDrawProc(canvas);
105f62c63490f0cba13eaadce720b58a95720b2df86halcanary}
106f62c63490f0cba13eaadce720b58a95720b2df86halcanary
107f62c63490f0cba13eaadce720b58a95720b2df86halcanarySkISize skiagm::SimpleGM::onISize() {
108f62c63490f0cba13eaadce720b58a95720b2df86halcanary    return fSize;
109f62c63490f0cba13eaadce720b58a95720b2df86halcanary}
110f62c63490f0cba13eaadce720b58a95720b2df86halcanary
111f62c63490f0cba13eaadce720b58a95720b2df86halcanarySkString skiagm::SimpleGM::onShortName() {
112f62c63490f0cba13eaadce720b58a95720b2df86halcanary    return fName;
113f62c63490f0cba13eaadce720b58a95720b2df86halcanary}
114