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