1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     font_ArchiveFont.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: 27535 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_FONT_FONT_ARCHIVE_FONT_H_
17 #define NN_FONT_FONT_ARCHIVE_FONT_H_
18 
19 #include <nn/types.h>
20 #include <nn/font/font_ArchiveFontBase.h>
21 
22 
23 namespace nn {
24 namespace font {
25 
26 //---------------------------------------------------------------------------
27 //! @brief        グリフグループが定義されているフォントリソースから、
28 //!               指定したグリフグループのみを抽出したフォントを構築します。
29 //---------------------------------------------------------------------------
30 class ArchiveFont : public ArchiveFontBase
31 {
32 public:
33     /* ------------------------------------------------------------------------
34             関数
35        ------------------------------------------------------------------------ */
36 
37     //! @name コンストラクタ / デストラクタ
38     //@{
39 
40     //! コンストラクタです。
41                     ArchiveFont();
42 
43     //! デストラクタです。
44     virtual         ~ArchiveFont();
45 
46     //@}
47 
48 
49     //! @name リソースの関連付け/解除
50     //@{
51 
52     //! @brief      フォントを構築するのに必要なバッファサイズを計算します。
53     //!
54     //! @param[in]  bfnt         フォントリソースの先頭部分へのポインタ。
55     //! @param[in]  glyphGroups  ロードするグリフグループを指定する文字列。
56     //!
57     //! @return     Construct() 関数または InitStreamingConstruct() 関数で、
58     //!             フォントを構築する場合に必要なバッファのサイズを返します。@n
59     //!             リソース @a bfnt が不正である等の理由で、
60     //!             バッファサイズが計算できなかった場合は 0 を返します。
61     //!
62     static u32      GetRequireBufferSize(
63                         const void*         bfnt,
64                         const char*         glyphGroups = LOAD_GLYPH_ALL
65                     );
66 
67     //! @brief      アーカイブフォントからグリフグループを抽出しフォントを構築します。
68     //!
69     //! @param[out] pBuffer     このインスタンスに関連付けるバッファへのポインタ。
70     //!                         128byte アライメントされている必要があります。
71     //! @param[in]  bufferSize  @a pBuffer が指すバッファのサイズ。
72     //! @param[in]  bfnt        メモリ上にロード済みのバイナリリソース (bfnt) へのポインタ。
73     //! @param[in]  glyphGroups ロードするグリフグループを指定する文字列。
74     //!
75     //! @return     フォントの構築が成功したなら true を、そうでなければ false を返します。@n
76     //!             アーカイブフォント @a bfnt が不正であったりバッファサイズが小さすぎると
77     //!             失敗します。
78     //!
79     bool            Construct(
80                         void*               pBuffer,
81                         u32                 bufferSize,
82                         const void*         bfnt,
83                         const char*         glyphGroups = LOAD_GLYPH_ALL
84                     );
85 
86     //! @brief      アーカイブフォントから順次読み込みでグリフグループを抽出し、
87     //!             フォントを構築するための初期化を行います。
88     //! @param[out] pContext    初期化するストリーミング構築コンテキストへのポインタ。
89     //! @param[out] pBuffer     このインスタンスに関連付けるバッファへのポインタ。
90     //!                         128byte アライメントされている必要があります。
91     //! @param[in]  bufferSize  @a pBuffer が指すバッファのサイズ。
92     //! @param[in]  glyphGroups ロードするグリフグループを指定する文字列。
93     //!
94     void            InitStreamingConstruct(
95                         ConstructContext*   pContext,
96                         void*               pBuffer,
97                         u32                 bufferSize,
98                         const char*         glyphGroups = LOAD_GLYPH_ALL
99                     );
100 
101     //! @brief      アーカイブフォントから順次読み込みでフォントを構築します。
102     //!
103     //! @param[out] pContext    InitStreamingConstruct() 関数で初期化した
104     //!                         ストリーミング構築コンテキストへのポインタ。
105     //! @param[in]  stream      アーカイブフォントの一部を格納したバッファへのポインタ。
106     //! @param[in]  streamSize  @a stream が指すバッファに格納されているデータのバイト数。
107     //!
108     //! @return     構築処理の経過状態を返します。
109     //!
110     ConstructResult StreamingConstruct(
111                         ConstructContext*   pContext,
112                         const void*         stream,
113                         u32                 streamSize);
114 
115     //! @brief      フォントを破棄します。
116     //!
117     //! @return     Construct() 関数または InitStreamingConstruct() 関数で、
118     //!             このインスタンスに割り当てたメモリ領域へのポインタを返します。
119     //!
120     void*           Destroy();
121 
122     //@}
123 
124     //! @name 文字情報の取得
125     //@{
126 
127     //! @brief      グリフデータを取得します。
128     //!
129     //! @param[out] pGlyph   グリフデータを受け取るバッファへのポインタ
130     //! @param[in]  c       グリフデータを取得する文字の文字コード
131     //!
132     virtual void    GetGlyph(
133                         Glyph*      pGlyph,
134                         CharCode    c
135                     ) const;
136 
137     //@}
138 
139 private:
140     /* ------------------------------------------------------------------------
141             関数
142        ------------------------------------------------------------------------ */
143     //---- グリフインデックス
144 
145     //! @brief      グリフインデックスに対応するグリフデータを取得します。
146     //!
147     //! @param[out] pGlyph  グリフデータを格納するバッファへのポインタ。
148     //! @param[in]  index  取得するグリフデータのグリフインデックス。
149     //!
150     void            GetGlyphFromIndex(
151                         Glyph*      pGlyph,
152                         GlyphIndex  index
153                     ) const;
154 };
155 
156 }   // namespace font
157 }   // namespace nn
158 
159 #endif //  NN_FONT_FONT_ARCHIVE_FONT_H_
160