1/*
2 * Copyright © 2018 Ebrahim Byagowi
3 *
4 * This is part of HarfBuzz, a text shaping library.
5 *
6 * Permission is hereby granted, without written agreement and without
7 * license or royalty fees, to use, copy, modify, and distribute this
8 * software and its documentation for any purpose, provided that the
9 * above copyright notice and the following two paragraphs appear in
10 * all copies of this software.
11 *
12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16 * DAMAGE.
17 *
18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23 */
24
25#ifndef HB_AAT_FDSC_TABLE_HH
26#define HB_AAT_FDSC_TABLE_HH
27
28#include "hb-aat-layout-common.hh"
29#include "hb-open-type.hh"
30
31/*
32 * fdsc -- Font descriptors
33 * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6fdsc.html
34 */
35#define HB_AAT_TAG_fdsc HB_TAG('f','d','s','c')
36
37
38namespace AAT {
39
40
41struct FontDescriptor
42{
43 bool has_data () const { return tag; }
44
45 int cmp (hb_tag_t a) const { return tag.cmp (a); }
46
47 float get_value () const { return u.value.to_float (); }
48
49 enum non_alphabetic_value_t {
50 Alphabetic = 0,
51 Dingbats = 1,
52 PiCharacters = 2,
53 Fleurons = 3,
54 DecorativeBorders = 4,
55 InternationalSymbols= 5,
56 MathSymbols = 6
57 };
58
59 bool sanitize (hb_sanitize_context_t *c) const
60 {
61 TRACE_SANITIZE (this);
62 return_trace (c->check_struct (this));
63 }
64
65 protected:
66 Tag tag; /* The 4-byte table tag name. */
67 union {
68 HBFixed value; /* The value for the descriptor tag. */
69 HBUINT32 nalfType; /* If the tag is `nalf`, see non_alphabetic_value_t */
70 } u;
71 public:
72 DEFINE_SIZE_STATIC (8);
73};
74
75struct fdsc
76{
77 static constexpr hb_tag_t tableTag = HB_AAT_TAG_fdsc;
78
79 enum {
80 Weight = HB_TAG ('w','g','h','t'),
81 /* Percent weight relative to regular weight.
82 * (defaul value: 1.0) */
83 Width = HB_TAG ('w','d','t','h'),
84 /* Percent width relative to regular width.
85 * (default value: 1.0) */
86 Slant = HB_TAG ('s','l','n','t'),
87 /* Angle of slant in degrees, where positive
88 * is clockwise from straight up.
89 * (default value: 0.0) */
90 OpticalSize = HB_TAG ('o','p','s','z'),
91 /* Point size the font was designed for.
92 * (default value: 12.0) */
93 NonAlphabetic= HB_TAG ('n','a','l','f')
94 /* These values are treated as integers,
95 * not fixed32s. 0 means alphabetic, and greater
96 * integers mean the font is non-alphabetic (e.g. symbols).
97 * (default value: 0) */
98 };
99
100 const FontDescriptor &get_descriptor (hb_tag_t style) const
101 { return descriptors.lsearch (style); }
102
103 bool sanitize (hb_sanitize_context_t *c) const
104 {
105 TRACE_SANITIZE (this);
106 return_trace (c->check_struct (this) &&
107 descriptors.sanitize (c));
108 }
109
110 protected:
111 HBFixed version; /* Version number of the font descriptors
112 * table (0x00010000 for the current version). */
113 LArrayOf<FontDescriptor>
114 descriptors; /* List of tagged-coordinate pairs style descriptors
115 * that will be included to characterize this font.
116 * Each descriptor consists of a <tag, value> pair.
117 * These pairs are located in the gxFontDescriptor
118 * array that follows. */
119 public:
120 DEFINE_SIZE_ARRAY (8, descriptors);
121};
122
123} /* namespace AAT */
124
125
126#endif /* HB_AAT_FDSC_TABLE_HH */
127