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