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

#ifndef SkOTTable_gasp_DEFINED
#define SkOTTable_gasp_DEFINED

#include "src/core/SkEndian.h"
#include "src/sfnt/SkOTTableTypes.h"

#pragma pack(push, 1)

struct SkOTTableGridAndScanProcedure {
    static const SK_OT_CHAR TAG0 = 'g';
    static const SK_OT_CHAR TAG1 = 'a';
    static const SK_OT_CHAR TAG2 = 's';
    static const SK_OT_CHAR TAG3 = 'p';
    static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableGridAndScanProcedure>::value;

    SK_OT_USHORT version;
    static const SK_OT_USHORT version0 = SkTEndian_SwapBE16(0);
    static const SK_OT_USHORT version1 = SkTEndian_SwapBE16(1);

    SK_OT_USHORT numRanges;

    struct GaspRange {
        SK_OT_USHORT maxPPEM;
        union behavior {
            struct Field {
                //8-15
                SK_OT_BYTE_BITFIELD(
                    Reserved08,
                    Reserved09,
                    Reserved10,
                    Reserved11,
                    Reserved12,
                    Reserved13,
                    Reserved14,
                    Reserved15)
                //0-7
                SK_OT_BYTE_BITFIELD(
                    Gridfit,
                    DoGray,
                    SymmetricGridfit,  // Version 1
                    SymmetricSmoothing,  // Version 1
                    Reserved04,
                    Reserved05,
                    Reserved06,
                    Reserved07)
            } field;
            struct Raw {
                static const SK_OT_USHORT GridfitMask = SkTEndian_SwapBE16(1 << 0);
                static const SK_OT_USHORT DoGrayMask = SkTEndian_SwapBE16(1 << 1);
                static const SK_OT_USHORT SymmetricGridfitMask = SkTEndian_SwapBE16(1 << 2);
                static const SK_OT_USHORT SymmetricSmoothingMask = SkTEndian_SwapBE16(1 << 3);
                SK_OT_USHORT value;
            } raw;
        } flags;
    }; //gaspRange[numRanges]
};

#pragma pack(pop)


#include <stddef.h>
static_assert(offsetof(SkOTTableGridAndScanProcedure, numRanges) == 2, "SkOTTableGridAndScanProcedure_numRanges_not_at_2");
static_assert(sizeof(SkOTTableGridAndScanProcedure) == 4, "sizeof_SkOTTableGridAndScanProcedure_not_4");

#endif
