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