10ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong/* 20ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong * Copyright 2011 Google Inc. 30ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong * 40ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong * Use of this source code is governed by a BSD-style license that can be 50ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong * found in the LICENSE file. 60ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong */ 70ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 80ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#ifndef skiagm_DEFINED 90ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define skiagm_DEFINED 100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "SkBitmap.h" 120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "SkCanvas.h" 130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "SkPaint.h" 140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "SkSize.h" 150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "SkString.h" 160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "SkTRegistry.h" 170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#if SK_SUPPORT_GPU 190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "GrContext.h" 200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#endif 210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define DEF_GM(code) \ 230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static skiagm::GM* SK_MACRO_APPEND_LINE(F_)(void*) { code; } \ 240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static skiagm::GMRegistry SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_)); 250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongnamespace skiagm { 270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong class GM { 290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong public: 300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong GM(); 310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong virtual ~GM(); 320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 331d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling enum Flags { 340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kSkipPDF_Flag = 1 << 0, 350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kSkipPicture_Flag = 1 << 1, 3679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez kSkipPipe_Flag = 1 << 2, 371d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling kSkipPipeCrossProcess_Flag = 1 << 3, 381d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling kSkipTiled_Flag = 1 << 4, 391d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling kSkip565_Flag = 1 << 5, 400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kSkipScaledReplay_Flag = 1 << 6, 410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kSkipGPU_Flag = 1 << 7, 420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kSkipPDFRasterization_Flag = 1 << 8, 430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kGPUOnly_Flag = 1 << 9, 450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 461d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling kAsBench_Flag = 1 << 10, // Run the GM as a benchmark in the bench tool 4779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez }; 4879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 4979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez enum Mode { 5079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez kGM_Mode, 510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kSample_Mode, 520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong kBench_Mode, 531d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling }; 541d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void setMode(Mode mode) { fMode = mode; } 560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Mode getMode() const { return fMode; } 570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 581d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling void draw(SkCanvas*); 591d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling void drawBackground(SkCanvas*); 600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void drawContent(SkCanvas*); 6179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez 6279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez SkISize getISize() { return this->onISize(); } 6379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez const char* getName(); 640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong uint32_t getFlags() const { 660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return this->onGetFlags(); 670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 681d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling 691d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling SkScalar width() { 700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return SkIntToScalar(this->getISize().width()); 711d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling } 721d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling SkScalar height() { 730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return SkIntToScalar(this->getISize().height()); 740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 7679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez // TODO(vandebo) Instead of exposing this, we should run all the GMs 770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // with and without an initial transform. 781d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // Most GMs will return the identity matrix, but some PDFs tests 791d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling // require setting the initial transform. 800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SkMatrix getInitialTransform() const { 811d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling SkMatrix matrix = fStarterMatrix; 8279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez matrix.preConcat(this->onGetInitialTransform()); 831d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling return matrix; 841d2624a10e2c559f8ba9ef89eaa30832c0a83a96Sascha Haeberling } 850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong SkColor getBGColor() const { return fBGColor; } 870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong void setBGColor(SkColor); 880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 89 // helper: fill a rect in the specified color based on the 90 // GM's getISize bounds. 91 void drawSizeBounds(SkCanvas*, SkColor); 92 93 bool isCanvasDeferred() const { return fCanvasIsDeferred; } 94 void setCanvasIsDeferred(bool isDeferred) { 95 fCanvasIsDeferred = isDeferred; 96 } 97 98 const SkMatrix& getStarterMatrix() { return fStarterMatrix; } 99 void setStarterMatrix(const SkMatrix& matrix) { 100 fStarterMatrix = matrix; 101 } 102 103 protected: 104 virtual void onOnceBeforeDraw() {} 105 virtual void onDraw(SkCanvas*) = 0; 106 virtual void onDrawBackground(SkCanvas*); 107 virtual SkISize onISize() = 0; 108 virtual SkString onShortName() = 0; 109 virtual uint32_t onGetFlags() const { return 0; } 110 virtual SkMatrix onGetInitialTransform() const { return SkMatrix::I(); } 111 112 private: 113 Mode fMode; 114 SkString fShortName; 115 SkColor fBGColor; 116 bool fCanvasIsDeferred; // work-around problem in srcmode.cpp 117 bool fHaveCalledOnceBeforeDraw; 118 SkMatrix fStarterMatrix; 119 }; 120 121 typedef SkTRegistry<GM*(*)(void*)> GMRegistry; 122} 123 124#endif 125