180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef skiagm_DEFINED
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define skiagm_DEFINED
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBitmap.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDevice.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPaint.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkSize.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h"
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTRegistry.h"
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define DEF_GM(code) \
20096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static skiagm::GM*          SK_MACRO_APPEND_LINE(F_)(void*) { code; } \
21363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    static skiagm::GMRegistry   SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_));
22363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querunamespace skiagm {
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
25096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static inline SkISize make_isize(int w, int h) {
26096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        SkISize sz;
27096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        sz.set(w, h);
28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        return sz;
29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    class GM {
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    public:
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        GM();
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        virtual ~GM();
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        enum Flags {
37d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            kSkipPDF_Flag           = 1 << 0,
38d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            kSkipPicture_Flag       = 1 << 1,
39d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            kSkipPipe_Flag          = 1 << 2,
40d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            kSkipTiled_Flag         = 1 << 3,
41d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            kSkip565_Flag           = 1 << 4,
42d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            kSkipScaledReplay_Flag  = 1 << 5,
43096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            kSkipGPU_Flag           = 1 << 6,
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        };
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        void draw(SkCanvas*);
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        void drawBackground(SkCanvas*);
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        void drawContent(SkCanvas*);
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkISize getISize() { return this->onISize(); }
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const char* shortName();
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        uint32_t getFlags() const {
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return this->onGetFlags();
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
57d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        SkScalar width() {
58d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            return SkIntToScalar(this->getISize().width());
59d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        }
60d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        SkScalar height() {
617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            return SkIntToScalar(this->getISize().height());
62d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        }
63d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // TODO(vandebo) Instead of exposing this, we should run all the GMs
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // with and without an initial transform.
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // Most GMs will return the identity matrix, but some PDFs tests
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // require setting the initial transform.
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkMatrix getInitialTransform() const {
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return this->onGetInitialTransform();
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkColor getBGColor() const { return fBGColor; }
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        void setBGColor(SkColor);
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // helper: fill a rect in the specified color based on the
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // GM's getISize bounds.
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        void drawSizeBounds(SkCanvas*, SkColor);
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        static void SetResourcePath(const char* resourcePath) {
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            gResourcePath = resourcePath;
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        static SkString& GetResourcePath() {
8458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            return gResourcePath;
8558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        }
8658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
87363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        bool isCanvasDeferred() const { return fCanvasIsDeferred; }
88363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        void setCanvasIsDeferred(bool isDeferred) {
89363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            fCanvasIsDeferred = isDeferred;
90363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        }
91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    protected:
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        static SkString gResourcePath;
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
95363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        virtual void onOnceBeforeDraw() {}
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        virtual void onDraw(SkCanvas*) = 0;
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        virtual void onDrawBackground(SkCanvas*);
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        virtual SkISize onISize() = 0;
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        virtual SkString onShortName() = 0;
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        virtual uint32_t onGetFlags() const { return 0; }
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        virtual SkMatrix onGetInitialTransform() const { return SkMatrix::I(); }
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    private:
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkString fShortName;
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkColor  fBGColor;
106363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        bool     fCanvasIsDeferred; // work-around problem in srcmode.cpp
107363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        bool     fHaveCalledOnceBeforeDraw;
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkTRegistry<GM*, void*> GMRegistry;
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
114