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