1 /*
2  * Copyright 2012 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 SkPanose_DEFINED
9 #define SkPanose_DEFINED
10 
11 #include "SkOTTableTypes.h"
12 
13 #pragma pack(push, 1)
14 
15 struct SkPanose {
16     //This value changes the meaning of the following 9 bytes.
17     enum class FamilyType : SK_OT_BYTE {
18         Any = 0,
19         NoFit = 1,
20         TextAndDisplay = 2,
21         Script = 3,
22         Decorative = 4,
23         Pictoral = 5,
24     } bFamilyType;
25 
26     union Data {
27         struct TextAndDisplay {
28             enum class SerifStyle : SK_OT_BYTE {
29                 Any = 0,
30                 NoFit = 1,
31                 Cove = 2,
32                 ObtuseCove = 3,
33                 SquareCove = 4,
34                 ObtuseSquareCove = 5,
35                 Square = 6,
36                 Thin = 7,
37                 Bone = 8,
38                 Exaggerated = 9,
39                 Triangle = 10,
40                 NormalSans = 11,
41                 ObtuseSans = 12,
42                 PerpSans = 13,
43                 Flared = 14,
44                 Rounded = 15,
45             } bSerifStyle;
46 
47             enum class Weight : SK_OT_BYTE {
48                 Any = 0,
49                 NoFit = 1,
50                 VeryLight = 2,
51                 Light = 3,
52                 Thin = 4,
53                 Book = 5,
54                 Medium = 6,
55                 Demi = 7,
56                 Bold = 8,
57                 Heavy = 9,
58                 Black = 10,
59                 ExtraBlack = 11,
60             } bWeight;
61 
62             enum class Proportion : SK_OT_BYTE {
63                 Any = 0,
64                 NoFit = 1,
65                 OldStyle = 2,
66                 Modern = 3,
67                 EvenWidth = 4,
68                 Expanded = 5,
69                 Condensed = 6,
70                 VeryExpanded = 7,
71                 VeryCondensed = 8,
72                 Monospaced = 9,
73             } bProportion;
74 
75             enum class Contrast : SK_OT_BYTE {
76                 Any = 0,
77                 NoFit = 1,
78                 None = 2,
79                 VeryLow = 3,
80                 Low = 4,
81                 MediumLow = 5,
82                 Medium = 6,
83                 MediumHigh = 7,
84                 High = 8,
85                 VeryHigh = 9,
86             } bContrast;
87 
88 #ifdef SK_WIN_PANOSE
89             //This is what Windows (and FontForge and Apple TT spec) define.
90             //The Impact font uses 9.
91             enum class StrokeVariation : SK_OT_BYTE {
92                 Any = 0,
93                 NoFit = 1,
94                 GradualDiagonal = 2,
95                 GradualTransitional = 3,
96                 GradualVertical = 4,
97                 GradualHorizontal = 5,
98                 RapidVertical = 6,
99                 RapidHorizontal = 7,
100                 InstantVertical = 8,
101             } bStrokeVariation;
102 #else
103             //Stroke variation description in OT OS/2 ver0,ver1 is incorrect.
104             //This is what HP Panose says.
105             enum class StrokeVariation : SK_OT_BYTE {
106                 Any = 0,
107                 NoFit = 1,
108                 NoVariation = 2,
109                 Gradual_Diagonal = 3,
110                 Gradual_Transitional = 4,
111                 Gradual_Vertical = 5,
112                 Gradual_Horizontal = 6,
113                 Rapid_Vertical = 7,
114                 Rapid_Horizontal = 8,
115                 Instant_Vertical = 9,
116                 Instant_Horizontal = 10,
117             } bStrokeVariation;
118 #endif
119 
120             enum class ArmStyle : SK_OT_BYTE {
121                 Any = 0,
122                 NoFit = 1,
123                 StraightArms_Horizontal = 2,
124                 StraightArms_Wedge = 3,
125                 StraightArms_Vertical = 4,
126                 StraightArms_SingleSerif = 5,
127                 StraightArms_DoubleSerif = 6,
128                 NonStraightArms_Horizontal = 7,
129                 NonStraightArms_Wedge = 8,
130                 NonStraightArms_Vertical = 9,
131                 NonStraightArms_SingleSerif = 10,
132                 NonStraightArms_DoubleSerif = 11,
133             } bArmStyle;
134 
135             enum class Letterform : SK_OT_BYTE {
136                 Any = 0,
137                 NoFit = 1,
138                 Normal_Contact = 2,
139                 Normal_Weighted = 3,
140                 Normal_Boxed = 4,
141                 Normal_Flattened = 5,
142                 Normal_Rounded = 6,
143                 Normal_OffCenter = 7,
144                 Normal_Square = 8,
145                 Oblique_Contact = 9,
146                 Oblique_Weighted = 10,
147                 Oblique_Boxed = 11,
148                 Oblique_Flattened = 12,
149                 Oblique_Rounded = 13,
150                 Oblique_OffCenter = 14,
151                 Oblique_Square = 15,
152             } bLetterform;
153 
154             enum class Midline : SK_OT_BYTE {
155                 Any = 0,
156                 NoFit = 1,
157                 Standard_Trimmed = 2,
158                 Standard_Pointed = 3,
159                 Standard_Serifed = 4,
160                 High_Trimmed = 5,
161                 High_Pointed = 6,
162                 High_Serifed = 7,
163                 Constant_Trimmed = 8,
164                 Constant_Pointed = 9,
165                 Constant_Serifed = 10,
166                 Low_Trimmed = 11,
167                 Low_Pointed = 12,
168                 Low_Serifed = 13,
169             } bMidline;
170 
171             enum class XHeight : SK_OT_BYTE {
172                 Any = 0,
173                 NoFit = 1,
174                 Constant_Small = 2,
175                 Constant_Standard = 3,
176                 Constant_Large = 4,
177                 Ducking_Small = 5,
178                 Ducking_Standard = 6,
179                 Ducking_Large = 7,
180             } bXHeight;
181         } textAndDisplay;
182 
183         struct Script {
184             enum class ToolKind : SK_OT_BYTE {
185                 Any = 0,
186                 NoFit = 1,
187                 FlatNib = 2,
188                 PressurePoint = 3,
189                 Engraved = 4,
190                 Ball = 5,
191                 Brush = 6,
192                 Rough = 7,
193                 FeltPen = 8,
194                 WildBrush = 9,
195             } bToolKind;
196 
197             enum class Weight : SK_OT_BYTE {
198                 Any = 0,
199                 NoFit = 1,
200                 VeryLight = 2,
201                 Light = 3,
202                 Thin = 4,
203                 Book = 5,
204                 Medium = 6,
205                 Demi = 7,
206                 Bold = 8,
207                 Heavy = 9,
208                 Black = 10,
209                 ExtraBlack = 11,
210             } bWeight;
211 
212             enum class Spacing : SK_OT_BYTE {
213                 Any = 0,
214                 NoFit = 1,
215                 ProportionalSpaced = 2,
216                 Monospaced = 3,
217             } bSpacing;
218 
219             enum class AspectRatio : SK_OT_BYTE {
220                 Any = 0,
221                 NoFit = 1,
222                 VeryCondensed = 2,
223                 Condensed = 3,
224                 Normal = 4,
225                 Expanded = 5,
226                 VeryExpanded = 6,
227             } bAspectRatio;
228 
229             enum class Contrast : SK_OT_BYTE {
230                 Any = 0,
231                 NoFit = 1,
232                 None = 2,
233                 VeryLow = 3,
234                 Low = 4,
235                 MediumLow = 5,
236                 Medium = 6,
237                 MediumHigh = 7,
238                 High = 8,
239                 VeryHigh = 9,
240             } bContrast;
241 
242             enum class Topology : SK_OT_BYTE {
243                 Any = 0,
244                 NoFit = 1,
245                 Roman_Disconnected = 2,
246                 Roman_Trailing = 3,
247                 Roman_Connected = 4,
248                 Cursive_Disconnected = 5,
249                 Cursive_Trailing = 6,
250                 Cursive_Connected = 7,
251                 Blackletter_Disconnected = 8,
252                 Blackletter_Trailing = 9,
253                 Blackletter_Connected = 10,
254             } bTopology;
255 
256             enum class Form : SK_OT_BYTE {
257                 Any = 0,
258                 NoFit = 1,
259                 Upright_NoWrapping = 2,
260                 Upright_SomeWrapping = 3,
261                 Upright_MoreWrapping = 4,
262                 Upright_ExtremeWrapping = 5,
263                 Oblique_NoWrapping = 6,
264                 Oblique_SomeWrapping = 7,
265                 Oblique_MoreWrapping = 8,
266                 Oblique_ExtremeWrapping = 9,
267                 Exaggerated_NoWrapping = 10,
268                 Exaggerated_SomeWrapping = 11,
269                 Exaggerated_MoreWrapping = 12,
270                 Exaggerated_ExtremeWrapping = 13,
271             } bForm;
272 
273             enum class Finials : SK_OT_BYTE {
274                 Any = 0,
275                 NoFit = 1,
276                 None_NoLoops = 2,
277                 None_ClosedLoops = 3,
278                 None_OpenLoops = 4,
279                 Sharp_NoLoops = 5,
280                 Sharp_ClosedLoops = 6,
281                 Sharp_OpenLoops = 7,
282                 Tapered_NoLoops = 8,
283                 Tapered_ClosedLoops = 9,
284                 Tapered_OpenLoops = 10,
285                 Round_NoLoops = 11,
286                 Round_ClosedLoops = 12,
287                 Round_OpenLoops = 13,
288             } bFinials;
289 
290             enum class XAscent : SK_OT_BYTE {
291                 Any = 0,
292                 NoFit = 1,
293                 VeryLow = 2,
294                 Low = 3,
295                 Medium = 4,
296                 High = 5,
297                 VeryHigh = 6,
298             } bXAscent;
299         } script;
300 
301         struct Decorative {
302             enum class Class : SK_OT_BYTE {
303                 Any = 0,
304                 NoFit = 1,
305                 Derivative = 2,
306                 NonStandard_Topology = 3,
307                 NonStandard_Elements = 4,
308                 NonStandard_Aspect = 5,
309                 Initials = 6,
310                 Cartoon = 7,
311                 PictureStems = 8,
312                 Ornamented = 9,
313                 TextAndBackground = 10,
314                 Collage = 11,
315                 Montage = 12,
316             } bClass;
317 
318             enum class Weight : SK_OT_BYTE {
319                 Any = 0,
320                 NoFit = 1,
321                 VeryLight = 2,
322                 Light = 3,
323                 Thin = 4,
324                 Book = 5,
325                 Medium = 6,
326                 Demi = 7,
327                 Bold = 8,
328                 Heavy = 9,
329                 Black = 10,
330                 ExtraBlack = 11,
331             } bWeight;
332 
333             enum class Aspect : SK_OT_BYTE {
334                 Any = 0,
335                 NoFit = 1,
336                 SuperCondensed = 2,
337                 VeryCondensed = 3,
338                 Condensed = 4,
339                 Normal = 5,
340                 Extended = 6,
341                 VeryExtended = 7,
342                 SuperExtended = 8,
343                 Monospaced = 9,
344             } bAspect;
345 
346             enum class Contrast : SK_OT_BYTE {
347                 Any = 0,
348                 NoFit = 1,
349                 None = 2,
350                 VeryLow = 3,
351                 Low = 4,
352                 MediumLow = 5,
353                 Medium = 6,
354                 MediumHigh = 7,
355                 High = 8,
356                 VeryHigh = 9,
357                 HorizontalLow = 10,
358                 HorizontalMedium = 11,
359                 HorizontalHigh = 12,
360                 Broken = 13,
361             } bContrast;
362 
363             enum class SerifVariant : SK_OT_BYTE {
364                 Any = 0,
365                 NoFit = 1,
366                 Cove = 2,
367                 ObtuseCove = 3,
368                 SquareCove = 4,
369                 ObtuseSquareCove = 5,
370                 Square = 6,
371                 Thin = 7,
372                 Oval = 8,
373                 Exaggerated = 9,
374                 Triangle = 10,
375                 NormalSans = 11,
376                 ObtuseSans = 12,
377                 PerpendicularSans = 13,
378                 Flared = 14,
379                 Rounded = 15,
380                 Script = 16,
381             } bSerifVariant;
382 
383             enum class Treatment : SK_OT_BYTE {
384                 Any = 0,
385                 NoFit = 1,
386                 None_StandardSolidFill = 2,
387                 White_NoFill = 3,
388                 PatternedFill = 4,
389                 ComplexFill = 5,
390                 ShapedFill = 6,
391                 DrawnDistressed = 7,
392             } bTreatment;
393 
394             enum class Lining : SK_OT_BYTE {
395                 Any = 0,
396                 NoFit = 1,
397                 None = 2,
398                 Inline = 3,
399                 Outline = 4,
400                 Engraved = 5,
401                 Shadow = 6,
402                 Relief = 7,
403                 Backdrop = 8,
404             } bLining;
405 
406             enum class Topology : SK_OT_BYTE {
407                 Any = 0,
408                 NoFit = 1,
409                 Standard = 2,
410                 Square = 3,
411                 MultipleSegment = 4,
412                 DecoWacoMidlines = 5,
413                 UnevenWeighting = 6,
414                 DiverseArms = 7,
415                 DiverseForms = 8,
416                 LombardicForms = 9,
417                 UpperCaseInLowerCase = 10,
418                 ImpliedTopology = 11,
419                 HorseshoeEandA = 12,
420                 Cursive = 13,
421                 Blackletter = 14,
422                 SwashVariance = 15,
423             } bTopology;
424 
425             enum class RangeOfCharacters : SK_OT_BYTE {
426                 Any = 0,
427                 NoFit = 1,
428                 ExtendedCollection = 2,
429                 Litterals = 3,
430                 NoLowerCase = 4,
431                 SmallCaps = 5,
432             } bRangeOfCharacters;
433         } decorative;
434 
435         struct Pictoral {
436             enum class Kind : SK_OT_BYTE {
437                 Any = 0,
438                 NoFit = 1,
439                 Montages = 2,
440                 Pictures = 3,
441                 Shapes = 4,
442                 Scientific = 5,
443                 Music = 6,
444                 Expert = 7,
445                 Patterns = 8,
446                 Boarders = 9,
447                 Icons = 10,
448                 Logos = 11,
449                 IndustrySpecific = 12,
450             } bKind;
451 
452             enum class Weight : SK_OT_BYTE {
453                 NoFit = 1,
454             } bWeight;
455 
456             enum class Spacing : SK_OT_BYTE {
457                 Any = 0,
458                 NoFit = 1,
459                 ProportionalSpaced = 2,
460                 Monospaced = 3,
461             } bSpacing;
462 
463             enum class AspectRatioAndContrast : SK_OT_BYTE {
464                 NoFit = 1,
465             } bAspectRatioAndContrast;
466 
467             enum class AspectRatio94 : SK_OT_BYTE {
468                 Any = 0,
469                 NoFit = 1,
470                 NoWidth = 2,
471                 ExceptionallyWide = 3,
472                 SuperWide = 4,
473                 VeryWide = 5,
474                 Wide = 6,
475                 Normal = 7,
476                 Narrow = 8,
477                 VeryNarrow = 9,
478             } bAspectRatio94;
479 
480             enum class AspectRatio119 : SK_OT_BYTE {
481                 Any = 0,
482                 NoFit = 1,
483                 NoWidth = 2,
484                 ExceptionallyWide = 3,
485                 SuperWide = 4,
486                 VeryWide = 5,
487                 Wide = 6,
488                 Normal = 7,
489                 Narrow = 8,
490                 VeryNarrow = 9,
491             } bAspectRatio119;
492 
493              enum class AspectRatio157 : SK_OT_BYTE {
494                 Any = 0,
495                 NoFit = 1,
496                 NoWidth = 2,
497                 ExceptionallyWide = 3,
498                 SuperWide = 4,
499                 VeryWide = 5,
500                 Wide = 6,
501                 Normal = 7,
502                 Narrow = 8,
503                 VeryNarrow = 9,
504             } bAspectRatio157;
505 
506             enum class AspectRatio163 : SK_OT_BYTE {
507                 Any = 0,
508                 NoFit = 1,
509                 NoWidth = 2,
510                 ExceptionallyWide = 3,
511                 SuperWide = 4,
512                 VeryWide = 5,
513                 Wide = 6,
514                 Normal = 7,
515                 Narrow = 8,
516                 VeryNarrow = 9,
517             } bAspectRatio163;
518         } pictoral;
519     } data;
520 };
521 
522 #pragma pack(pop)
523 
524 
525 static_assert(sizeof(SkPanose) == 10, "sizeof_SkPanose_not_10");
526 
527 #endif
528