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