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