gm.h revision 880914c35c8f7fc2e9c57134134c883baf66e538
19434a0749f26c640305f68ef85d17a31063a5705Ian Romanick/* 29434a0749f26c640305f68ef85d17a31063a5705Ian Romanick * Copyright 2011 Google Inc. 39434a0749f26c640305f68ef85d17a31063a5705Ian Romanick * 49434a0749f26c640305f68ef85d17a31063a5705Ian Romanick * Use of this source code is governed by a BSD-style license that can be 59434a0749f26c640305f68ef85d17a31063a5705Ian Romanick * found in the LICENSE file. 69434a0749f26c640305f68ef85d17a31063a5705Ian Romanick */ 79434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 89434a0749f26c640305f68ef85d17a31063a5705Ian Romanick#ifndef skiagm_DEFINED 99434a0749f26c640305f68ef85d17a31063a5705Ian Romanick#define skiagm_DEFINED 109434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 119434a0749f26c640305f68ef85d17a31063a5705Ian Romanick#include "SkBitmap.h" 129434a0749f26c640305f68ef85d17a31063a5705Ian Romanick#include "SkCanvas.h" 139434a0749f26c640305f68ef85d17a31063a5705Ian Romanick#include "SkPaint.h" 149434a0749f26c640305f68ef85d17a31063a5705Ian Romanick#include "SkSize.h" 159434a0749f26c640305f68ef85d17a31063a5705Ian Romanick#include "SkString.h" 169434a0749f26c640305f68ef85d17a31063a5705Ian Romanick#include "SkTRegistry.h" 179434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 189434a0749f26c640305f68ef85d17a31063a5705Ian Romanick#if SK_SUPPORT_GPU 199434a0749f26c640305f68ef85d17a31063a5705Ian Romanick#include "GrContext.h" 209434a0749f26c640305f68ef85d17a31063a5705Ian Romanick#endif 219434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 229434a0749f26c640305f68ef85d17a31063a5705Ian Romanick#define DEF_GM(code) \ 239434a0749f26c640305f68ef85d17a31063a5705Ian Romanick static skiagm::GM* SK_MACRO_APPEND_LINE(F_)(void*) { code; } \ 249434a0749f26c640305f68ef85d17a31063a5705Ian Romanick static skiagm::GMRegistry SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_)); 259434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 269434a0749f26c640305f68ef85d17a31063a5705Ian Romanicknamespace skiagm { 279434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 289434a0749f26c640305f68ef85d17a31063a5705Ian Romanick static inline SkISize make_isize(int w, int h) { 299434a0749f26c640305f68ef85d17a31063a5705Ian Romanick SkISize sz; 309434a0749f26c640305f68ef85d17a31063a5705Ian Romanick sz.set(w, h); 319434a0749f26c640305f68ef85d17a31063a5705Ian Romanick return sz; 329434a0749f26c640305f68ef85d17a31063a5705Ian Romanick } 339434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 349434a0749f26c640305f68ef85d17a31063a5705Ian Romanick class GM { 359434a0749f26c640305f68ef85d17a31063a5705Ian Romanick public: 369434a0749f26c640305f68ef85d17a31063a5705Ian Romanick GM(); 379434a0749f26c640305f68ef85d17a31063a5705Ian Romanick virtual ~GM(); 389434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 399434a0749f26c640305f68ef85d17a31063a5705Ian Romanick enum Flags { 40bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kSkipPDF_Flag = 1 << 0, 41bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kSkipPicture_Flag = 1 << 1, 42bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kSkipPipe_Flag = 1 << 2, 43bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kSkipPipeCrossProcess_Flag = 1 << 3, 44bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kSkipTiled_Flag = 1 << 4, 45bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kSkip565_Flag = 1 << 5, 46bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kSkipScaledReplay_Flag = 1 << 6, 47bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kSkipGPU_Flag = 1 << 7, 48bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kSkipPDFRasterization_Flag = 1 << 8, 49bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick 50bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kGPUOnly_Flag = 1 << 9, 51bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick 52bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kAsBench_Flag = 1 << 10, // Run the GM as a benchmark in the bench tool 53bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick }; 54bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick 55bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick enum Mode { 56bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kGM_Mode, 57bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kSample_Mode, 58bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick kBench_Mode, 59bfe3fbb38e0a3ae7c1efb74282628c2cc5abc3e0Ian Romanick }; 609434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 619434a0749f26c640305f68ef85d17a31063a5705Ian Romanick void setMode(Mode mode) { fMode = mode; } 629434a0749f26c640305f68ef85d17a31063a5705Ian Romanick Mode getMode() const { return fMode; } 639434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 649434a0749f26c640305f68ef85d17a31063a5705Ian Romanick void draw(SkCanvas*); 659434a0749f26c640305f68ef85d17a31063a5705Ian Romanick void drawBackground(SkCanvas*); 669434a0749f26c640305f68ef85d17a31063a5705Ian Romanick void drawContent(SkCanvas*); 679434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 689434a0749f26c640305f68ef85d17a31063a5705Ian Romanick SkISize getISize() { return this->onISize(); } 699434a0749f26c640305f68ef85d17a31063a5705Ian Romanick const char* getName(); 709434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 719434a0749f26c640305f68ef85d17a31063a5705Ian Romanick uint32_t getFlags() const { 729434a0749f26c640305f68ef85d17a31063a5705Ian Romanick return this->onGetFlags(); 739434a0749f26c640305f68ef85d17a31063a5705Ian Romanick } 749434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 759434a0749f26c640305f68ef85d17a31063a5705Ian Romanick SkScalar width() { 769434a0749f26c640305f68ef85d17a31063a5705Ian Romanick return SkIntToScalar(this->getISize().width()); 779434a0749f26c640305f68ef85d17a31063a5705Ian Romanick } 789434a0749f26c640305f68ef85d17a31063a5705Ian Romanick SkScalar height() { 799434a0749f26c640305f68ef85d17a31063a5705Ian Romanick return SkIntToScalar(this->getISize().height()); 809434a0749f26c640305f68ef85d17a31063a5705Ian Romanick } 819434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 829434a0749f26c640305f68ef85d17a31063a5705Ian Romanick // TODO(vandebo) Instead of exposing this, we should run all the GMs 839434a0749f26c640305f68ef85d17a31063a5705Ian Romanick // with and without an initial transform. 849434a0749f26c640305f68ef85d17a31063a5705Ian Romanick // Most GMs will return the identity matrix, but some PDFs tests 859434a0749f26c640305f68ef85d17a31063a5705Ian Romanick // require setting the initial transform. 869434a0749f26c640305f68ef85d17a31063a5705Ian Romanick SkMatrix getInitialTransform() const { 879434a0749f26c640305f68ef85d17a31063a5705Ian Romanick SkMatrix matrix = fStarterMatrix; 889434a0749f26c640305f68ef85d17a31063a5705Ian Romanick matrix.preConcat(this->onGetInitialTransform()); 899434a0749f26c640305f68ef85d17a31063a5705Ian Romanick return matrix; 909434a0749f26c640305f68ef85d17a31063a5705Ian Romanick } 919434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 929434a0749f26c640305f68ef85d17a31063a5705Ian Romanick SkColor getBGColor() const { return fBGColor; } 939434a0749f26c640305f68ef85d17a31063a5705Ian Romanick void setBGColor(SkColor); 949434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 959434a0749f26c640305f68ef85d17a31063a5705Ian Romanick // helper: fill a rect in the specified color based on the 969434a0749f26c640305f68ef85d17a31063a5705Ian Romanick // GM's getISize bounds. 979434a0749f26c640305f68ef85d17a31063a5705Ian Romanick void drawSizeBounds(SkCanvas*, SkColor); 989434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 999434a0749f26c640305f68ef85d17a31063a5705Ian Romanick static void SetResourcePath(const char*); 1009434a0749f26c640305f68ef85d17a31063a5705Ian Romanick static SkString GetResourcePath(); 1019434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 1029434a0749f26c640305f68ef85d17a31063a5705Ian Romanick bool isCanvasDeferred() const { return fCanvasIsDeferred; } 1039434a0749f26c640305f68ef85d17a31063a5705Ian Romanick void setCanvasIsDeferred(bool isDeferred) { 1049434a0749f26c640305f68ef85d17a31063a5705Ian Romanick fCanvasIsDeferred = isDeferred; 1059434a0749f26c640305f68ef85d17a31063a5705Ian Romanick } 1069434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 1073bcfafcf0320ee5407716ff67062e80d162760d4Ian Romanick const SkMatrix& getStarterMatrix() { return fStarterMatrix; } 1083bcfafcf0320ee5407716ff67062e80d162760d4Ian Romanick void setStarterMatrix(const SkMatrix& matrix) { 1093bcfafcf0320ee5407716ff67062e80d162760d4Ian Romanick fStarterMatrix = matrix; 1103bcfafcf0320ee5407716ff67062e80d162760d4Ian Romanick } 1113bcfafcf0320ee5407716ff67062e80d162760d4Ian Romanick 1129434a0749f26c640305f68ef85d17a31063a5705Ian Romanick protected: 1139434a0749f26c640305f68ef85d17a31063a5705Ian Romanick static const char* gResourcePath; 1143bcfafcf0320ee5407716ff67062e80d162760d4Ian Romanick 1159434a0749f26c640305f68ef85d17a31063a5705Ian Romanick virtual void onOnceBeforeDraw() {} 1169434a0749f26c640305f68ef85d17a31063a5705Ian Romanick virtual void onDraw(SkCanvas*) = 0; 1179434a0749f26c640305f68ef85d17a31063a5705Ian Romanick virtual void onDrawBackground(SkCanvas*); 1189434a0749f26c640305f68ef85d17a31063a5705Ian Romanick virtual SkISize onISize() = 0; 1199434a0749f26c640305f68ef85d17a31063a5705Ian Romanick virtual SkString onShortName() = 0; 1209434a0749f26c640305f68ef85d17a31063a5705Ian Romanick virtual uint32_t onGetFlags() const { return 0; } 1219434a0749f26c640305f68ef85d17a31063a5705Ian Romanick virtual SkMatrix onGetInitialTransform() const { return SkMatrix::I(); } 1229434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 1239434a0749f26c640305f68ef85d17a31063a5705Ian Romanick private: 1249434a0749f26c640305f68ef85d17a31063a5705Ian Romanick Mode fMode; 1259434a0749f26c640305f68ef85d17a31063a5705Ian Romanick SkString fShortName; 1269434a0749f26c640305f68ef85d17a31063a5705Ian Romanick SkColor fBGColor; 1279434a0749f26c640305f68ef85d17a31063a5705Ian Romanick bool fCanvasIsDeferred; // work-around problem in srcmode.cpp 1289434a0749f26c640305f68ef85d17a31063a5705Ian Romanick bool fHaveCalledOnceBeforeDraw; 1299434a0749f26c640305f68ef85d17a31063a5705Ian Romanick SkMatrix fStarterMatrix; 1309434a0749f26c640305f68ef85d17a31063a5705Ian Romanick }; 1319434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 1329434a0749f26c640305f68ef85d17a31063a5705Ian Romanick typedef SkTRegistry<GM*(*)(void*)> GMRegistry; 1339434a0749f26c640305f68ef85d17a31063a5705Ian Romanick} 1349434a0749f26c640305f68ef85d17a31063a5705Ian Romanick 1359434a0749f26c640305f68ef85d17a31063a5705Ian Romanick#endif 1369434a0749f26c640305f68ef85d17a31063a5705Ian Romanick