gm.h revision c3bd8af6d5722e854feca70c40d92f4954c5b67b
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org 800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com#ifndef skiagm_DEFINED 900dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com#define skiagm_DEFINED 1000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 11d4af56c5f24a7bf0200e20a591d55f8c82fb9627epoger@google.com#include "SkBitmap.h" 12dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com#include "SkCanvas.h" 13dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com#include "SkPaint.h" 14dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com#include "SkSize.h" 1500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com#include "SkString.h" 1600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com#include "SkTRegistry.h" 1700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 1862b50b7bb8395f9bc281a4d0ed20acc4813f1445mtklein@google.com#if SK_SUPPORT_GPU 1962b50b7bb8395f9bc281a4d0ed20acc4813f1445mtklein@google.com#include "GrContext.h" 2062b50b7bb8395f9bc281a4d0ed20acc4813f1445mtklein@google.com#endif 2162b50b7bb8395f9bc281a4d0ed20acc4813f1445mtklein@google.com 224117a24de4c2dedf47db44746f6636ade6e29deareed@google.com#define DEF_GM(code) \ 230f0d9b720e1afef91d30c83b379725b8a53fafc8sugoi@google.com static skiagm::GM* SK_MACRO_APPEND_LINE(F_)(void*) { code; } \ 244117a24de4c2dedf47db44746f6636ade6e29deareed@google.com static skiagm::GMRegistry SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_)); 254117a24de4c2dedf47db44746f6636ade6e29deareed@google.com 2600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comnamespace skiagm { 27d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 285efdd0cb9cdf4c2017dc6ad70b2503bf04234d9bepoger@google.com static inline SkISize make_isize(int w, int h) { 295efdd0cb9cdf4c2017dc6ad70b2503bf04234d9bepoger@google.com SkISize sz; 305efdd0cb9cdf4c2017dc6ad70b2503bf04234d9bepoger@google.com sz.set(w, h); 315efdd0cb9cdf4c2017dc6ad70b2503bf04234d9bepoger@google.com return sz; 325efdd0cb9cdf4c2017dc6ad70b2503bf04234d9bepoger@google.com } 3300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 3400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com class GM { 3500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com public: 3600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com GM(); 3700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com virtual ~GM(); 38d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 39fbc21172885fe1f028594bc9b181246c71eb106creed@google.com enum Flags { 40805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org kSkipPDF_Flag = 1 << 0, 41805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org kSkipPicture_Flag = 1 << 1, 42805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org kSkipPipe_Flag = 1 << 2, 43805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org kSkipPipeCrossProcess_Flag = 1 << 3, 44805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org kSkipTiled_Flag = 1 << 4, 45805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org kSkip565_Flag = 1 << 5, 46805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org kSkipScaledReplay_Flag = 1 << 6, 47805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org kSkipGPU_Flag = 1 << 7, 480dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org kSkipPDFRasterization_Flag = 1 << 8, 4978a1078f17f4f0ae63415298517262a64f706af6commit-bot@chromium.org 5078a1078f17f4f0ae63415298517262a64f706af6commit-bot@chromium.org kGPUOnly_Flag = 1 << 9, 516adce6783c5d7cbef276d04cc08a2b19789a0156commit-bot@chromium.org 526adce6783c5d7cbef276d04cc08a2b19789a0156commit-bot@chromium.org kAsBench_Flag = 1 << 10, // Run the GM as a benchmark in the bench tool 53fbc21172885fe1f028594bc9b181246c71eb106creed@google.com }; 54fbc21172885fe1f028594bc9b181246c71eb106creed@google.com 55b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org enum Mode { 56b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org kGM_Mode, 57b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org kSample_Mode, 58b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org kBench_Mode, 59b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org }; 60b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org 61b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org void setMode(Mode mode) { fMode = mode; } 62b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org Mode getMode() const { return fMode; } 63b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org 6448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com void draw(SkCanvas*); 6548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com void drawBackground(SkCanvas*); 6648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com void drawContent(SkCanvas*); 67d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 688570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com SkISize getISize() { return this->onISize(); } 6948dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com const char* shortName(); 7000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 71fbc21172885fe1f028594bc9b181246c71eb106creed@google.com uint32_t getFlags() const { 72fbc21172885fe1f028594bc9b181246c71eb106creed@google.com return this->onGetFlags(); 73fbc21172885fe1f028594bc9b181246c71eb106creed@google.com } 7479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 75487b5606e2ddaf15d733b7d46fe2bfa2246aa51dreed@google.com SkScalar width() { 76487b5606e2ddaf15d733b7d46fe2bfa2246aa51dreed@google.com return SkIntToScalar(this->getISize().width()); 77487b5606e2ddaf15d733b7d46fe2bfa2246aa51dreed@google.com } 78487b5606e2ddaf15d733b7d46fe2bfa2246aa51dreed@google.com SkScalar height() { 79ab02627ae75f49271837b05c64721eb454d78ce5scroggo@google.com return SkIntToScalar(this->getISize().height()); 80487b5606e2ddaf15d733b7d46fe2bfa2246aa51dreed@google.com } 81487b5606e2ddaf15d733b7d46fe2bfa2246aa51dreed@google.com 8279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org // TODO(vandebo) Instead of exposing this, we should run all the GMs 8379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org // with and without an initial transform. 8479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org // Most GMs will return the identity matrix, but some PDFs tests 8579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org // require setting the initial transform. 8679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkMatrix getInitialTransform() const { 87f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org SkMatrix matrix = fStarterMatrix; 88f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org matrix.preConcat(this->onGetInitialTransform()); 89f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org return matrix; 9079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org } 9179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 92b4b49ccc41b717a4274470d73785f9b913d97b59reed@google.com SkColor getBGColor() const { return fBGColor; } 9348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com void setBGColor(SkColor); 9430db599c1de70b2832ff9ec05c266a4c9b515d94reed@google.com 952d6ef528e57928160aba6b628b2d84180ced97c3reed@google.com // helper: fill a rect in the specified color based on the 962d6ef528e57928160aba6b628b2d84180ced97c3reed@google.com // GM's getISize bounds. 972d6ef528e57928160aba6b628b2d84180ced97c3reed@google.com void drawSizeBounds(SkCanvas*, SkColor); 982d6ef528e57928160aba6b628b2d84180ced97c3reed@google.com 99d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com static void SetResourcePath(const char* resourcePath) { 100d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com gResourcePath = resourcePath; 1018570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com } 1028570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com 1032bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com static SkString& GetResourcePath() { 1042bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com return gResourcePath; 1052bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com } 1062bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com 107aef73617d1bcede80145a13639668f958a3863d8reed@google.com bool isCanvasDeferred() const { return fCanvasIsDeferred; } 108aef73617d1bcede80145a13639668f958a3863d8reed@google.com void setCanvasIsDeferred(bool isDeferred) { 109aef73617d1bcede80145a13639668f958a3863d8reed@google.com fCanvasIsDeferred = isDeferred; 110aef73617d1bcede80145a13639668f958a3863d8reed@google.com } 111aef73617d1bcede80145a13639668f958a3863d8reed@google.com 112b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org const SkMatrix& getStarterMatrix() { return fStarterMatrix; } 113b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org void setStarterMatrix(const SkMatrix& matrix) { 114b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org fStarterMatrix = matrix; 115b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org } 116f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org 1178570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com protected: 1188570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com static SkString gResourcePath; 1198570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com 1207775d66aa0e5958c9ea55ddb8317af4d9b019220reed@google.com virtual void onOnceBeforeDraw() {} 1218570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com virtual void onDraw(SkCanvas*) = 0; 1228570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com virtual void onDrawBackground(SkCanvas*); 1238570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com virtual SkISize onISize() = 0; 1248015dd83ae37147bb630d4751030868051ad0caereed@android.com virtual SkString onShortName() = 0; 125fbc21172885fe1f028594bc9b181246c71eb106creed@google.com virtual uint32_t onGetFlags() const { return 0; } 12679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org virtual SkMatrix onGetInitialTransform() const { return SkMatrix::I(); } 12779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 1288015dd83ae37147bb630d4751030868051ad0caereed@android.com private: 129b21fac156d9287d6c0cfd446d707c4c7be6fae6ecommit-bot@chromium.org Mode fMode; 1308015dd83ae37147bb630d4751030868051ad0caereed@android.com SkString fShortName; 13148dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com SkColor fBGColor; 132aef73617d1bcede80145a13639668f958a3863d8reed@google.com bool fCanvasIsDeferred; // work-around problem in srcmode.cpp 1337775d66aa0e5958c9ea55ddb8317af4d9b019220reed@google.com bool fHaveCalledOnceBeforeDraw; 134f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org SkMatrix fStarterMatrix; 13500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com }; 13600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 137bd6343b1d60d2a85e930f33f4b06b4502b3e8caamtklein@google.com typedef SkTRegistry<GM*(*)(void*)> GMRegistry; 13800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com} 13900dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 14000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com#endif 141