Home | History | Annotate | Download | only in gm
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #ifndef skiagm_DEFINED
      9 #define skiagm_DEFINED
     10 
     11 #include "SkBitmap.h"
     12 #include "SkBitmapDevice.h"
     13 #include "SkCanvas.h"
     14 #include "SkPaint.h"
     15 #include "SkSize.h"
     16 #include "SkString.h"
     17 #include "SkTRegistry.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     static inline SkISize make_isize(int w, int h) {
     30         SkISize sz;
     31         sz.set(w, h);
     32         return sz;
     33     }
     34 
     35     class GM {
     36     public:
     37         GM();
     38         virtual ~GM();
     39 
     40         enum Flags {
     41             kSkipPDF_Flag               = 1 << 0,
     42             kSkipPicture_Flag           = 1 << 1,
     43             kSkipPipe_Flag              = 1 << 2,
     44             kSkipPipeCrossProcess_Flag  = 1 << 3,
     45             kSkipTiled_Flag             = 1 << 4,
     46             kSkip565_Flag               = 1 << 5,
     47             kSkipScaledReplay_Flag      = 1 << 6,
     48             kSkipGPU_Flag               = 1 << 7,
     49             kSkipPDFRasterization_Flag  = 1 << 8,
     50 
     51             kGPUOnly_Flag               = 1 << 9,
     52         };
     53 
     54         void draw(SkCanvas*);
     55         void drawBackground(SkCanvas*);
     56         void drawContent(SkCanvas*);
     57 
     58         SkISize getISize() { return this->onISize(); }
     59         const char* shortName();
     60 
     61         uint32_t getFlags() const {
     62             return this->onGetFlags();
     63         }
     64 
     65         SkScalar width() {
     66             return SkIntToScalar(this->getISize().width());
     67         }
     68         SkScalar height() {
     69             return SkIntToScalar(this->getISize().height());
     70         }
     71 
     72         // TODO(vandebo) Instead of exposing this, we should run all the GMs
     73         // with and without an initial transform.
     74         // Most GMs will return the identity matrix, but some PDFs tests
     75         // require setting the initial transform.
     76         SkMatrix getInitialTransform() const {
     77             SkMatrix matrix = fStarterMatrix;
     78             matrix.preConcat(this->onGetInitialTransform());
     79             return matrix;
     80         }
     81 
     82         SkColor getBGColor() const { return fBGColor; }
     83         void setBGColor(SkColor);
     84 
     85         // helper: fill a rect in the specified color based on the
     86         // GM's getISize bounds.
     87         void drawSizeBounds(SkCanvas*, SkColor);
     88 
     89         static void SetResourcePath(const char* resourcePath) {
     90             gResourcePath = resourcePath;
     91         }
     92 
     93         static SkString& GetResourcePath() {
     94             return gResourcePath;
     95         }
     96 
     97         bool isCanvasDeferred() const { return fCanvasIsDeferred; }
     98         void setCanvasIsDeferred(bool isDeferred) {
     99             fCanvasIsDeferred = isDeferred;
    100         }
    101 
    102     const SkMatrix& getStarterMatrix() { return fStarterMatrix; }
    103     void setStarterMatrix(const SkMatrix& matrix) {
    104         fStarterMatrix = matrix;
    105     }
    106 
    107     protected:
    108         static SkString gResourcePath;
    109 
    110         virtual void onOnceBeforeDraw() {}
    111         virtual void onDraw(SkCanvas*) = 0;
    112         virtual void onDrawBackground(SkCanvas*);
    113         virtual SkISize onISize() = 0;
    114         virtual SkString onShortName() = 0;
    115         virtual uint32_t onGetFlags() const { return 0; }
    116         virtual SkMatrix onGetInitialTransform() const { return SkMatrix::I(); }
    117 
    118     private:
    119         SkString fShortName;
    120         SkColor  fBGColor;
    121         bool     fCanvasIsDeferred; // work-around problem in srcmode.cpp
    122         bool     fHaveCalledOnceBeforeDraw;
    123         SkMatrix fStarterMatrix;
    124     };
    125 
    126     typedef SkTRegistry<GM*(*)(void*)> GMRegistry;
    127 }
    128 
    129 #endif
    130