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