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