/*
 * Copyright 2012 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkIBMFamilyClass_DEFINED
#define SkIBMFamilyClass_DEFINED

#include "SkOTTableTypes.h"

#pragma pack(push, 1)

struct SkIBMFamilyClass {
    enum class Class : SK_OT_BYTE {
        NoClassification = 0,
        OldstyleSerifs = 1,
        TransitionalSerifs = 2,
        ModernSerifs = 3,
        ClarendonSerifs = 4,
        SlabSerifs = 5,
        //6 reserved for future use
        FreeformSerifs = 7,
        SansSerif = 8,
        Ornamentals = 9,
        Scripts = 10,
        //11 reserved for future use
        Symbolic = 12,
        //13-15 reserved for future use
    } familyClass;
    union SubClass {
        enum class OldstyleSerifs : SK_OT_BYTE {
            NoClassification = 0,
            IBMRoundedLegibility = 1,
            Garalde = 2,
            Venetian = 3,
            ModifiedVenetian = 4,
            DutchModern = 5,
            DutchTraditional = 6,
            Contemporary = 7,
            Calligraphic = 8,
            //9-14 reserved for future use
            Miscellaneous = 15,
        } oldstyleSerifs;
        enum class TransitionalSerifs : SK_OT_BYTE {
            NoClassification = 0,
            DirectLine = 1,
            Script = 2,
            //3-14 reserved for future use
            Miscellaneous = 15,
        } transitionalSerifs;
        enum class ModernSerifs : SK_OT_BYTE {
            NoClassification = 0,
            Italian = 1,
            Script = 2,
            //3-14 reserved for future use
            Miscellaneous = 15,
        } modernSerifs;
        enum class ClarendonSerifs : SK_OT_BYTE {
            NoClassification = 0,
            Clarendon = 1,
            Modern = 2,
            Traditional = 3,
            Newspaper = 4,
            StubSerif = 5,
            Monotone = 6,
            Typewriter = 7,
            //8-14 reserved for future use
            Miscellaneous = 15,
        } clarendonSerifs;
        enum class SlabSerifs : SK_OT_BYTE {
            NoClassification = 0,
            Monotone = 1,
            Humanist = 2,
            Geometric = 3,
            Swiss = 4,
            Typewriter = 5,
            //6-14 reserved for future use
            Miscellaneous = 15,
        } slabSerifs;
        enum class FreeformSerifs : SK_OT_BYTE {
            NoClassification = 0,
            Modern = 1,
            //2-14 reserved for future use
            Miscellaneous = 15,
        } freeformSerifs;
        enum class SansSerif : SK_OT_BYTE {
            NoClassification = 0,
            IBMNeoGrotesqueGothic = 1,
            Humanist = 2,
            LowXRoundGeometric = 3,
            HighXRoundGeometric = 4,
            NeoGrotesqueGothic = 5,
            ModifiedNeoGrotesqueGothic = 6,
            //7-8 reserved for future use
            TypewriterGothic = 9,
            Matrix = 10,
            //11-14 reserved for future use
            Miscellaneous = 15,
        } sansSerif;
        enum class Ornamentals : SK_OT_BYTE {
            NoClassification = 0,
            Engraver = 1,
            BlackLetter = 2,
            Decorative = 3,
            ThreeDimensional = 4,
            //5-14 reserved for future use
            Miscellaneous = 15,
        } ornamentals;
        enum class Scripts : SK_OT_BYTE {
            NoClassification = 0,
            Uncial = 1,
            Brush_Joined = 2,
            Formal_Joined = 3,
            Monotone_Joined = 4,
            Calligraphic = 5,
            Brush_Unjoined = 6,
            Formal_Unjoined = 7,
            Monotone_Unjoined = 8,
            //9-14 reserved for future use
            Miscellaneous = 15,
        } scripts;
        enum class Symbolic : SK_OT_BYTE {
            NoClassification = 0,
            //1-2 reserved for future use
            MixedSerif = 3,
            //4-5 reserved for future use
            OldstyleSerif = 6,
            NeoGrotesqueSansSerif = 7,
            //8-14 reserved for future use
            Miscellaneous = 15,
        } symbolic;
    } familySubClass;
};

#pragma pack(pop)


static_assert(sizeof(SkIBMFamilyClass) == 2, "sizeof_SkIBMFamilyClass_not_2");

#endif
