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