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