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#include "sfntly/table/core/os2_table.h"
18
19namespace sfntly {
20/******************************************************************************
21 * Constants
22 ******************************************************************************/
23const int64_t CodePageRange::kLatin1_1252 = (int64_t)1 << 0;
24const int64_t CodePageRange::kLatin2_1250 = (int64_t)1 << (int64_t)1;
25const int64_t CodePageRange::kCyrillic_1251 = (int64_t)1 << 2;
26const int64_t CodePageRange::kGreek_1253 = (int64_t)1 << 3;
27const int64_t CodePageRange::kTurkish_1254 = (int64_t)1 << 4;
28const int64_t CodePageRange::kHebrew_1255 = (int64_t)1 << 5;
29const int64_t CodePageRange::kArabic_1256 = (int64_t)1 << 6;
30const int64_t CodePageRange::kWindowsBaltic_1257 = (int64_t)1 << 7;
31const int64_t CodePageRange::kVietnamese_1258 = (int64_t)1 << 8;
32const int64_t CodePageRange::kAlternateANSI9 = (int64_t)1 << 9;
33const int64_t CodePageRange::kAlternateANSI10 = (int64_t)1 << 10;
34const int64_t CodePageRange::kAlternateANSI11 = (int64_t)1 << 11;
35const int64_t CodePageRange::kAlternateANSI12 = (int64_t)1 << 12;
36const int64_t CodePageRange::kAlternateANSI13 = (int64_t)1 << 13;
37const int64_t CodePageRange::kAlternateANSI14 = (int64_t)1 << 14;
38const int64_t CodePageRange::kAlternateANSI15 = (int64_t)1 << 15;
39const int64_t CodePageRange::kThai_874 = (int64_t)1 << 16;
40const int64_t CodePageRange::kJapanJIS_932 = (int64_t)1 << 17;
41const int64_t CodePageRange::kChineseSimplified_936 = (int64_t)1 << 18;
42const int64_t CodePageRange::kKoreanWansung_949 = (int64_t)1 << 19;
43const int64_t CodePageRange::kChineseTraditional_950 = (int64_t)1 << 20;
44const int64_t CodePageRange::kKoreanJohab_1361 = (int64_t)1 << 21;
45const int64_t CodePageRange::kAlternateANSI22 = (int64_t)1 << 22;
46const int64_t CodePageRange::kAlternateANSI23 = (int64_t)1 << 23;
47const int64_t CodePageRange::kAlternateANSI24 = (int64_t)1 << 24;
48const int64_t CodePageRange::kAlternateANSI25 = (int64_t)1 << 25;
49const int64_t CodePageRange::kAlternateANSI26 = (int64_t)1 << 26;
50const int64_t CodePageRange::kAlternateANSI27 = (int64_t)1 << 27;
51const int64_t CodePageRange::kAlternateANSI28 = (int64_t)1 << 28;
52const int64_t CodePageRange::kMacintoshCharacterSet = (int64_t)1 << 29;
53const int64_t CodePageRange::kOEMCharacterSet = (int64_t)1 << 30;
54const int64_t CodePageRange::kSymbolCharacterSet = (int64_t)1 << 31;
55const int64_t CodePageRange::kReservedForOEM32 = (int64_t)1 << 32;
56const int64_t CodePageRange::kReservedForOEM33 = (int64_t)1 << 33;
57const int64_t CodePageRange::kReservedForOEM34 = (int64_t)1 << 34;
58const int64_t CodePageRange::kReservedForOEM35 = (int64_t)1 << 35;
59const int64_t CodePageRange::kReservedForOEM36 = (int64_t)1 << 36;
60const int64_t CodePageRange::kReservedForOEM37 = (int64_t)1 << 37;
61const int64_t CodePageRange::kReservedForOEM38 = (int64_t)1 << 38;
62const int64_t CodePageRange::kReservedForOEM39 = (int64_t)1 << 39;
63const int64_t CodePageRange::kReservedForOEM40 = (int64_t)1 << 40;
64const int64_t CodePageRange::kReservedForOEM41 = (int64_t)1 << 41;
65const int64_t CodePageRange::kReservedForOEM42 = (int64_t)1 << 42;
66const int64_t CodePageRange::kReservedForOEM43 = (int64_t)1 << 43;
67const int64_t CodePageRange::kReservedForOEM44 = (int64_t)1 << 44;
68const int64_t CodePageRange::kReservedForOEM45 = (int64_t)1 << 45;
69const int64_t CodePageRange::kReservedForOEM46 = (int64_t)1 << 46;
70const int64_t CodePageRange::kReservedForOEM47 = (int64_t)1 << 47;
71const int64_t CodePageRange::kIBMGreek_869 = (int64_t)1 << 48;
72const int64_t CodePageRange::kMSDOSRussion_866 = (int64_t)1 << 49;
73const int64_t CodePageRange::kMSDOSNordic_865 = (int64_t)1 << 50;
74const int64_t CodePageRange::kArabic_864 = (int64_t)1 << 51;
75const int64_t CodePageRange::kMSDOSCanadianFrench_863 = (int64_t)1 << 52;
76const int64_t CodePageRange::kHebrew_862 = (int64_t)1 << 53;
77const int64_t CodePageRange::kMSDOSIcelandic_861 = (int64_t)1 << 54;
78const int64_t CodePageRange::kMSDOSPortugese_860 = (int64_t)1 << 55;
79const int64_t CodePageRange::kIBMTurkish_857 = (int64_t)1 << 56;
80const int64_t CodePageRange::kIBMCyrillic_855 = (int64_t)1 << 57;
81const int64_t CodePageRange::kLatin2_852 = (int64_t)1 << 58;
82const int64_t CodePageRange::kMSDOSBaltic_775 = (int64_t)1 << 59;
83const int64_t CodePageRange::kGreek_737 = (int64_t)1 << 60;
84const int64_t CodePageRange::kArabic_708 = (int64_t)1 << 61;
85const int64_t CodePageRange::kLatin1_850 = (int64_t)1 << 62;
86const int64_t CodePageRange::kUS_437 = (int64_t)1 << 63;
87
88/******************************************************************************
89 * struct UnicodeRange
90 ******************************************************************************/
91int32_t UnicodeRange::range(int32_t bit) {
92  if (bit < 0 || bit > kLast) {
93    return -1;
94  }
95  return bit;
96}
97
98/******************************************************************************
99 * class OS2Table
100 ******************************************************************************/
101OS2Table::~OS2Table() {}
102
103int32_t OS2Table::TableVersion() {
104  return data_->ReadUShort(Offset::kVersion);
105}
106
107int32_t OS2Table::XAvgCharWidth() {
108  return data_->ReadShort(Offset::kXAvgCharWidth);
109}
110
111int32_t OS2Table::UsWeightClass() {
112  return data_->ReadUShort(Offset::kUsWeightClass);
113}
114
115int32_t OS2Table::UsWidthClass() {
116  return data_->ReadUShort(Offset::kUsWidthClass);
117}
118
119int32_t OS2Table::FsType() {
120  return data_->ReadUShort(Offset::kFsType);
121}
122
123int32_t OS2Table::YSubscriptXSize() {
124  return data_->ReadShort(Offset::kYSubscriptXSize);
125}
126
127int32_t OS2Table::YSubscriptYSize() {
128  return data_->ReadShort(Offset::kYSubscriptYSize);
129}
130
131int32_t OS2Table::YSubscriptXOffset() {
132  return data_->ReadShort(Offset::kYSubscriptXOffset);
133}
134
135int32_t OS2Table::YSubscriptYOffset() {
136  return data_->ReadShort(Offset::kYSubscriptYOffset);
137}
138
139int32_t OS2Table::YSuperscriptXSize() {
140  return data_->ReadShort(Offset::kYSuperscriptXSize);
141}
142
143int32_t OS2Table::YSuperscriptYSize() {
144  return data_->ReadShort(Offset::kYSuperscriptYSize);
145}
146
147int32_t OS2Table::YSuperscriptXOffset() {
148  return data_->ReadShort(Offset::kYSuperscriptXOffset);
149}
150
151int32_t OS2Table::YSuperscriptYOffset() {
152  return data_->ReadShort(Offset::kYSuperscriptYOffset);
153}
154
155int32_t OS2Table::YStrikeoutSize() {
156  return data_->ReadShort(Offset::kYStrikeoutSize);
157}
158
159int32_t OS2Table::YStrikeoutPosition() {
160  return data_->ReadShort(Offset::kYStrikeoutPosition);
161}
162
163int32_t OS2Table::SFamilyClass() {
164  return data_->ReadShort(Offset::kSFamilyClass);
165}
166
167void OS2Table::Panose(ByteVector* value) {
168  assert(value);
169  value->clear();
170  value->resize(10);
171  data_->ReadBytes(Offset::kPanose, &((*value)[0]), 0, 10);
172}
173
174int64_t OS2Table::UlUnicodeRange1() {
175  return data_->ReadULong(Offset::kUlUnicodeRange1);
176}
177
178int64_t OS2Table::UlUnicodeRange2() {
179  return data_->ReadULong(Offset::kUlUnicodeRange2);
180}
181
182int64_t OS2Table::UlUnicodeRange3() {
183  return data_->ReadULong(Offset::kUlUnicodeRange3);
184}
185
186int64_t OS2Table::UlUnicodeRange4() {
187  return data_->ReadULong(Offset::kUlUnicodeRange4);
188}
189
190void OS2Table::AchVendId(ByteVector* b) {
191  assert(b);
192  b->clear();
193  b->resize(4);
194  data_->ReadBytes(Offset::kAchVendId, &((*b)[0]), 0, 4);
195}
196
197int32_t OS2Table::FsSelection() {
198  return data_->ReadUShort(Offset::kFsSelection);
199}
200
201int32_t OS2Table::UsFirstCharIndex() {
202  return data_->ReadUShort(Offset::kUsFirstCharIndex);
203}
204
205int32_t OS2Table::UsLastCharIndex() {
206  return data_->ReadUShort(Offset::kUsLastCharIndex);
207}
208
209int32_t OS2Table::STypoAscender() {
210  return data_->ReadShort(Offset::kSTypoAscender);
211}
212
213int32_t OS2Table::STypoDescender() {
214  return data_->ReadShort(Offset::kSTypoDescender);
215}
216
217int32_t OS2Table::STypoLineGap() {
218  return data_->ReadShort(Offset::kSTypoLineGap);
219}
220
221int32_t OS2Table::UsWinAscent() {
222  return data_->ReadUShort(Offset::kUsWinAscent);
223}
224
225int32_t OS2Table::UsWinDescent() {
226  return data_->ReadUShort(Offset::kUsWinDescent);
227}
228
229int64_t OS2Table::UlCodePageRange1() {
230  return data_->ReadULong(Offset::kUlCodePageRange1);
231}
232
233int64_t OS2Table::UlCodePageRange2() {
234  return data_->ReadULong(Offset::kUlCodePageRange2);
235}
236
237int32_t OS2Table::SxHeight() {
238  return data_->ReadShort(Offset::kSxHeight);
239}
240
241int32_t OS2Table::SCapHeight() {
242  return data_->ReadShort(Offset::kSCapHeight);
243}
244
245int32_t OS2Table::UsDefaultChar() {
246  return data_->ReadUShort(Offset::kUsDefaultChar);
247}
248
249int32_t OS2Table::UsBreakChar() {
250  return data_->ReadUShort(Offset::kUsBreakChar);
251}
252
253int32_t OS2Table::UsMaxContext() {
254  return data_->ReadUShort(Offset::kUsMaxContext);
255}
256
257OS2Table::OS2Table(Header* header, ReadableFontData* data)
258    : Table(header, data) {
259}
260
261/******************************************************************************
262 * class OS2Table::Builder
263 ******************************************************************************/
264OS2Table::Builder::Builder(Header* header, WritableFontData* data)
265    : TableBasedTableBuilder(header, data) {
266}
267
268OS2Table::Builder::Builder(Header* header, ReadableFontData* data)
269    : TableBasedTableBuilder(header, data) {
270}
271
272OS2Table::Builder::~Builder() {}
273
274CALLER_ATTACH FontDataTable* OS2Table::Builder::SubBuildTable(
275    ReadableFontData* data) {
276  FontDataTablePtr table = new OS2Table(header(), data);
277  return table.Detach();
278}
279
280CALLER_ATTACH OS2Table::Builder*
281    OS2Table::Builder::CreateBuilder(Header* header,
282                                     WritableFontData* data) {
283  Ptr<OS2Table::Builder> builder;
284  builder = new OS2Table::Builder(header, data);
285  return builder.Detach();
286}
287
288int32_t OS2Table::Builder::TableVersion() {
289  return InternalReadData()->ReadUShort(Offset::kVersion);
290}
291
292void OS2Table::Builder::SetTableVersion(int32_t version) {
293  InternalWriteData()->WriteUShort(Offset::kVersion, version);
294}
295
296int32_t OS2Table::Builder::XAvgCharWidth() {
297  return InternalReadData()->ReadShort(Offset::kXAvgCharWidth);
298}
299
300void OS2Table::Builder::SetXAvgCharWidth(int32_t width) {
301  InternalWriteData()->WriteShort(Offset::kXAvgCharWidth, width);
302}
303
304int32_t OS2Table::Builder::UsWeightClass() {
305  return InternalReadData()->ReadUShort(Offset::kUsWeightClass);
306}
307
308void OS2Table::Builder::SetUsWeightClass(int32_t weight) {
309  InternalWriteData()->WriteUShort(Offset::kUsWeightClass, weight);
310}
311
312int32_t OS2Table::Builder::UsWidthClass() {
313  return InternalReadData()->ReadUShort(Offset::kUsWidthClass);
314}
315
316void OS2Table::Builder::SetUsWidthClass(int32_t width) {
317  InternalWriteData()->WriteUShort(Offset::kUsWidthClass, width);
318}
319
320int32_t OS2Table::Builder::FsType() {
321  return InternalReadData()->ReadUShort(Offset::kFsType);
322}
323
324void OS2Table::Builder::SetFsType(int32_t fs_type) {
325  InternalWriteData()->WriteUShort(Offset::kFsType, fs_type);
326}
327
328int32_t OS2Table::Builder::YSubscriptXSize() {
329  return InternalReadData()->ReadShort(Offset::kYSubscriptXSize);
330}
331
332void OS2Table::Builder::SetYSubscriptXSize(int32_t size) {
333  InternalWriteData()->WriteShort(Offset::kYSubscriptXSize, size);
334}
335
336int32_t OS2Table::Builder::YSubscriptYSize() {
337  return InternalReadData()->ReadShort(Offset::kYSubscriptYSize);
338}
339
340void OS2Table::Builder::SetYSubscriptYSize(int32_t size) {
341  InternalWriteData()->WriteShort(Offset::kYSubscriptYSize, size);
342}
343
344int32_t OS2Table::Builder::YSubscriptXOffset() {
345  return InternalReadData()->ReadShort(Offset::kYSubscriptXOffset);
346}
347
348void OS2Table::Builder::SetYSubscriptXOffset(int32_t offset) {
349  InternalWriteData()->WriteShort(Offset::kYSubscriptXOffset, offset);
350}
351
352int32_t OS2Table::Builder::YSubscriptYOffset() {
353  return InternalReadData()->ReadShort(Offset::kYSubscriptYOffset);
354}
355
356void OS2Table::Builder::SetYSubscriptYOffset(int32_t offset) {
357  InternalWriteData()->WriteShort(Offset::kYSubscriptYOffset, offset);
358}
359
360int32_t OS2Table::Builder::YSuperscriptXSize() {
361  return InternalReadData()->ReadShort(Offset::kYSuperscriptXSize);
362}
363
364void OS2Table::Builder::SetYSuperscriptXSize(int32_t size) {
365  InternalWriteData()->WriteShort(Offset::kYSuperscriptXSize, size);
366}
367
368int32_t OS2Table::Builder::YSuperscriptYSize() {
369  return InternalReadData()->ReadShort(Offset::kYSuperscriptYSize);
370}
371
372void OS2Table::Builder::SetYSuperscriptYSize(int32_t size) {
373  InternalWriteData()->WriteShort(Offset::kYSuperscriptYSize, size);
374}
375
376int32_t OS2Table::Builder::YSuperscriptXOffset() {
377  return InternalReadData()->ReadShort(Offset::kYSuperscriptXOffset);
378}
379
380void OS2Table::Builder::SetYSuperscriptXOffset(int32_t offset) {
381  InternalWriteData()->WriteShort(Offset::kYSuperscriptXOffset, offset);
382}
383
384int32_t OS2Table::Builder::YSuperscriptYOffset() {
385  return InternalReadData()->ReadShort(Offset::kYSuperscriptYOffset);
386}
387
388void OS2Table::Builder::SetYSuperscriptYOffset(int32_t offset) {
389  InternalWriteData()->WriteShort(Offset::kYSuperscriptYOffset, offset);
390}
391
392int32_t OS2Table::Builder::YStrikeoutSize() {
393  return InternalReadData()->ReadShort(Offset::kYStrikeoutSize);
394}
395
396void OS2Table::Builder::SetYStrikeoutSize(int32_t size) {
397  InternalWriteData()->WriteShort(Offset::kYStrikeoutSize, size);
398}
399
400int32_t OS2Table::Builder::YStrikeoutPosition() {
401  return InternalReadData()->ReadShort(Offset::kYStrikeoutPosition);
402}
403
404void OS2Table::Builder::SetYStrikeoutPosition(int32_t position) {
405  InternalWriteData()->WriteShort(Offset::kYStrikeoutPosition, position);
406}
407
408int32_t OS2Table::Builder::SFamilyClass() {
409  return InternalReadData()->ReadShort(Offset::kSFamilyClass);
410}
411
412void OS2Table::Builder::SetSFamilyClass(int32_t family) {
413  InternalWriteData()->WriteShort(Offset::kSFamilyClass, family);
414}
415
416void OS2Table::Builder::Panose(ByteVector* value) {
417  assert(value);
418  value->clear();
419  value->resize(Offset::kPanoseLength);
420  InternalReadData()->ReadBytes(Offset::kPanose,
421                                &((*value)[0]),
422                                0,
423                                Offset::kPanoseLength);
424}
425
426void OS2Table::Builder::SetPanose(ByteVector* panose) {
427  assert(panose);
428  if (panose->size() != Offset::kPanoseLength) {
429#if !defined (SFNTLY_NO_EXCEPTION)
430    throw IllegalArgumentException("Panose bytes must be exactly 10 in length");
431#endif
432    return;
433  }
434  InternalWriteData()->WriteBytes(Offset::kPanose, panose);
435}
436
437int64_t OS2Table::Builder::UlUnicodeRange1() {
438  return InternalReadData()->ReadULong(Offset::kUlUnicodeRange1);
439}
440
441void OS2Table::Builder::SetUlUnicodeRange1(int64_t range) {
442  InternalWriteData()->WriteULong(Offset::kUlUnicodeRange1, range);
443}
444
445int64_t OS2Table::Builder::UlUnicodeRange2() {
446  return InternalReadData()->ReadULong(Offset::kUlUnicodeRange2);
447}
448
449void OS2Table::Builder::SetUlUnicodeRange2(int64_t range) {
450  InternalWriteData()->WriteULong(Offset::kUlUnicodeRange2, range);
451}
452
453int64_t OS2Table::Builder::UlUnicodeRange3() {
454  return InternalReadData()->ReadULong(Offset::kUlUnicodeRange3);
455}
456
457void OS2Table::Builder::SetUlUnicodeRange3(int64_t range) {
458  InternalWriteData()->WriteULong(Offset::kUlUnicodeRange3, range);
459}
460
461int64_t OS2Table::Builder::UlUnicodeRange4() {
462  return InternalReadData()->ReadULong(Offset::kUlUnicodeRange4);
463}
464
465void OS2Table::Builder::SetUlUnicodeRange4(int64_t range) {
466  InternalWriteData()->WriteULong(Offset::kUlUnicodeRange4, range);
467}
468
469void OS2Table::Builder::AchVendId(ByteVector* b) {
470  assert(b);
471  b->clear();
472  b->resize(4);
473  InternalReadData()->ReadBytes(Offset::kAchVendId, &((*b)[0]), 0, 4);
474}
475
476void OS2Table::Builder::SetAchVendId(ByteVector* b) {
477  assert(b);
478  assert(b->size());
479  InternalWriteData()->WriteBytesPad(Offset::kAchVendId,
480                                     b,
481                                     0,
482                                     std::min<size_t>(
483                                         (size_t)Offset::kAchVendIdLength,
484                                         b->size()),
485                                     static_cast<byte_t>(' '));
486}
487
488int32_t OS2Table::Builder::FsSelection() {
489  return InternalReadData()->ReadUShort(Offset::kFsSelection);
490}
491
492void OS2Table::Builder::SetFsSelection(int32_t fs_selection) {
493  InternalWriteData()->WriteUShort(Offset::kFsSelection, fs_selection);
494}
495
496int32_t OS2Table::Builder::UsFirstCharIndex() {
497  return InternalReadData()->ReadUShort(Offset::kUsFirstCharIndex);
498}
499
500void OS2Table::Builder::SetUsFirstCharIndex(int32_t first_index) {
501  InternalWriteData()->WriteUShort(Offset::kUsFirstCharIndex, first_index);
502}
503
504int32_t OS2Table::Builder::UsLastCharIndex() {
505  return InternalReadData()->ReadUShort(Offset::kUsLastCharIndex);
506}
507
508void OS2Table::Builder::SetUsLastCharIndex(int32_t last_index) {
509  InternalWriteData()->WriteUShort(Offset::kUsLastCharIndex, last_index);
510}
511
512int32_t OS2Table::Builder::STypoAscender() {
513  return InternalReadData()->ReadShort(Offset::kSTypoAscender);
514}
515
516void OS2Table::Builder::SetSTypoAscender(int32_t ascender) {
517  InternalWriteData()->WriteShort(Offset::kSTypoAscender, ascender);
518}
519
520int32_t OS2Table::Builder::STypoDescender() {
521  return InternalReadData()->ReadShort(Offset::kSTypoDescender);
522}
523
524void OS2Table::Builder::SetSTypoDescender(int32_t descender) {
525  InternalWriteData()->WriteShort(Offset::kSTypoDescender, descender);
526}
527
528int32_t OS2Table::Builder::STypoLineGap() {
529  return InternalReadData()->ReadShort(Offset::kSTypoLineGap);
530}
531
532void OS2Table::Builder::SetSTypoLineGap(int32_t line_gap) {
533  InternalWriteData()->WriteShort(Offset::kSTypoLineGap, line_gap);
534}
535
536int32_t OS2Table::Builder::UsWinAscent() {
537  return InternalReadData()->ReadUShort(Offset::kUsWinAscent);
538}
539
540void OS2Table::Builder::SetUsWinAscent(int32_t ascent) {
541  InternalWriteData()->WriteUShort(Offset::kUsWinAscent, ascent);
542}
543
544int32_t OS2Table::Builder::UsWinDescent() {
545  return InternalReadData()->ReadUShort(Offset::kUsWinDescent);
546}
547
548void OS2Table::Builder::SetUsWinDescent(int32_t descent) {
549  InternalWriteData()->WriteUShort(Offset::kUsWinDescent, descent);
550}
551
552int64_t OS2Table::Builder::UlCodePageRange1() {
553  return InternalReadData()->ReadULong(Offset::kUlCodePageRange1);
554}
555
556void OS2Table::Builder::SetUlCodePageRange1(int64_t range) {
557  InternalWriteData()->WriteULong(Offset::kUlCodePageRange1, range);
558}
559
560int64_t OS2Table::Builder::UlCodePageRange2() {
561  return InternalReadData()->ReadULong(Offset::kUlCodePageRange2);
562}
563
564void OS2Table::Builder::SetUlCodePageRange2(int64_t range) {
565  InternalWriteData()->WriteULong(Offset::kUlCodePageRange2, range);
566}
567
568int32_t OS2Table::Builder::SxHeight() {
569  return InternalReadData()->ReadShort(Offset::kSxHeight);
570}
571
572void OS2Table::Builder::SetSxHeight(int32_t height) {
573  InternalWriteData()->WriteShort(Offset::kSxHeight, height);
574}
575
576int32_t OS2Table::Builder::SCapHeight() {
577  return InternalReadData()->ReadShort(Offset::kSCapHeight);
578}
579
580void OS2Table::Builder::SetSCapHeight(int32_t height) {
581  InternalWriteData()->WriteShort(Offset::kSCapHeight, height);
582}
583
584int32_t OS2Table::Builder::UsDefaultChar() {
585  return InternalReadData()->ReadUShort(Offset::kUsDefaultChar);
586}
587
588void OS2Table::Builder::SetUsDefaultChar(int32_t default_char) {
589  InternalWriteData()->WriteUShort(Offset::kUsDefaultChar, default_char);
590}
591
592int32_t OS2Table::Builder::UsBreakChar() {
593  return InternalReadData()->ReadUShort(Offset::kUsBreakChar);
594}
595
596void OS2Table::Builder::SetUsBreakChar(int32_t break_char) {
597  InternalWriteData()->WriteUShort(Offset::kUsBreakChar, break_char);
598}
599
600int32_t OS2Table::Builder::UsMaxContext() {
601  return InternalReadData()->ReadUShort(Offset::kUsMaxContext);
602}
603
604void OS2Table::Builder::SetUsMaxContext(int32_t max_context) {
605  InternalWriteData()->WriteUShort(Offset::kUsMaxContext, max_context);
606}
607
608}  // namespace sfntly
609