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