• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef skiagm_DEFINED
9 #define skiagm_DEFINED
10 
11 #include "SkBitmap.h"
12 #include "SkCanvas.h"
13 #include "SkPaint.h"
14 #include "SkSize.h"
15 #include "SkString.h"
16 #include "../tools/Registry.h"
17 #include "SkClipOpPriv.h"
18 
19 class SkAnimTimer;
20 struct GrContextOptions;
21 
22 #define DEF_GM(code) \
23     static skiagm::GM*          SK_MACRO_APPEND_LINE(F_)(void*) { code; } \
24     static skiagm::GMRegistry   SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_));
25 
26 // a Simple GM is a rendering test that does not store state between
27 // rendering calls or make use of the onOnceBeforeDraw() virtual; it
28 // consists of:
29 //   *   A single void(*)(SkCanvas*) function.
30 //   *   A name.
31 //   *   Prefered width and height.
32 //   *   Optionally, a background color (default is white).
33 #define DEF_SIMPLE_GM(NAME, CANVAS, W, H) \
34     DEF_SIMPLE_GM_BG_NAME(NAME, CANVAS, W, H, SK_ColorWHITE, SkString(#NAME))
35 #define DEF_SIMPLE_GM_BG(NAME, CANVAS, W, H, BGCOLOR)\
36     DEF_SIMPLE_GM_BG_NAME(NAME, CANVAS, W, H, BGCOLOR, SkString(#NAME))
37 #define DEF_SIMPLE_GM_BG_NAME(NAME, CANVAS, W, H, BGCOLOR, NAME_STR)         \
38     static void SK_MACRO_CONCAT(NAME, _GM)(SkCanvas * CANVAS);               \
39     DEF_GM(return new skiagm::SimpleGM(NAME_STR, SK_MACRO_CONCAT(NAME, _GM), \
40                                        SkISize::Make(W, H), BGCOLOR);)       \
41     void SK_MACRO_CONCAT(NAME, _GM)(SkCanvas * CANVAS)
42 
43 namespace skiagm {
44 
45     class GM {
46     public:
47         GM();
48         virtual ~GM();
49 
50         enum Mode {
51             kGM_Mode,
52             kSample_Mode,
53             kBench_Mode,
54         };
55 
setMode(Mode mode)56         void setMode(Mode mode) { fMode = mode; }
getMode()57         Mode getMode() const { return fMode; }
58 
59         void draw(SkCanvas*);
60         void drawBackground(SkCanvas*);
61         void drawContent(SkCanvas*);
62 
getISize()63         SkISize getISize() { return this->onISize(); }
64         const char* getName();
65 
runAsBench()66         virtual bool runAsBench() const { return false; }
67 
width()68         SkScalar width() {
69             return SkIntToScalar(this->getISize().width());
70         }
height()71         SkScalar height() {
72             return SkIntToScalar(this->getISize().height());
73         }
74 
75         // TODO(vandebo) Instead of exposing this, we should run all the GMs
76         // with and without an initial transform.
77         // Most GMs will return the identity matrix, but some PDFs tests
78         // require setting the initial transform.
getInitialTransform()79         SkMatrix getInitialTransform() const {
80             SkMatrix matrix = fStarterMatrix;
81             matrix.preConcat(this->onGetInitialTransform());
82             return matrix;
83         }
84 
getBGColor()85         SkColor getBGColor() const { return fBGColor; }
86         void setBGColor(SkColor);
87 
88         // helper: fill a rect in the specified color based on the
89         // GM's getISize bounds.
90         void drawSizeBounds(SkCanvas*, SkColor);
91 
isCanvasDeferred()92         bool isCanvasDeferred() const { return fCanvasIsDeferred; }
setCanvasIsDeferred(bool isDeferred)93         void setCanvasIsDeferred(bool isDeferred) {
94             fCanvasIsDeferred = isDeferred;
95         }
96 
getStarterMatrix()97         const SkMatrix& getStarterMatrix() { return fStarterMatrix; }
setStarterMatrix(const SkMatrix & matrix)98         void setStarterMatrix(const SkMatrix& matrix) {
99             fStarterMatrix = matrix;
100         }
101 
102         bool animate(const SkAnimTimer&);
handleKey(SkUnichar uni)103         bool handleKey(SkUnichar uni) {
104             return this->onHandleKey(uni);
105         }
106 
modifyGrContextOptions(GrContextOptions * options)107         virtual void modifyGrContextOptions(GrContextOptions* options) {}
108 
109         /** draws a standard message that the GM is only intended to be used with the GPU.*/
110         static void DrawGpuOnlyMessage(SkCanvas*);
111 
112     protected:
onOnceBeforeDraw()113         virtual void onOnceBeforeDraw() {}
114         virtual void onDraw(SkCanvas*) = 0;
115         virtual void onDrawBackground(SkCanvas*);
116         virtual SkISize onISize() = 0;
117         virtual SkString onShortName() = 0;
118 
onAnimate(const SkAnimTimer &)119         virtual bool onAnimate(const SkAnimTimer&) { return false; }
onHandleKey(SkUnichar uni)120         virtual bool onHandleKey(SkUnichar uni) { return false; }
onGetInitialTransform()121         virtual SkMatrix onGetInitialTransform() const { return SkMatrix::I(); }
122 
123     private:
124         Mode     fMode;
125         SkString fShortName;
126         SkColor  fBGColor;
127         bool     fCanvasIsDeferred; // work-around problem in srcmode.cpp
128         bool     fHaveCalledOnceBeforeDraw;
129         SkMatrix fStarterMatrix;
130     };
131 
132     typedef sk_tools::Registry<GM*(*)(void*)> GMRegistry;
133 
134     class SimpleGM : public skiagm::GM {
135     public:
SimpleGM(const SkString & name,void (* drawProc)(SkCanvas *),const SkISize & size,SkColor backgroundColor)136         SimpleGM(const SkString& name,
137                  void (*drawProc)(SkCanvas*),
138                  const SkISize& size,
139                  SkColor backgroundColor)
140             : fName(name), fDrawProc(drawProc), fSize(size) {
141             if (backgroundColor != SK_ColorWHITE) {
142                 this->setBGColor(backgroundColor);
143             }
144         }
145     protected:
146         void onDraw(SkCanvas* canvas) override;
147         SkISize onISize() override;
148         SkString onShortName() override;
149     private:
150         SkString fName;
151         void (*fDrawProc)(SkCanvas*);
152         SkISize fSize;
153     };
154 }
155 
156 #endif
157