1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     font_Font.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: 25674 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_FONT_FONT_FONT_H_
17 #define NN_FONT_FONT_FONT_H_
18 
19 #include <nn/types.h>
20 #include <nn/font/font_CharStrmReader.h>
21 #include <nn/font/font_ResourceFormat.h>
22 #include <climits>
23 
24 #define NN_FONT_MIN_ASSERT(exp, min)            NN_ASSERT((exp) >= (min))
25 
26 #define NN_FONT_MINMAX_ASSERT(exp, min, max)    NN_ASSERT((exp) >= (min) && (exp) <= (max))
27 
28 
29 namespace nn {
30 namespace font {
31 
32 class Font;
33 
34 //---- テクスチャフォーマット型
35 typedef u16     TexFmt;
36 
37 namespace internal {
38 
39 union TextureSize
40 {
41     struct
42     {
43         u16                 height;   //!< 高さ
44         u16                 width;    //!< 幅
45     } HW;
46     u32                 size;   //!< サイズ
47 };
48 
49 class TextureObject
50 {
51 public:
52                             TextureObject();
53 
54     void                    Set(
55                                 u32         name,
56                                 const Font* pFont,
57                                 const void* pImage,
58                                 TexFmt      format,
59                                 u16         width,
60                                 u16         height);
61 
Reset()62     void                    Reset()
63     {
64         Set(0, NULL, NULL, FONT_SHEET_FORMAT_A8, 0, 0);
65     }
66 
GetName()67     u32                     GetName() const
68     {
69         return m_Name;
70     }
71 
GetFont()72     const Font*             GetFont() const
73     {
74         return m_pFont;
75     }
76 
GetImage()77     uptr                    GetImage() const
78     {
79         return m_pImage;
80     }
81 
GetFormat()82     u8                      GetFormat() const
83     {
84         return m_Format;
85     }
86 
GetSize()87     const TextureSize       GetSize() const
88     {
89         return m_Size;
90     }
91 
92     u32                     GetWrapFilter() const;
93 
94 private:
95     u32                     m_Name;     //!< テクスチャ名
96     const Font*             m_pFont;    //!< フォントへのポインタ
97     uptr                    m_pImage;   //!< イメージへのポインタ
98     TextureSize             m_Size;     //!< サイズ
99     u8                      m_Format;   //!< フォーマット
100     NN_PADDING3;
101 };
102 
103 }   // namespace internal
104 
105 
106 //---- 文字コード型
107 typedef u16     CharCode;
108 
109 //---------------------------------------------------------------------------
110 //! @brief        文字グリフの情報を保持する構造体です。
111 //---------------------------------------------------------------------------
112 struct Glyph
113 {
114     const void* pTexture;                   //!< シートへのポインタ
115     CharWidths  widths;                     //!< 文字幅情報
116     u8          height;                     //!< セルの高さ
117     u16         texWidth;                   //!< シートの幅
118     u16         texHeight;                  //!< シートの高さ
119     u16         cellX;                      //!< シート内でのセル左上隅のx座標
120     u16         cellY;                      //!< シート内でのセル左上隅のy座標
121     u8          isSheetUpdated;             //!< シートの内容が更新されている場合は真
122     NN_PADDING1;
123     TexFmt      texFormat;                  //!< シートのフォーマット
124     const internal::TextureObject*
125                 pTextureObject;             //!< シートのテクスチャオブジェクトへのポインタ
126 
127     //! コンストラクタです。
128                 Glyph();
129 };
130 
131 //---------------------------------------------------------------------------
132 //! @brief        フォント管理を行うクラスの基底クラスです。
133 //---------------------------------------------------------------------------
134 class Font
135 {
136 public:
137     /* ------------------------------------------------------------------------
138 139        ------------------------------------------------------------------------ */
140     enum Type
141     {
142         TYPE_NULL,          //
143         TYPE_ROM,           // RomFont
144         TYPE_RESOURCE,      // ResFont
145         TYPE_PAIR           // PairFont
146     };
147 
148 
149     /* ------------------------------------------------------------------------
150             定数
151        ------------------------------------------------------------------------ */
152     // 不正な文字コード
153     static const CharCode   INVALID_CHARACTER_CODE = INVALID_CHAR_CODE;
154 
155 
156     /* ------------------------------------------------------------------------
157             関数
158        ------------------------------------------------------------------------ */
159 
160     //! @name コンストラクタ/デストラクタ
161     //@{
162 
163     //! コンストラクタです。
Font()164                             Font()  {}
165 
166     //! デストラクタです。
167     virtual                 ~Font();
168 
169     //@}
170 
171 
172     //! @name フォント情報の取得
173     //@{
174 
175     //! @brief      フォントの幅を取得します。
176     //!
177     //! @return     ピクセル単位でのフォントの幅を返します。
178     //!
179     virtual int             GetWidth() const = 0;
180 
181     //! @brief      フォントの高さを取得します。
182     //!
183     //! @return     ピクセル単位でのフォントの高さを返します。
184     //!
185     virtual int             GetHeight() const = 0;
186 
187     //! @brief      フォントのアセントを取得します。
188     //!
189     //! @return     ピクセル単位でのフォントのアセントを返します。
190     //!
191     virtual int             GetAscent() const = 0;
192 
193     //! @brief      フォントのディセントを取得します。
194     //!
195     //! @return     ピクセル単位でのフォントのディセントを返します。
196     //!
197     virtual int             GetDescent() const = 0;
198 
199     //! @brief      フォントに含まれる最大の文字幅を取得します。
200     //!
201     //! @return     フォントに含まれる最大の文字幅をピクセル単位で返します。
202     //!
203     virtual int             GetMaxCharWidth() const = 0;
204 
205     //! @brief      フォントのタイプを取得します。
206     //!
207     //! @return     フォントのタイプを返します。
208     //!
209     virtual Type            GetType() const = 0;
210 
211     //! @brief      フォントのテクスチャフォーマットを取得します。
212     //!
213     //! @return     グリフデータのテクスチャフォーマットを返します。
214     //!
215     virtual TexFmt          GetTextureFormat() const = 0;
216 
217     //! @brief      フォントが持つ改行幅を取得します。
218     //!
219     //! @return     フォントが持つ改行幅を返します。
220     //!
221     virtual int             GetLineFeed() const = 0;
222 
223     //! @brief      フォントのデフォルト文字幅情報を取得します。
224     //!
225     //! @return     フォントのデフォルト文字幅情報を返します。
226     //!
227     virtual const CharWidths
228                             GetDefaultCharWidths() const = 0;
229 
230     //@}
231 
232 
233     //! @name フォント情報の設定
234     //@{
235 
236     //! @brief      フォントがもつ改行幅を設定します。
237     //!
238     //! @param[in]  linefeed  新しい改行幅。
239     //!
240     virtual void            SetLineFeed(int linefeed) = 0;
241 
242     //! @brief      フォントのデフォルト文字幅情報を設定します。
243     //!
244     //! @param[in]  widths  新しいデフォルトと文字幅情報。
245     //!
246     virtual void            SetDefaultCharWidths(
247                                 const CharWidths& widths
248                             ) = 0;
249 
250     //! @brief      フォントの代替文字を変更します。
251     //!
252     //! @param[in]  c  新しい代替文字の文字コード。
253     //!
254     //! @return     代替文字の変更に成功したら true 、失敗したら false を返します。@n
255     //!             フォント内に文字コード c に対応するグリフが存在しない場合に失敗します。
256     //!
257     virtual bool            SetAlternateChar(CharCode c) = 0;
258 
259     //@}
260 
261 
262     //! @name 文字情報の取得
263     //@{
264 
265     //! @brief      文字の文字幅を取得します。
266     //!
267     //! @param[in]  c  幅を求める文字の文字コード。
268     //!
269     //! @return     ピクセル単位での文字幅を返します。
270     //!
271     virtual int             GetCharWidth(CharCode c) const = 0;
272 
273     //! @brief      文字の文字幅情報を取得します。
274     //!
275     //! @param[in]  c  文字幅情報を取得する文字の文字コード。
276     //!
277     //! @return         文字幅情報を返します。
278     //!
279     virtual const CharWidths
280                             GetCharWidths(CharCode c) const = 0;
281 
282     //! @brief      グリフデータを取得します。
283     //!
284     //! @param[out] pGlyph  グリフデータを受け取るバッファへのポインタ
285     //! @param[in]  c       グリフデータを取得する文字の文字コード
286     //!
287     virtual void            GetGlyph(
288                                 Glyph*      pGlyph,
289                                 CharCode    c
290                             ) const = 0;
291 
292     //! @brief      グリフデータの有無を取得します。
293     //!
294     //! @param[in]  c  グリフデータの有無を取得する文字の文字コード
295     //!
296     //! @return     グリフデータが存在する場合は true 、存在しない場合は false を返します。
297     //!
298     virtual bool            HasGlyph(
299                                 CharCode    c
300                             ) const = 0;
301 
302     //@}
303 
304 
305     //! @name 文字列エンコーディング
306     //@{
307 
308     //! @brief      フォントが対応している文字コードを取得します。
309     //!
310     //! @return     フォントが対応している文字コードを返します。
311     //!
312     virtual CharacterCode   GetCharacterCode() const = 0;
313 
314     //! @brief      フォントが対応している文字コード形式の文字列を解釈する
315     //!             CharStrmReader を取得します。
316     //!
317     //! @param[in]  dummy CharStrmReaderを取得するCharWriterが扱う文字型。
318     //!             引数の値そのものは使用しません。
319     //!
320     //! @return     フォントが対応している文字コード形式の
321     //!             文字列を解釈する CharStrmReader を返します。
322     //!
323     const CharStrmReader    GetCharStrmReader(char dummy) const;
324 
325     //! @brief      フォントが対応している文字コード形式の文字列を解釈する
326     //!             CharStrmReader を取得します。
327     //!
328     //! @param[in]  dummy CharStrmReaderを取得するCharWriterが扱う文字型。
329     //!             引数の値そのものは使用しません。
330     //!
331     //! @return     フォントが対応している文字コード形式の
332     //!             文字列を解釈する CharStrmReader を返します。
333     //!
334     const CharStrmReader    GetCharStrmReader(wchar_t dummy) const;
335 
336     //@}
337 
338 
339     //! @name シート情報の取得
340     //@{
341 
342     //! @brief      ベースライン位置を取得します。
343     //!
344     //! @return     セルの上端からベースラインまでのピクセル数を返します。
345     //!
346     virtual int             GetBaselinePos() const = 0;
347 
348     //! セルの高さを取得します。
349 
350     //! @brief      セルの高さを取得します。
351     //!
352     //! @return     ピクセル単位でのセルの高さを返します。
353     //!
354     virtual int             GetCellHeight() const = 0;
355 
356     //! @brief      セルの幅を取得します。
357     //!
358     //! @return     ピクセル単位でのセルの幅を返します。
359     //!
360     virtual int             GetCellWidth() const = 0;
361 
362     //@}
363 
364     //! @name テクスチャ補間
365     //@{
366 
367     //! @brief      文字描画時にテクスチャの線形補間を行うかどうかを指定します。
368     //!
369     //! @param[in]  atSmall 文字がオリジナルサイズより小さく表示される場合に線形補間を
370     //!                     行うのであれば true を指定します。
371     //! @param[in]  atLarge 文字がオリジナルサイズより大きく表示される場合に線形補間を
372     //!                     行うのであれば true を指定します。
373     //!
374     virtual void            EnableLinearFilter(
375                                 bool    atSmall,
376                                 bool    atLarge
377                             ) = 0;
378 
379     //! @brief      文字が小さく表示される場合に線形補間が行われるかを取得します。
380     //!
381     //! @return     文字がオリジナルサイズより小さく表示される場合に線形補間が行われるのであれば
382     //!             true を、行われないのであれば false を返します。
383     //!
384     virtual bool            IsLinearFilterEnableAtSmall() const = 0;
385 
386     //! @brief      文字が大きく表示される場合に線形補間が行われるかを取得します。
387     //!
388     //! @return     文字がオリジナルサイズより大きく表示される場合に線形補間が行われるのであれば
389     //!             true を、行われないのであれば false を返します。
390     //!
391     virtual bool            IsLinearFilterEnableAtLarge() const = 0;
392 
393     //! @brief      テクスチャのラップ、フィルタ設定値を取得します。
394     //!
395     //! @return     テクスチャのラップ、フィルタ設定値を返します。
396     //!
397     virtual u32             GetTextureWrapFilterValue() const = 0;
398     //@}
399 };
400 
401 namespace internal {
402 
403 inline
404 u32
GetWrapFilter()405 TextureObject::GetWrapFilter() const
406 {
407     return m_pFont->GetTextureWrapFilterValue();
408 }
409 
410 void                    LoadTexture(
411                             u16         texWidth,
412                             u16         texHeight,
413                             TexFmt      texFormat,
414                             const void* pImage,
415                             bool        isSmallLinearFilter,
416                             bool        isLargeLinearFilter);
417 
418 }   // namespace internal
419 
420 }   // namespace font
421 }   // namespace nn
422 
423 #endif //  NN_FONT_FONT_FONT_H_
424