#ifndef SkDeviceProperties_DEFINED
#define SkDeviceProperties_DEFINED

#ifndef SK_GAMMA_EXPONENT
    #define SK_GAMMA_EXPONENT (2.2f)
#endif

#ifdef SK_GAMMA_SRGB
    #undef SK_GAMMA_EXPONENT
    #define SK_GAMMA_EXPONENT (0.0f)
#endif

//TODO: get everyone to stop using SkFontHost::SetSubpixel* and remove this import.
#include "SkFontHost.h"

struct SkDeviceProperties {
    struct Geometry {
        /** The orientation of the pixel specifies the interpretation of the
        *  layout. If the orientation is horizontal, the layout is interpreted as
        *  left to right. It the orientation is vertical, the layout is
        *  interpreted top to bottom (rotated 90deg cw from horizontal).
        */
        enum Orientation {
            kUnknown_Orientation      = 0x0,
            kKnown_Orientation        = 0x2,

            kHorizontal_Orientation   = 0x2,  //!< this is the default
            kVertical_Orientation     = 0x3,

            kOrientationMask          = 0x3,
        };

        /** The layout of the pixel specifies its subpixel geometry.
        *
        *  kUnknown_Layout means that the subpixel elements are not spatially
        *  separated in any known or usable fashion.
        */
        enum Layout {
            kUnknown_Layout   = 0x0,
            kKnown_Layout     = 0x8,

            kRGB_Layout       = 0x8,  //!< this is the default
            kBGR_Layout       = 0xC,

            kLayoutMask       = 0xC,
        };

        Orientation getOrientation() {
            return static_cast<Orientation>(fGeometry | kOrientationMask);
        }
        Layout getLayout() {
            return static_cast<Layout>(fGeometry | kLayoutMask);
        }

        bool isOrientationKnown() {
            return SkToBool(fGeometry & kKnown_Orientation);
        }
        bool isLayoutKnown() {
            return SkToBool(fGeometry & kKnown_Layout);
        }

    private:
        //TODO: get everyone to stop using SkFontHost::SetSubpixel* and replace these calls with constants.
        static Orientation fromOldOrientation(SkFontHost::LCDOrientation orientation) {
            switch (orientation) {
            case SkFontHost::kHorizontal_LCDOrientation: return kHorizontal_Orientation;
            case SkFontHost::kVertical_LCDOrientation: return kVertical_Orientation;
            default: return kUnknown_Orientation;
            }
        }
        static Layout fromOldLayout(SkFontHost::LCDOrder order) {
            switch (order) {
            case SkFontHost::kRGB_LCDOrder: return kRGB_Layout;
            case SkFontHost::kBGR_LCDOrder: return kBGR_Layout;
            default: return kUnknown_Layout;
            }
        }
    public:
        static Geometry MakeDefault() {
            Orientation orientation = fromOldOrientation(SkFontHost::GetSubpixelOrientation()); //kHorizontal_Orientation
            Layout layout = fromOldLayout(SkFontHost::GetSubpixelOrder()); //kRGB_Layout
            Geometry ret = { SkToU8(orientation | layout) };
            return ret;
        }

        static Geometry Make(Orientation orientation, Layout layout) {
            Geometry ret = { SkToU8(orientation | layout) };
            return ret;
        }

        uint8_t fGeometry;
    };

    static SkDeviceProperties MakeDefault() {
        SkDeviceProperties ret = { Geometry::MakeDefault(), SK_GAMMA_EXPONENT };
        return ret;
    }

    static SkDeviceProperties Make(Geometry geometry, SkScalar gamma) {
        SkDeviceProperties ret = { geometry, gamma };
        return ret;
    }

    /** Each pixel of an image will have some number of channels.
     *  Can the layout of those channels be exploited? */
    Geometry fGeometry;

    /** Represents the color space of the image. This is a woefully inadequate beginning. */
    SkScalar fGamma;
};

#endif
