1/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm.h"
9#include "sk_tool_utils.h"
10#include "SkShader.h"
11#include "SkTraceEvent.h"
12using namespace skiagm;
13
14GM::GM() {
15    fMode = kGM_Mode;
16    fBGColor = SK_ColorWHITE;
17    fCanvasIsDeferred = false;
18    fHaveCalledOnceBeforeDraw = false;
19}
20
21GM::~GM() {}
22
23void GM::draw(SkCanvas* canvas) {
24    TRACE_EVENT1("GM", TRACE_FUNC, "name", TRACE_STR_COPY(this->getName()));
25    this->drawBackground(canvas);
26    this->drawContent(canvas);
27}
28
29void GM::drawContent(SkCanvas* canvas) {
30    TRACE_EVENT0("GM", TRACE_FUNC);
31    if (!fHaveCalledOnceBeforeDraw) {
32        fHaveCalledOnceBeforeDraw = true;
33        this->onOnceBeforeDraw();
34    }
35    this->onDraw(canvas);
36}
37
38void GM::drawBackground(SkCanvas* canvas) {
39    TRACE_EVENT0("GM", TRACE_FUNC);
40    if (!fHaveCalledOnceBeforeDraw) {
41        fHaveCalledOnceBeforeDraw = true;
42        this->onOnceBeforeDraw();
43    }
44    this->onDrawBackground(canvas);
45}
46
47const char* GM::getName() {
48    if (fShortName.size() == 0) {
49        fShortName = this->onShortName();
50    }
51    return fShortName.c_str();
52}
53
54void GM::setBGColor(SkColor color) {
55    fBGColor = color;
56}
57
58bool GM::animate(const SkAnimTimer& timer) {
59    return this->onAnimate(timer);
60}
61
62/////////////////////////////////////////////////////////////////////////////////////////////
63
64void GM::onDrawBackground(SkCanvas* canvas) {
65    canvas->drawColor(fBGColor, SkBlendMode::kSrc);
66}
67
68void GM::drawSizeBounds(SkCanvas* canvas, SkColor color) {
69    SkISize size = this->getISize();
70    SkRect r = SkRect::MakeWH(SkIntToScalar(size.width()),
71                              SkIntToScalar(size.height()));
72    SkPaint paint;
73    paint.setColor(color);
74    canvas->drawRect(r, paint);
75}
76
77void GM::DrawGpuOnlyMessage(SkCanvas* canvas) {
78    SkBitmap bmp;
79    bmp.allocN32Pixels(128, 64);
80    SkCanvas bmpCanvas(bmp);
81    bmpCanvas.drawColor(SK_ColorWHITE);
82    SkPaint paint;
83    paint.setAntiAlias(true);
84    paint.setTextSize(20);
85    paint.setColor(SK_ColorRED);
86    sk_tool_utils::set_portable_typeface(&paint);
87    constexpr char kTxt[] = "GPU Only";
88    bmpCanvas.drawString(kTxt, 20, 40, paint);
89    SkMatrix localM;
90    localM.setRotate(35.f);
91    localM.postTranslate(10.f, 0.f);
92    paint.setShader(SkShader::MakeBitmapShader(bmp, SkShader::kMirror_TileMode,
93                                               SkShader::kMirror_TileMode,
94                                               &localM));
95    paint.setFilterQuality(kMedium_SkFilterQuality);
96    canvas->drawPaint(paint);
97    return;
98}
99
100// need to explicitly declare this, or we get some weird infinite loop llist
101template GMRegistry* GMRegistry::gHead;
102
103void skiagm::SimpleGM::onDraw(SkCanvas* canvas) {
104    fDrawProc(canvas);
105}
106
107SkISize skiagm::SimpleGM::onISize() {
108    return fSize;
109}
110
111SkString skiagm::SimpleGM::onShortName() {
112    return fName;
113}
114