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