Home | History | Annotate | Download | only in gm
      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 "SkTRegistry.h"
     17 #include "sk_tool_utils.h"
     18 
     19 #if SK_SUPPORT_GPU
     20 #include "GrContext.h"
     21 #endif
     22 
     23 #define DEF_GM(code) \
     24     static skiagm::GM*          SK_MACRO_APPEND_LINE(F_)(void*) { code; } \
     25     static skiagm::GMRegistry   SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_));
     26 
     27 namespace skiagm {
     28 
     29     class GM {
     30     public:
     31         GM();
     32         virtual ~GM();
     33 
     34         enum Flags {
     35             kSkipPDF_Flag               = 1 << 0,
     36             kSkipPicture_Flag           = 1 << 1,
     37             kSkipPipe_Flag              = 1 << 2,
     38             kSkipPipeCrossProcess_Flag  = 1 << 3,
     39             kSkipTiled_Flag             = 1 << 4,
     40             kSkip565_Flag               = 1 << 5,
     41             kSkipScaledReplay_Flag      = 1 << 6,
     42             kSkipGPU_Flag               = 1 << 7,
     43             kSkipPDFRasterization_Flag  = 1 << 8,
     44 
     45             kGPUOnly_Flag               = 1 << 9,
     46 
     47             kAsBench_Flag               = 1 << 10, // Run the GM as a benchmark in the bench tool
     48 
     49             kNoBBH_Flag                 = 1 << 11, // May draw wrong using a bounding-box hierarchy
     50         };
     51 
     52         enum Mode {
     53             kGM_Mode,
     54             kSample_Mode,
     55             kBench_Mode,
     56         };
     57 
     58         void setMode(Mode mode) { fMode = mode; }
     59         Mode getMode() const { return fMode; }
     60 
     61         void draw(SkCanvas*);
     62         void drawBackground(SkCanvas*);
     63         void drawContent(SkCanvas*);
     64 
     65         SkISize getISize() { return this->onISize(); }
     66         const char* getName();
     67 
     68         uint32_t getFlags() const {
     69             return this->onGetFlags();
     70         }
     71 
     72         SkScalar width() {
     73             return SkIntToScalar(this->getISize().width());
     74         }
     75         SkScalar height() {
     76             return SkIntToScalar(this->getISize().height());
     77         }
     78 
     79         // TODO(vandebo) Instead of exposing this, we should run all the GMs
     80         // with and without an initial transform.
     81         // Most GMs will return the identity matrix, but some PDFs tests
     82         // require setting the initial transform.
     83         SkMatrix getInitialTransform() const {
     84             SkMatrix matrix = fStarterMatrix;
     85             matrix.preConcat(this->onGetInitialTransform());
     86             return matrix;
     87         }
     88 
     89         SkColor getBGColor() const { return fBGColor; }
     90         void setBGColor(SkColor);
     91 
     92         // helper: fill a rect in the specified color based on the
     93         // GM's getISize bounds.
     94         void drawSizeBounds(SkCanvas*, SkColor);
     95 
     96         bool isCanvasDeferred() const { return fCanvasIsDeferred; }
     97         void setCanvasIsDeferred(bool isDeferred) {
     98             fCanvasIsDeferred = isDeferred;
     99         }
    100 
    101         const SkMatrix& getStarterMatrix() { return fStarterMatrix; }
    102         void setStarterMatrix(const SkMatrix& matrix) {
    103             fStarterMatrix = matrix;
    104         }
    105 
    106     protected:
    107         virtual void onOnceBeforeDraw() {}
    108         virtual void onDraw(SkCanvas*) = 0;
    109         virtual void onDrawBackground(SkCanvas*);
    110         virtual SkISize onISize() = 0;
    111         virtual SkString onShortName() = 0;
    112         virtual uint32_t onGetFlags() const { return 0; }
    113         virtual SkMatrix onGetInitialTransform() const { return SkMatrix::I(); }
    114 
    115     private:
    116         Mode     fMode;
    117         SkString fShortName;
    118         SkColor  fBGColor;
    119         bool     fCanvasIsDeferred; // work-around problem in srcmode.cpp
    120         bool     fHaveCalledOnceBeforeDraw;
    121         SkMatrix fStarterMatrix;
    122     };
    123 
    124     typedef SkTRegistry<GM*(*)(void*)> GMRegistry;
    125 }
    126 
    127 #endif
    128