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