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