1/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkOTTable_gasp_DEFINED
9#define SkOTTable_gasp_DEFINED
10
11#include "SkEndian.h"
12#include "SkOTTableTypes.h"
13#include "SkTypedEnum.h"
14
15#pragma pack(push, 1)
16
17struct SkOTTableGridAndScanProcedure {
18    static const SK_OT_CHAR TAG0 = 'g';
19    static const SK_OT_CHAR TAG1 = 'a';
20    static const SK_OT_CHAR TAG2 = 's';
21    static const SK_OT_CHAR TAG3 = 'p';
22    static const SK_OT_ULONG TAG = SkOTTableTAG<SkOTTableGridAndScanProcedure>::value;
23
24    SK_OT_USHORT version;
25    static const SK_OT_USHORT version0 = SkTEndian_SwapBE16(0);
26    static const SK_OT_USHORT version1 = SkTEndian_SwapBE16(1);
27
28    SK_OT_USHORT numRanges;
29
30    struct GaspRange {
31        SK_OT_USHORT maxPPEM;
32        union behavior {
33            struct Field {
34                //8-15
35                SK_OT_BYTE_BITFIELD(
36                    Reserved08,
37                    Reserved09,
38                    Reserved10,
39                    Reserved11,
40                    Reserved12,
41                    Reserved13,
42                    Reserved14,
43                    Reserved15)
44                //0-7
45                SK_OT_BYTE_BITFIELD(
46                    Gridfit,
47                    DoGray,
48                    SymmetricGridfit,  // Version 1
49                    SymmetricSmoothing,  // Version 1
50                    Reserved04,
51                    Reserved05,
52                    Reserved06,
53                    Reserved07)
54            } field;
55            struct Raw {
56                static const SK_OT_USHORT GridfitMask = SkTEndian_SwapBE16(1 << 0);
57                static const SK_OT_USHORT DoGrayMask = SkTEndian_SwapBE16(1 << 1);
58                static const SK_OT_USHORT SymmetricGridfitMask = SkTEndian_SwapBE16(1 << 2);
59                static const SK_OT_USHORT SymmetricSmoothingMask = SkTEndian_SwapBE16(1 << 3);
60                SK_OT_USHORT value;
61            } raw;
62        } flags;
63    }; //gaspRange[numRanges]
64};
65
66#pragma pack(pop)
67
68
69#include <stddef.h>
70SK_COMPILE_ASSERT(offsetof(SkOTTableGridAndScanProcedure, numRanges) == 2, SkOTTableGridAndScanProcedure_numRanges_not_at_2);
71SK_COMPILE_ASSERT(sizeof(SkOTTableGridAndScanProcedure) == 4, sizeof_SkOTTableGridAndScanProcedure_not_4);
72
73#endif
74