/*
 * 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"
#include "SkTypedEnum.h"

#pragma pack(push, 1)

struct SkIBMFamilyClass {
    SK_TYPED_ENUM(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
        SK_SEQ_END,
    (familyClass)SK_SEQ_END)
    union SubClass {
        struct OldstyleSerifs {
            SK_TYPED_ENUM(Value, 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))
                SK_SEQ_END,
            (value)SK_SEQ_END)
        } oldstyleSerifs;
        struct TransitionalSerifs {
            SK_TYPED_ENUM(Value, SK_OT_BYTE,
                ((NoClassification, 0))
                ((DirectLine, 1))
                ((Script, 2))
                //3-14 reserved for future use
                ((Miscellaneous, 15))
                SK_SEQ_END,
            (value)SK_SEQ_END)
        } transitionalSerifs;
        struct ModernSerifs {
            SK_TYPED_ENUM(Value, SK_OT_BYTE,
                ((NoClassification, 0))
                ((Italian, 1))
                ((Script, 2))
                //3-14 reserved for future use
                ((Miscellaneous, 15))
                SK_SEQ_END,
            (value)SK_SEQ_END)
        } modernSerifs;
        struct ClarendonSerifs {
            SK_TYPED_ENUM(Value, 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))
                SK_SEQ_END,
            (value)SK_SEQ_END)
        } clarendonSerifs;
        struct SlabSerifs {
            SK_TYPED_ENUM(Value, SK_OT_BYTE,
                ((NoClassification, 0))
                ((Monotone, 1))
                ((Humanist, 2))
                ((Geometric, 3))
                ((Swiss, 4))
                ((Typewriter, 5))
                //6-14 reserved for future use
                ((Miscellaneous, 15))
                SK_SEQ_END,
            (value)SK_SEQ_END)
        } slabSerifs;
        struct FreeformSerifs {
            SK_TYPED_ENUM(Value, SK_OT_BYTE,
                ((NoClassification, 0))
                ((Modern, 1))
                //2-14 reserved for future use
                ((Miscellaneous, 15))
                SK_SEQ_END,
            (value)SK_SEQ_END)
        } freeformSerifs;
        struct SansSerif {
            SK_TYPED_ENUM(Value, 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))
                SK_SEQ_END,
            (value)SK_SEQ_END)
        } sansSerif;
        struct Ornamentals {
            SK_TYPED_ENUM(Value, SK_OT_BYTE,
                ((NoClassification, 0))
                ((Engraver, 1))
                ((BlackLetter, 2))
                ((Decorative, 3))
                ((ThreeDimensional, 4))
                //5-14 reserved for future use
                ((Miscellaneous, 15))
                SK_SEQ_END,
            (value)SK_SEQ_END)
        } ornamentals;
        struct Scripts {
            SK_TYPED_ENUM(Value, 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))
                SK_SEQ_END,
            (value)SK_SEQ_END)
        } scripts;
        struct Symbolic {
            SK_TYPED_ENUM(Value, 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))
                SK_SEQ_END,
            (value)SK_SEQ_END)
        } symbolic;
    } familySubClass;
};

#pragma pack(pop)


SK_COMPILE_ASSERT(sizeof(SkIBMFamilyClass) == 2, sizeof_SkIBMFamilyClass_not_2);

#endif
