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