1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: font_ArchiveFontBase.h 4 5 Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Revision: 28317 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NN_FONT_FONT_ARCHIVE_FONT_BASE_H_ 17 #define NN_FONT_FONT_ARCHIVE_FONT_BASE_H_ 18 19 #include <nn/types.h> 20 #include <nn/os.h> 21 #include <nn/math.h> 22 #include <nn/cx.h> 23 #include <nn/font/font_ResFontBase.h> 24 25 26 #define NN_FONT_FLOAT_ASSERT(exp) ((void)0) 27 28 #define NN_FONT_BUFFERSIZE_ASSERT(size) ((void)0) 29 30 namespace nn { 31 namespace font { 32 33 //--------------------------------------------------------------------------- 34 //! @brief グリフグループが定義されているフォントリソースを扱うクラスです。 35 //--------------------------------------------------------------------------- 36 class ArchiveFontBase : public ResFontBase 37 { 38 public: 39 struct ConstructContext; 40 41 protected: 42 struct CachedStreamReader 43 { 44 friend struct ConstructContext; 45 46 public: 47 //! @brief 読み出されたストリームデータの残りサイズを取得します。 48 //! 49 //! @return 読み出されたストリームデータの残りサイズを返します。 50 //! 51 u32 GetRemain() const; 52 53 //! @brief ストリームを読み捨てます。 54 //! 55 //! @param[in] dx 読み捨てるバイト数。 56 //! 57 void Advance(u32 dx); 58 59 //! @brief ConstructContext にストリームをコピーします。 60 //! 61 //! @param[in] pContext コピー先の構築コンテキスト 62 //! @param[in] size コピーするサイズ。 63 //! 64 void CopyTo( 65 ConstructContext* pContext, 66 u32 size); 67 68 //! @brief ストリームをコピーします。 69 //! 70 //! @param[in] buf コピー先のバッファ。 71 //! @param[in] size コピーするサイズ。 72 //! 73 void CopyTo( 74 void* buf, 75 u32 size); 76 77 //! @brief ストリームを移動します。 78 //! キャッシュされているストリームをキャッシュに書き込む場合に 79 //! 使用します。 80 //! 81 //! @param[in] buf 移動先のバッファ。 82 //! @param[in] size 移動するサイズ。 83 //! 84 void MoveTo( 85 void* buf, 86 u32 size); 87 88 //! @brief 構築コンテキストへ必要な分のデータをコピーします。 89 //! 90 //! @param[in] pContext コピー先の構築コンテキスト。 91 //! 92 //! @return 必要な分に足りないサイズを返します。 93 //! 94 u32 ManagedCopy(ConstructContext* pContext); 95 96 //! @brief キャッシュされたデータが存在するか判定します。 97 //! 98 //! @return キャッシュされたデータが存在するなら true を返します。 99 //! HasBufDataCachedStreamReader100 bool HasBufData() const { return mpTempStrmBufPos < mpTempStrmBufEnd; } 101 102 //! @brief ストリーム中のデータを直接参照します。 103 //! キャッシュされたデータが存在する場合は使用できません。 104 //! 105 //! @param[in] size 参照するデータサイズです。 106 //! 参照されるデータは既に読み取られた物として扱われます。 107 //! 108 //! @return ストリームデータへのポインタを返します。 109 //! 110 const void* Get(u32 size); 111 112 //! @brief バッファに読み出されたストリームの一部を取り込みます。 113 //! 114 //! @param[in] stream 読み出されたストリームデータ。 115 //! @param[in] streamSize stream に格納されているバッファのバイト数。 116 //! 117 void Attach( 118 const void* stream, 119 u32 streamSize); 120 121 //! @brief ストリームにデータの追加を要求します。 122 //! 123 //! @param[in] pContext データ要求を管理する構築コンテキスト。 124 //! @param[in] size 必要なデータサイズ。 125 //! 126 //! @return 要求に成功した場合に true を返します。 127 //! 128 bool RequestData( 129 ConstructContext* pContext, 130 u32 size); 131 132 //! @brief 現在管理しているストリーム断片中の現在位置を返します。 133 //! 134 //! @return ストリーム断片先頭から現在までに読み取ったバイト数。 135 //! 136 u32 GetOffset() const; 137 138 private: 139 //! 初期化します。 140 void Init(); 141 142 private: 143 const u8* mStreamBegin; 144 const u8* mStreamPos; 145 const u8* mStreamEnd; 146 u8* mpTempStrmBuf; 147 u8* mpTempStrmBufPos; 148 u8* mpTempStrmBufEnd; 149 150 u32 mRequireSize; 151 }; 152 153 public: 154 /* ------------------------------------------------------------------------ 155 型 156 ------------------------------------------------------------------------ */ 157 // 構築処理の返り値 158 enum ConstructResult 159 { 160 CONSTRUCT_MORE_DATA, 161 CONSTRUCT_FINISH, 162 CONSTRUCT_ERROR, 163 CONSTRUCT_CONTINUE, 164 NUM_OF_CONSTRUCT_RESULT 165 }; 166 167 struct ConstructContext 168 { 169 public: 170 enum Operation 171 { 172 DISPATCH, // 0 173 ANALYZE_FILE_HEADER, // 1 174 ANALYZE_GLGR, // 2 175 ANALYZE_FINF, // 3 176 ANALYZE_CMAP, // 4 177 ANALYZE_CWDH, // 5 178 ANALYZE_TGLP, // 6 179 PREPAIR_COPY_SHEET, // 7 180 PREPAIR_EXPAND_SHEET, // 8 181 COPY, // 9 182 SKIP, // 10 183 EXPAND, // 11 184 FATAL_ERROR, // 12 185 NUM_OF_OPERATION, // 186 INVALID_OPERATION 187 }; 188 189 public: InitConstructContext190 void Init( 191 void* outBuffer, 192 u32 outBufferSize, 193 u16* pAdjustTable, 194 u16 nSheets, 195 u16 nPerSheet, 196 u32 numBlock 197 ) 198 { 199 Init(outBuffer, outBufferSize, NULL); 200 SetGLGR(pAdjustTable, nSheets, nPerSheet, numBlock); 201 } 202 203 void Init( 204 void* outBuffer, 205 u32 outBufferSize, 206 const char* glyphGroups); 207 208 void SetGLGR( 209 u16* pAdjustTable, 210 u16 nSheets, 211 u16 nPerSheet, 212 u32 numBlock); 213 214 // 出力先バッファ位置走査 215 template <typename PtrT> GetCurrentPtrConstructContext216 PtrT GetCurrentPtr() 217 { 218 return reinterpret_cast<PtrT>(targetBufferCur); 219 } 220 GetRemainConstructContext221 u32 GetRemain() const 222 { 223 return static_cast<u32>(targetBufferEnd - targetBufferCur); 224 } 225 AlignConstructContext226 void Align(u32 align) 227 { 228 targetBufferCur = reinterpret_cast<u8*>(nn::math::RoundUp(reinterpret_cast<uptr>(targetBufferCur), align)); 229 } 230 AdvanceConstructContext231 void Advance(u32 dx) { targetBufferCur += dx; } 232 233 #ifdef NN_DEBUG offsetConstructContext234 u32 offset() const 235 { 236 return static_cast<u32>(targetBufferCur - targetBuffer); 237 } 238 sIndexConstructContext239 u32 sIndex() const { return sheetIndex; } 240 #endif 241 242 // 展開完了 243 void Finish( 244 void** ppData, 245 FontInformation** ppFontInfo, 246 u16** ppAdjustTable); 247 248 // メンバ取得 GetNumSheetsConstructContext249 u16 GetNumSheets() const { return numSheets; } 250 GetNumGlyphsPerSheetConstructContext251 u16 GetNumGlyphsPerSheet() const { return glyphsPerSheet; } 252 GetStreamReaderConstructContext253 CachedStreamReader& GetStreamReader() { return streamReader; } 254 255 cx::UncompContextHuffman* GetUncompContextConstructContext256 GetUncompContext() { return extendContext; } 257 GetGlyphGroupsConstructContext258 const char* GetGlyphGroups() const { return pGlyphGroups; } 259 260 // メンバインクリメント NextBlockConstructContext261 void NextBlock() { currentBlock++; } 262 NextSheetConstructContext263 void NextSheet() { sheetIndex++; } 264 265 // 条件判定 IsRequireSheetConstructContext266 bool IsRequireSheet(int sheetNo) const 267 { 268 NN_ASSERT( sheetNo < numSheets ); 269 return pGlyphIndexAdjustTable[sheetNo] != ADJUST_OFFSET_SHEET_NOT_LOADED; 270 } 271 IsRequireSheetConstructContext272 bool IsRequireSheet() const { return IsRequireSheet(sheetIndex); } 273 HasMoreSheetConstructContext274 bool HasMoreSheet() const { return sheetIndex < numSheets; } 275 HasMoreBlockConstructContext276 bool HasMoreBlock() const { return currentBlock < resNumBlock; } 277 278 // 共通タスク 279 void SetupCopyTask( 280 u32 copySize, 281 Operation nextOp = DISPATCH 282 ) 283 { 284 NN_FONT_BUFFERSIZE_ASSERT( copySize ); 285 opSize = copySize; 286 op = ConstructContext::COPY; 287 op2 = nextOp; 288 } 289 290 void SetupSkipTask( 291 u32 skipSize, 292 Operation nextOp = DISPATCH 293 ) 294 { 295 NN_FONT_BUFFERSIZE_ASSERT( skipSize ); 296 opSize = skipSize; 297 op = ConstructContext::SKIP; 298 op2 = nextOp; 299 } 300 301 void SetupExtendTask( 302 u32 extendSize, 303 Operation nextOp = DISPATCH 304 ) 305 { 306 NN_FONT_BUFFERSIZE_ASSERT( extendSize ); 307 opSize = extendSize; 308 op = ConstructContext::EXPAND; 309 op2 = nextOp; 310 } 311 EndTaskConstructContext312 void EndTask() { op = op2; } 313 TaskRemainConstructContext314 u32 TaskRemain() const { return opSize; } 315 TaskProceedConstructContext316 void TaskProceed(u32 size) { opSize -= nn::math::Min(size, opSize); } 317 318 319 public: 320 FontInformation* pFINF; 321 FontWidth* pPrevCWDH; 322 FontCodeMap* pPrevCMAP; 323 324 Operation op; 325 NN_PADDING3; 326 detail::BinaryBlockHeader 327 header; 328 329 u32 streamOffset; 330 331 private: 332 CachedStreamReader streamReader; 333 cx::UncompContextHuffman* 334 extendContext; 335 336 const char* pGlyphGroups; 337 u16* pGlyphIndexAdjustTable; 338 u8* targetBuffer; 339 u8* targetBufferEnd; 340 u8* targetBufferCur; 341 342 Operation op2; 343 NN_PADDING3; 344 u32 opSize; 345 u32 resNumBlock; 346 u32 currentBlock; 347 348 u16 sheetIndex; 349 u16 numSheets; 350 u16 glyphsPerSheet; 351 u16 padding[1]; 352 }; 353 354 355 /* ------------------------------------------------------------------------ 356 定数 357 ------------------------------------------------------------------------ */ 358 static const char LOAD_GLYPH_ALL[1]; 359 static const int HEADER_SIZE = 16 * 1024; 360 361 362 363 364 /* ------------------------------------------------------------------------ 365 関数 366 ------------------------------------------------------------------------ */ 367 368 //! @name コンストラクタ/デストラクタ 369 //@{ 370 371 //! コンストラクタです。 372 ArchiveFontBase(); 373 374 //! デストラクタです。 375 virtual ~ArchiveFontBase(); 376 377 //@} 378 379 380 //! @name 文字情報の取得 381 //@{ 382 383 //---- ResFontBase のオーバーライド 384 virtual const CharWidths 385 GetCharWidths(CharCode c) const; 386 387 virtual bool HasGlyph(CharCode c) const; 388 389 //@} 390 391 392 protected: 393 /* ------------------------------------------------------------------------ 394 型 395 ------------------------------------------------------------------------ */ 396 class FontGlyphGroupsAcs 397 { 398 public: 399 FontGlyphGroupsAcs(const void* brfnt); 400 GetNumBlock()401 u16 GetNumBlock() const { return mpHeader->dataBlocks; } 402 GetFileSize()403 u32 GetFileSize() const { return mpHeader->fileSize; } 404 GetGLGRSize()405 u32 GetGLGRSize() const { return mpData->header.size; } 406 GetSetName(int setNo)407 const char* GetSetName(int setNo) const 408 { 409 return reinterpret_cast<const char*>( 410 reinterpret_cast<uptr>(mpHeader) + mpData->body.nameOffsets[setNo] 411 ); 412 } 413 GetSizeCompSheet(int sheetNo)414 u32 GetSizeCompSheet(int sheetNo) const 415 { return mpSizeSheetsArray[sheetNo]; } 416 GetSizeCWDH(int cwdhNo)417 u32 GetSizeCWDH(int cwdhNo) const { return mpSizeCWDHArray[cwdhNo]; } 418 GetSizeCMAP(int cmapNo)419 u32 GetSizeCMAP(int cmapNo) const { return mpSizeCMAPArray[cmapNo]; } 420 IsUseSheet(int setNo,int sheetNo)421 bool IsUseSheet( 422 int setNo, 423 int sheetNo 424 ) const 425 { 426 return GetBit(mpUseSheetArray, setNo * mSizeSheetFlags * 8 + sheetNo); 427 } 428 IsUseCWDH(int setNo,int cwdhNo)429 bool IsUseCWDH( 430 int setNo, 431 int cwdhNo 432 ) const 433 { 434 return GetBit(mpUseCWDHArray, setNo * mSizeCWDHFlags * 8 + cwdhNo); 435 } 436 IsUseCMAP(int setNo,int cmapNo)437 bool IsUseCMAP( 438 int setNo, 439 int cmapNo 440 ) const 441 { 442 return GetBit(mpUseCMAPArray, setNo * mSizeCMAPFlags * 8 + cmapNo); 443 } 444 GetUseSheetFlags(int setNo,int flagSetNo)445 u32 GetUseSheetFlags( 446 int setNo, 447 int flagSetNo 448 ) const 449 { 450 return mpUseSheetArray[setNo * mSizeSheetFlags / 4 + flagSetNo]; 451 } 452 GetUseCWDHFlags(int setNo,int flagSetNo)453 u32 GetUseCWDHFlags( 454 int setNo, 455 int flagSetNo 456 ) const 457 { 458 return mpUseCWDHArray [setNo * mSizeCWDHFlags / 4 + flagSetNo]; 459 } 460 GetUseCMAPFlags(int setNo,int flagSetNo)461 u32 GetUseCMAPFlags( 462 int setNo, 463 int flagSetNo 464 ) const 465 { 466 return mpUseCMAPArray [setNo * mSizeCMAPFlags / 4 + flagSetNo]; 467 } 468 GetSheetSize()469 u32 GetSheetSize() const { return mpData->body.sheetSize; } 470 GetNumGlyphsPerSheet()471 u16 GetNumGlyphsPerSheet() const { return mpData->body.glyphsPerSheet; } 472 GetNumSheet()473 u16 GetNumSheet() const { return mpData->body.numSheet; } 474 GetNumSet()475 u16 GetNumSet() const { return mpData->body.numSet; } 476 GetNumCWDH()477 u16 GetNumCWDH() const { return mpData->body.numCWDH; } 478 GetNumCMAP()479 u16 GetNumCMAP() const { return mpData->body.numCMAP; } 480 481 const detail::BinaryBlockHeader* GetNextBlock()482 GetNextBlock() const 483 { 484 return reinterpret_cast<const detail::BinaryBlockHeader*>( 485 reinterpret_cast<uptr>(mpData) + mpData->header.size); 486 } 487 488 private: GetBit(const u32 * bits,u32 index)489 static bool GetBit(const u32* bits, u32 index) 490 { 491 u32 wordIndex = index / 32; 492 u32 bitIndex = index % 32; 493 return ((bits[wordIndex] << bitIndex) & (1u << 31)) != 0; 494 } 495 496 const detail::BinaryFileHeader* 497 mpHeader; 498 const FontGlyphGroupsBlock* 499 mpData; 500 const u16* mpNameOffsetArray; 501 const u32* mpSizeSheetsArray; 502 const u32* mpSizeCWDHArray; 503 const u32* mpSizeCMAPArray; 504 const u32* mpUseSheetArray; 505 const u32* mpUseCWDHArray; 506 const u32* mpUseCMAPArray; 507 u32 mSizeSheetFlags; 508 u32 mSizeCWDHFlags; 509 u32 mSizeCMAPFlags; 510 }; 511 512 513 /* ------------------------------------------------------------------------ 514 定数 515 ------------------------------------------------------------------------ */ 516 static const u16 ADJUST_OFFSET_SHEET_NOT_LOADED = 0xFFFF; 517 518 519 /* ------------------------------------------------------------------------ 520 関数 521 ------------------------------------------------------------------------ */ 522 //---- 構築/破棄 523 524 //! @brief 割り当てられたバッファとそこに配置されている FINF ブロックへの 525 //! ポインタ, グリフインデックス調整テーブルを設定します。 526 //! 527 //! @param[in,out] pUserBuffer 割り当てられたバッファへのポインタ。 528 //! @param[in] pFontInfo FINF ブロックへのポインタ。 529 //! @param[in] pAdjustTable グリフインデックス調整テーブルへのポインタ。 530 //! 531 void SetResourceBuffer( 532 void* pUserBuffer, 533 FontInformation* pFontInfo, 534 u16* pAdjustTable); 535 536 //! @brief SetResourceBuffer で設定されたパラメータをリセットし、 537 //! 割り当てられていたバッファへのポインタを返します。 538 //! 539 //! @return 設定されていたバッファへのポインタ。 540 //! 541 void* RemoveResourceBuffer(); 542 543 //---- グリフインデックス 544 545 //! @brief CMAP ブロックから取得したグリフインデックスに対して 546 //! ロードしていないシート分の補正を行います。 547 //! CWDH ブロックでの文字幅情報取得には補正前のグリフインデックスを、 548 //! シートからのグリフイメージ切り出しには補正後の 549 //! グリフインデックスを使用します 550 //! 551 //! @param[in] index 補正するグリフインデックス 552 //! 553 //! @return 補正後のグリフインデックスを返します。 554 //! GLYPH_INDEX_NOT_FOUND ではないグリフインデックスが 555 //! 補正によって GLYPH_INDEX_NOT_FOUND になることがあります。 556 //! 557 u16 AdjustIndex(u16 index) const; 558 559 //---- GLGRブロック探査用 560 IsNullString(const char * str)561 static bool IsNullString(const char* str) { return *str == '\0'; } 562 563 //! @brief nameList に name が含まれているか判断します。 564 //! 565 //! @param[in] nameList 文字列のカンマ区切りリスト。 566 //! @param[in] name 探索する文字列。 567 //! 568 //! @return nameList に name が含まれているなら true を返します。 569 //! 570 static bool IncludeName( 571 const char* nameList, 572 const char* name); 573 574 //! @brief 与えられたバイナリデータが圧縮済みフォントリソースの 575 //! GLGR ブロック部分までを含んでいるか判断します。 576 //! 577 //! @param[in] brfnt 判断するバイナリデータへのポインタ。 578 //! @param[in] dataSize brfnt で渡されたデータのサイズ。 579 580 //! @return brfnt が GLGR ブロックを完全に含んだ圧縮済みフォントリソースなら 581 //! true を返します。 582 //! 583 static bool IsValidResource( 584 const void* brfnt, 585 u32 dataSize); 586 587 //---- 構築処理 588 589 //! @brief 入力ストリームのデータが足りない場合の処理を行います。 590 //! 591 //! @param[in] pContext ストリーム構築コンテキスト。 592 //! @param[in] pStream 入力ストリーム。 593 //! @param[in] size 必要なデータのサイズ。 594 //! 595 //! @return 処理状態を返します。 596 //! 597 static ConstructResult RequestData( 598 ConstructContext* pContext, 599 CachedStreamReader* pStream, 600 u32 size); 601 602 //! @brief バイナリファイル中のブロックごとに処理を振り分けます。 603 //! 604 //! @param[in] pContext ストリーム構築コンテキスト。 605 //! @param[in] pStream 入力ストリーム。 606 //! 607 //! @return 処理状態を返します。 608 //! 609 static ConstructResult ConstructOpDispatch( 610 ConstructContext* pContext, 611 CachedStreamReader* pStream); 612 613 //! @brief バイナリファイルヘッダを処理します。 614 //! 615 //! @param[in] pContext ストリーム構築コンテキスト。 616 //! @param[in] pStream 入力ストリーム。 617 //! 618 //! @return 処理状態を返します。 619 //! 620 static ConstructResult ConstructOpAnalyzeFileHeader( 621 ConstructContext* pContext, 622 CachedStreamReader* pStream); 623 624 //! @brief GLGR ブロックを処理します。 625 //! 626 //! @param[in] pContext ストリーム構築コンテキスト。 627 //! @param[in] pStream 入力ストリーム。 628 //! 629 //! @return 処理状態を返します。 630 //! 631 static ConstructResult ConstructOpAnalyzeGLGR( 632 ConstructContext* pContext, 633 CachedStreamReader* pStream); 634 635 //! @brief FINF ブロックを処理します。 636 //! 637 //! @param[in] pContext ストリーム構築コンテキスト。 638 //! @param[in] pStream 入力ストリーム。 639 //! 640 //! @return 処理状態を返します。 641 //! 642 static ConstructResult ConstructOpAnalyzeFINF( 643 ConstructContext* pContext, 644 CachedStreamReader* pStream); 645 646 //! @brief CMAP ブロックを処理します。 647 //! 648 //! @param[in] pContext ストリーム構築コンテキスト。 649 //! @param[in] pStream 入力ストリーム。 650 //! 651 //! @return 処理状態を返します。 652 //! 653 static ConstructResult ConstructOpAnalyzeCMAP( 654 ConstructContext* pContext, 655 CachedStreamReader* pStream); 656 657 //! @brief CWDH ブロックを処理します。 658 //! 659 //! @param[in] pContext ストリーム構築コンテキスト。 660 //! @param[in] pStream 入力ストリーム。 661 //! 662 //! @return 処理状態を返します。 663 //! 664 static ConstructResult ConstructOpAnalyzeCWDH( 665 ConstructContext* pContext, 666 CachedStreamReader* pStream); 667 668 //! @brief TGLP ブロックを処理します。 669 //! 670 //! @param[in] pContext ストリーム構築コンテキスト。 671 //! @param[in] pStream 入力ストリーム。 672 //! 673 //! @return 処理状態を返します。 674 //! 675 static ConstructResult ConstructOpAnalyzeTGLP( 676 ConstructContext* pContext, 677 CachedStreamReader* pStream); 678 679 //! @brief シートのコピー処理をセットアップします。 680 //! 681 //! @param[in] pContext ストリーム構築コンテキスト。 682 //! @param[in] pStream 入力ストリーム。 683 //! 684 //! @return 処理状態を返します。 685 //! 686 static ConstructResult ConstructOpPrepairCopySheet( 687 ConstructContext* pContext, 688 CachedStreamReader* pStream); 689 690 //! @brief シートの展開処理をセットアップします。 691 //! 692 //! @param[in] pContext ストリーム構築コンテキスト。 693 //! @param[in] pStream 入力ストリーム。 694 //! 695 //! @return 処理状態を返します。 696 //! 697 static ConstructResult ConstructOpPrepairExpandSheet( 698 ConstructContext* pContext, 699 CachedStreamReader* pStream); 700 701 //! @brief データを入力ストリームから構築コンテキストの 702 //! 出力バッファへコピーします。 703 //! 704 //! @param[in] pContext ストリーム構築コンテキスト。 705 //! @param[in] pStream 入力ストリーム。 706 //! 707 //! @return 処理状態を返します。 708 //! 709 static ConstructResult ConstructOpCopy( 710 ConstructContext* pContext, 711 CachedStreamReader* pStream); 712 713 //! @brief 入力ストリームを読み捨てます。 714 //! 715 //! @param[in] pContext ストリーム構築コンテキスト。 716 //! @param[in] pStream 入力ストリーム。 717 //! 718 //! @return 処理状態を返します。 719 //! 720 static ConstructResult ConstructOpSkip( 721 ConstructContext* pContext, 722 CachedStreamReader* pStream); 723 724 //! @brief 入力ストリームを展開しつつ構築コンテキストの 725 //! 出力バッファに書き出します。 726 //! 727 //! @param[in] pContext ストリーム構築コンテキスト。 728 //! @param[in] pStream 入力ストリーム。 729 //! 730 //! @return 処理状態を返します。 731 //! 732 static ConstructResult ConstructOpExpand( 733 ConstructContext* pContext, 734 CachedStreamReader* pStream); 735 736 //! @brief 既に致命的なエラーが発生している場合にも関わらず 737 //! 処理が継続された場合に呼び出されます。 738 //! 739 //! @param[in] pContext ストリーム構築コンテキスト。 740 //! @param[in] pStream 入力ストリーム。 741 //! 742 //! @return 処理状態を返します。 743 //! 744 static ConstructResult ConstructOpFatalError( 745 ConstructContext* pContext, 746 CachedStreamReader* pStream); 747 748 private: 749 /* ------------------------------------------------------------------------ 750 変数 751 ------------------------------------------------------------------------ */ 752 u16* m_pGlyphIndexAdjustArray; 753 }; 754 755 } // namespace font 756 } // namespace nn 757 758 #endif // NN_FONT_FONT_ARCHIVE_FONT_BASE_H_ 759