180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef skiagm_DEFINED 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define skiagm_DEFINED 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBitmap.h" 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDevice.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPaint.h" 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkSize.h" 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h" 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTRegistry.h" 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define DEF_GM(code) \ 20096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger static skiagm::GM* SK_MACRO_APPEND_LINE(F_)(void*) { code; } \ 21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger static skiagm::GMRegistry SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_)); 22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querunamespace skiagm { 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 25096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger static inline SkISize make_isize(int w, int h) { 26096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger SkISize sz; 27096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger sz.set(w, h); 28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger return sz; 29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger } 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru class GM { 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru public: 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GM(); 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ~GM(); 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum Flags { 37d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger kSkipPDF_Flag = 1 << 0, 38d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger kSkipPicture_Flag = 1 << 1, 39d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger kSkipPipe_Flag = 1 << 2, 40d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger kSkipTiled_Flag = 1 << 3, 41d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger kSkip565_Flag = 1 << 4, 42d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger kSkipScaledReplay_Flag = 1 << 5, 43096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger kSkipGPU_Flag = 1 << 6, 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void draw(SkCanvas*); 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void drawBackground(SkCanvas*); 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void drawContent(SkCanvas*); 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkISize getISize() { return this->onISize(); } 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const char* shortName(); 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru uint32_t getFlags() const { 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return this->onGetFlags(); 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 57d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkScalar width() { 58d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger return SkIntToScalar(this->getISize().width()); 59d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger } 60d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkScalar height() { 617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger return SkIntToScalar(this->getISize().height()); 62d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger } 63d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // TODO(vandebo) Instead of exposing this, we should run all the GMs 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // with and without an initial transform. 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Most GMs will return the identity matrix, but some PDFs tests 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // require setting the initial transform. 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkMatrix getInitialTransform() const { 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return this->onGetInitialTransform(); 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColor getBGColor() const { return fBGColor; } 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void setBGColor(SkColor); 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // helper: fill a rect in the specified color based on the 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // GM's getISize bounds. 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void drawSizeBounds(SkCanvas*, SkColor); 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static void SetResourcePath(const char* resourcePath) { 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru gResourcePath = resourcePath; 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger static SkString& GetResourcePath() { 8458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return gResourcePath; 8558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 8658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 87363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger bool isCanvasDeferred() const { return fCanvasIsDeferred; } 88363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger void setCanvasIsDeferred(bool isDeferred) { 89363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fCanvasIsDeferred = isDeferred; 90363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru protected: 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkString gResourcePath; 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 95363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void onOnceBeforeDraw() {} 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onDraw(SkCanvas*) = 0; 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onDrawBackground(SkCanvas*); 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual SkISize onISize() = 0; 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual SkString onShortName() = 0; 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual uint32_t onGetFlags() const { return 0; } 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual SkMatrix onGetInitialTransform() const { return SkMatrix::I(); } 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru private: 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString fShortName; 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColor fBGColor; 106363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger bool fCanvasIsDeferred; // work-around problem in srcmode.cpp 107363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger bool fHaveCalledOnceBeforeDraw; 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkTRegistry<GM*, void*> GMRegistry; 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 114