1 /*
2  * Copyright 2011 Google Inc. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_OS2_TABLE_H_
18 #define SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_OS2_TABLE_H_
19 
20 #include "sfntly/port/refcount.h"
21 #include "sfntly/table/table.h"
22 #include "sfntly/table/table_based_table_builder.h"
23 
24 namespace sfntly {
25 
26 struct WeightClass {
27   enum {
28     kThin = 100,
29     kExtraLight = 200,
30     kUltraLight = 200,
31     kLight = 300,
32     kNormal = 400,
33     kRegular = 400,
34     kMedium = 500,
35     kSemiBold = 600,
36     kDemiBold = 600,
37     kBold = 700,
38     kExtraBold = 800,
39     kUltraBold = 800,
40     kBlack = 900,
41     kHeavy = 900
42   };
43 };
44 
45 struct WidthClass {
46   enum {
47     kUltraCondensed = 1,
48     kExtraCondensed = 2,
49     kCondensed = 3,
50     kSemiCondensed = 4,
51     kMedium = 5,
52     kNormal = 5,
53     kSemiExpanded = 6,
54     kExpanded = 7,
55     kExtraExpanded = 8,
56     kUltraExpanded = 9
57   };
58 };
59 
60 // Flags to indicate the embedding licensing rights for a font.
61 struct EmbeddingFlags {
62   enum {
63     kReserved0 = 1 << 0,
64     kRestrictedLicenseEmbedding = 1 << 1,
65     kPreviewAndPrintEmbedding = 1 << 2,
66     kEditableEmbedding = 1 << 3,
67     kReserved4 = 1 << 4,
68     kReserved5 = 1 << 5,
69     kReserved6 = 1 << 6,
70     kReserved7 = 1 << 7,
71     kNoSubsetting = 1 << 8,
72     kBitmapEmbeddingOnly = 1 << 9,
73     kReserved10 = 1 << 10,
74     kReserved11 = 1 << 11,
75     kReserved12 = 1 << 12,
76     kReserved13 = 1 << 13,
77     kReserved14 = 1 << 14,
78     kReserved15 = 1 << 15
79   };
80 };
81 
82 struct UnicodeRange {
83   enum {
84     // Do NOT reorder. This enum relies on the ordering of the data matching the
85     // ordinal numbers of the properties.
86     kBasicLatin,
87     kLatin1Supplement,
88     kLatinExtendedA,
89     kLatinExtendedB,
90     kIPAExtensions,
91     kSpacingModifierLetters,
92     kCombiningDiacriticalMarks,
93     kGreekAndCoptic,
94     kCoptic,
95     kCyrillic,
96     kArmenian,
97     kHebrew,
98     kVai,
99     kArabic,
100     kNKo,
101     kDevanagari,
102     kBengali,
103     kGurmukhi,
104     kGujarati,
105     kOriya,
106     kTamil,
107     kTelugu,
108     kKannada,
109     kMalayalam,
110     kThai,
111     kLao,
112     kGeorgian,
113     kBalinese,
114     kHangulJamo,
115     kLatinExtendedAdditional,
116     kGreekExtended,
117     kGeneralPunctuation,
118     kSuperscriptsAndSubscripts,
119     kCurrencySymbols,
120     kNumberForms,
121     kArrows,
122     kMathematicalOperators,
123     kMiscTechnical,
124     kControlPictures,
125     kOCR,
126     kEnclosedAlphanumerics,
127     kBoxDrawing,
128     kBlockElements,
129     kGeometricShapes,
130     kMiscSymbols,
131     kDingbats,
132     kCJKSymbolsAndPunctuation,
133     kHiragana,
134     kKatakana,
135     kBopomofo,
136     kHangulCompatibilityJamo,
137     kPhagspa,
138     kEnclosedCJKLettersAndMonths,
139     kCJKCompatibility,
140     kHangulSyllables,
141     kNonPlane0,
142     kPhoenician,
143     kCJKUnifiedIdeographs,
144     kPrivateUseAreaPlane0,
145     kCJKStrokes,
146     kAlphabeticPresentationForms,
147     kArabicPresentationFormsA,
148     kCombiningHalfMarks,
149     kVerticalForms,
150     kSmallFormVariants,
151     kArabicPresentationFormsB,
152     kHalfwidthAndFullwidthForms,
153     kSpecials,
154     kTibetan,
155     kSyriac,
156     kThaana,
157     kSinhala,
158     kMyanmar,
159     kEthiopic,
160     kCherokee,
161     kUnifiedCanadianAboriginalSyllabics,
162     kOgham,
163     kRunic,
164     kKhmer,
165     kMongolian,
166     kBraillePatterns,
167     kYiSyllables,
168     kTagalog,
169     kOldItalic,
170     kGothic,
171     kDeseret,
172     kMusicalSymbols,
173     kMathematicalAlphanumericSymbols,
174     kPrivateUsePlane15And16,
175     kVariationSelectors,
176     kTags,
177     kLimbu,
178     kTaiLe,
179     kNewTaiLue,
180     kBuginese,
181     kGlagolitic,
182     kTifnagh,
183     kYijingHexagramSymbols,
184     kSylotiNagari,
185     kLinearB,
186     kAncientGreekNumbers,
187     kUgaritic,
188     kOldPersian,
189     kShavian,
190     kOsmanya,
191     kCypriotSyllabary,
192     kKharoshthi,
193     kTaiXuanJingSymbols,
194     kCuneiform,
195     kCountingRodNumerals,
196     kSudanese,
197     kLepcha,
198     kOlChiki,
199     kSaurashtra,
200     kKayahLi,
201     kRejang,
202     kCharm,
203     kAncientSymbols,
204     kPhaistosDisc,
205     kCarian,
206     kDominoTiles,
207     kReserved123,
208     kReserved124,
209     kReserved125,
210     kReserved126,
211     kReserved127,
212     kLast = kReserved127
213   };
214 
215   int32_t range(int32_t bit);
216   // UNIMPLEMENTED: EnumSet<UnicodeRange> asSet(long range1, long range2,
217   //                                            long range3, long range4)
218   //                long[] asArray(EnumSet<UnicodeRange> rangeSet)
219 };
220 
221 struct FsSelection {
222   enum {
223     kITALIC = 1 << 0,
224     kUNDERSCORE = 1 << 1,
225     kNEGATIVE = 1 << 2,
226     kOUTLINED = 1 << 3,
227     kSTRIKEOUT = 1 << 4,
228     kBOLD = 1 << 5,
229     kREGULAR = 1 << 6,
230     kUSE_TYPO_METRICS = 1 << 7,
231     kWWS = 1 << 8,
232     kOBLIQUE = 1 << 9
233   };
234   // UNIMPLEMENTED: EnumSet<FsSelection> asSet(long range1, long range2,
235   //                                           long range3, long range4)
236   //                long[] asArray(EnumSet<FsSelection> rangeSet)
237 };
238 
239 // C++ port only: C++ does not support 64-bit enums until C++0x.  For better
240 // portability, we need to use static const int64_t instead.
241 struct CodePageRange {
242   static const int64_t kLatin1_1252;
243   static const int64_t kLatin2_1250;
244   static const int64_t kCyrillic_1251;
245   static const int64_t kGreek_1253;
246   static const int64_t kTurkish_1254;
247   static const int64_t kHebrew_1255;
248   static const int64_t kArabic_1256;
249   static const int64_t kWindowsBaltic_1257;
250   static const int64_t kVietnamese_1258;
251   static const int64_t kAlternateANSI9;
252   static const int64_t kAlternateANSI10;
253   static const int64_t kAlternateANSI11;
254   static const int64_t kAlternateANSI12;
255   static const int64_t kAlternateANSI13;
256   static const int64_t kAlternateANSI14;
257   static const int64_t kAlternateANSI15;
258   static const int64_t kThai_874;
259   static const int64_t kJapanJIS_932;
260   static const int64_t kChineseSimplified_936;
261   static const int64_t kKoreanWansung_949;
262   static const int64_t kChineseTraditional_950;
263   static const int64_t kKoreanJohab_1361;
264   static const int64_t kAlternateANSI22;
265   static const int64_t kAlternateANSI23;
266   static const int64_t kAlternateANSI24;
267   static const int64_t kAlternateANSI25;
268   static const int64_t kAlternateANSI26;
269   static const int64_t kAlternateANSI27;
270   static const int64_t kAlternateANSI28;
271   static const int64_t kMacintoshCharacterSet;
272   static const int64_t kOEMCharacterSet;
273   static const int64_t kSymbolCharacterSet;
274   static const int64_t kReservedForOEM32;
275   static const int64_t kReservedForOEM33;
276   static const int64_t kReservedForOEM34;
277   static const int64_t kReservedForOEM35;
278   static const int64_t kReservedForOEM36;
279   static const int64_t kReservedForOEM37;
280   static const int64_t kReservedForOEM38;
281   static const int64_t kReservedForOEM39;
282   static const int64_t kReservedForOEM40;
283   static const int64_t kReservedForOEM41;
284   static const int64_t kReservedForOEM42;
285   static const int64_t kReservedForOEM43;
286   static const int64_t kReservedForOEM44;
287   static const int64_t kReservedForOEM45;
288   static const int64_t kReservedForOEM46;
289   static const int64_t kReservedForOEM47;
290   static const int64_t kIBMGreek_869;
291   static const int64_t kMSDOSRussion_866;
292   static const int64_t kMSDOSNordic_865;
293   static const int64_t kArabic_864;
294   static const int64_t kMSDOSCanadianFrench_863;
295   static const int64_t kHebrew_862;
296   static const int64_t kMSDOSIcelandic_861;
297   static const int64_t kMSDOSPortugese_860;
298   static const int64_t kIBMTurkish_857;
299   static const int64_t kIBMCyrillic_855;
300   static const int64_t kLatin2_852;
301   static const int64_t kMSDOSBaltic_775;
302   static const int64_t kGreek_737;
303   static const int64_t kArabic_708;
304   static const int64_t kLatin1_850;
305   static const int64_t kUS_437;
306 
307   // UNIMPLEMENTED: EnumSet<CodePageRange> asSet(long range1, long range2,
308   //                                             long range3, long range4)
309   //                long[] asArray(EnumSet<CodePageRange> rangeSet)
310 };
311 
312 // An OS/2 table - 'OS/2'.
313 class OS2Table : public Table, public RefCounted<OS2Table> {
314  public:
315   // A builder for the OS/2 table = 'OS/2'.
316   class Builder : public TableBasedTableBuilder, public RefCounted<Builder> {
317    public:
318     Builder(Header* header, WritableFontData* data);
319     Builder(Header* header, ReadableFontData* data);
320     virtual ~Builder();
321     virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data);
322 
323     static CALLER_ATTACH Builder* CreateBuilder(Header* header,
324                                                 WritableFontData* data);
325 
326     int32_t TableVersion();
327     void SetTableVersion(int32_t version);
328     int32_t XAvgCharWidth();
329     void SetXAvgCharWidth(int32_t width);
330     int32_t UsWeightClass();
331     void SetUsWeightClass(int32_t weight);
332     int32_t UsWidthClass();
333     void SetUsWidthClass(int32_t width);
334     // UNIMPLEMENTED: EnumSet<EmbeddingFlags> fsType()
335     //                void setFsType(EnumSeT<EmbeddingFlags> flagSet)
336     int32_t FsType();
337     void SetFsType(int32_t fs_type);
338     int32_t YSubscriptXSize();
339     void SetYSubscriptXSize(int32_t size);
340     int32_t YSubscriptYSize();
341     void SetYSubscriptYSize(int32_t size);
342     int32_t YSubscriptXOffset();
343     void SetYSubscriptXOffset(int32_t offset);
344     int32_t YSubscriptYOffset();
345     void SetYSubscriptYOffset(int32_t offset);
346     int32_t YSuperscriptXSize();
347     void SetYSuperscriptXSize(int32_t size);
348     int32_t YSuperscriptYSize();
349     void SetYSuperscriptYSize(int32_t size);
350     int32_t YSuperscriptXOffset();
351     void SetYSuperscriptXOffset(int32_t offset);
352     int32_t YSuperscriptYOffset();
353     void SetYSuperscriptYOffset(int32_t offset);
354     int32_t YStrikeoutSize();
355     void SetYStrikeoutSize(int32_t size);
356     int32_t YStrikeoutPosition();
357     void SetYStrikeoutPosition(int32_t position);
358     int32_t SFamilyClass();
359     void SetSFamilyClass(int32_t family);
360     void Panose(std::vector<uint8_t>* value);
361     void SetPanose(std::vector<uint8_t>* panose);
362     int64_t UlUnicodeRange1();
363     void SetUlUnicodeRange1(int64_t range);
364     int64_t UlUnicodeRange2();
365     void SetUlUnicodeRange2(int64_t range);
366     int64_t UlUnicodeRange3();
367     void SetUlUnicodeRange3(int64_t range);
368     int64_t UlUnicodeRange4();
369     void SetUlUnicodeRange4(int64_t range);
370     // UNIMPLEMENTED: EnumSet<UnicodeRange> UlUnicodeRange()
371     //                setUlUnicodeRange(EnumSet<UnicodeRange> rangeSet)
372     void AchVendId(std::vector<uint8_t>* b);
373     // This field is 4 bytes in length and only the first 4 bytes of the byte
374     // array will be written. If the byte array is less than 4 bytes it will be
375     // padded out with space characters (0x20).
376     // @param b ach Vendor Id
377     void SetAchVendId(std::vector<uint8_t>* b);
378     // UNIMPLEMENTED: public EnumSet<FsSelection> fsSelection()
379     int32_t FsSelection();
380     void SetFsSelection(int32_t fs_selection);
381     int32_t UsFirstCharIndex();
382     void SetUsFirstCharIndex(int32_t first_index);
383     int32_t UsLastCharIndex();
384     void SetUsLastCharIndex(int32_t last_index);
385     int32_t STypoAscender();
386     void SetSTypoAscender(int32_t ascender);
387     int32_t STypoDescender();
388     void SetSTypoDescender(int32_t descender);
389     int32_t STypoLineGap();
390     void SetSTypoLineGap(int32_t line_gap);
391     int32_t UsWinAscent();
392     void SetUsWinAscent(int32_t ascent);
393     int32_t UsWinDescent();
394     void SetUsWinDescent(int32_t descent);
395     int64_t UlCodePageRange1();
396     void SetUlCodePageRange1(int64_t range);
397     int64_t UlCodePageRange2();
398     void SetUlCodePageRange2(int64_t range);
399     // UNIMPLEMENTED: EnumSet<CodePageRange> ulCodePageRange()
400     //                void setUlCodePageRange(EnumSet<CodePageRange> rangeSet)
401     int32_t SxHeight();
402     void SetSxHeight(int32_t height);
403     int32_t SCapHeight();
404     void SetSCapHeight(int32_t height);
405     int32_t UsDefaultChar();
406     void SetUsDefaultChar(int32_t default_char);
407     int32_t UsBreakChar();
408     void SetUsBreakChar(int32_t break_char);
409     int32_t UsMaxContext();
410     void SetUsMaxContext(int32_t max_context);
411   };
412 
413   ~OS2Table();
414 
415   int32_t TableVersion();
416   int32_t XAvgCharWidth();
417   int32_t UsWeightClass();
418   int32_t UsWidthClass();
419   // UNIMPLEMENTED: public EnumSet<EmbeddingFlags> fsType()
420   int32_t FsType();
421   int32_t YSubscriptXSize();
422   int32_t YSubscriptYSize();
423   int32_t YSubscriptXOffset();
424   int32_t YSubscriptYOffset();
425   int32_t YSuperscriptXSize();
426   int32_t YSuperscriptYSize();
427   int32_t YSuperscriptXOffset();
428   int32_t YSuperscriptYOffset();
429   int32_t YStrikeoutSize();
430   int32_t YStrikeoutPosition();
431   int32_t SFamilyClass();
432   void Panose(std::vector<uint8_t>* value);
433   int64_t UlUnicodeRange1();
434   int64_t UlUnicodeRange2();
435   int64_t UlUnicodeRange3();
436   int64_t UlUnicodeRange4();
437   // UNIMPLEMENTED: public EnumSet<UnicodeRange> UlUnicodeRange()
438   void AchVendId(std::vector<uint8_t>* b);
439   // UNIMPLEMENTED: public EnumSet<FsSelection> fsSelection()
440   int32_t FsSelection();
441   int32_t UsFirstCharIndex();
442   int32_t UsLastCharIndex();
443   int32_t STypoAscender();
444   int32_t STypoDescender();
445   int32_t STypoLineGap();
446   int32_t UsWinAscent();
447   int32_t UsWinDescent();
448   int64_t UlCodePageRange1();
449   int64_t UlCodePageRange2();
450   // UNIMPLEMENTED: public EnumSet<CodePageRange> ulCodePageRange()
451   int32_t SxHeight();
452   int32_t SCapHeight();
453   int32_t UsDefaultChar();
454   int32_t UsBreakChar();
455   int32_t UsMaxContext();
456 
457  private:
458   struct Offset {
459     enum {
460       kVersion = 0,
461       kXAvgCharWidth = 2,
462       kUsWeightClass = 4,
463       kUsWidthClass = 6,
464       kFsType = 8,
465       kYSubscriptXSize = 10,
466       kYSubscriptYSize = 12,
467       kYSubscriptXOffset = 14,
468       kYSubscriptYOffset = 16,
469       kYSuperscriptXSize = 18,
470       kYSuperscriptYSize = 20,
471       kYSuperscriptXOffset = 22,
472       kYSuperscriptYOffset = 24,
473       kYStrikeoutSize = 26,
474       kYStrikeoutPosition = 28,
475       kSFamilyClass = 30,
476       kPanose = 32,
477       kPanoseLength = 10,  // Length of panose bytes.
478       kUlUnicodeRange1 = 42,
479       kUlUnicodeRange2 = 46,
480       kUlUnicodeRange3 = 50,
481       kUlUnicodeRange4 = 54,
482       kAchVendId = 58,
483       kAchVendIdLength = 4,  // Length of ach vend id bytes.
484       kFsSelection = 62,
485       kUsFirstCharIndex = 64,
486       kUsLastCharIndex = 66,
487       kSTypoAscender = 68,
488       kSTypoDescender = 70,
489       kSTypoLineGap = 72,
490       kUsWinAscent = 74,
491       kUsWinDescent = 76,
492       kUlCodePageRange1 = 78,
493       kUlCodePageRange2 = 82,
494       kSxHeight = 86,
495       kSCapHeight = 88,
496       kUsDefaultChar = 90,
497       kUsBreakChar = 92,
498       kUsMaxContext = 94
499     };
500   };
501 
502   OS2Table(Header* header, ReadableFontData* data);
503 };
504 typedef Ptr<OS2Table> OS2TablePtr;
505 
506 }  // namespace sfntly
507 
508 #endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_CORE_OS2_TABLE_H_
509