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