/*---------------------------------------------------------------------------* Project: NintendoWare File: font_Font.h Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo and/or its licensed developers and are protected by national and international copyright laws. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. The content herein is highly confidential and should be handled accordingly. $Revision: 31311 $ *---------------------------------------------------------------------------*/ #ifndef NW_FONT_FONT_H_ #define NW_FONT_FONT_H_ #if defined(_MSC_VER) && _MSC_VER >= 1500 #pragma once #endif #include #include #include #include #define NW_FONT_MIN_ASSERT(exp, min) NN_ASSERT((exp) >= (min)) #define NW_FONT_MINMAX_ASSERT(exp, min, max) NN_ASSERT((exp) >= (min) && (exp) <= (max)) namespace nw { namespace font { class Font; //---- テクスチャフォーマット型 typedef u16 TexFmt; namespace internal { union TextureSize { struct { u16 height; //!< 高さ u16 width; //!< 幅 }; u32 size; //!< サイズ }; class TextureObject { public: TextureObject(); void Set( u32 name, const Font* pFont, const void* pImage, TexFmt format, u16 width, u16 height); void Reset() { Set(0, NULL, NULL, FONT_SHEET_FORMAT_A8, 0, 0); } u32 GetName() const { return m_Name; } void SetName(u32 texName) { m_Name = texName; } const Font* GetFont() const { return m_pFont; } uptr GetImage() const { return m_pImage; } u8 GetFormat() const { return m_Format; } const TextureSize GetSize() const { return m_Size; } u32 GetWrapFilter() const; private: u32 m_Name; //!< テクスチャ名 const Font* m_pFont; //!< フォントへのポインタ uptr m_pImage; //!< イメージへのポインタ TextureSize m_Size; //!< サイズ u8 m_Format; //!< フォーマット }; } // namespace internal //---- 文字コード型 typedef u16 CharCode; //--------------------------------------------------------------------------- //! @brief 文字グリフの情報を保持する構造体です。 //--------------------------------------------------------------------------- struct Glyph { const void* pTexture; //!< シートへのポインタ CharWidths widths; //!< 文字幅情報 u8 height; //!< セルの高さ u16 texWidth; //!< シートの幅 u16 texHeight; //!< シートの高さ u16 cellX; //!< シート内でのセル左上隅のx座標 u16 cellY; //!< シート内でのセル左上隅のy座標 TexFmt texFormat; //!< シートのフォーマット u8 isSheetUpdated; //!< シートの内容が更新されている場合は真 const internal::TextureObject* pTextureObject; //!< シートのテクスチャオブジェクトへのポインタ //! コンストラクタです。 Glyph(); }; //--------------------------------------------------------------------------- //! @brief フォント管理を行うクラスの基底クラスです。 //--------------------------------------------------------------------------- class Font { public: /* ------------------------------------------------------------------------ 型 ------------------------------------------------------------------------ */ enum Type { TYPE_NULL, // TYPE_ROM, // RomFont TYPE_RESOURCE, // ResFont TYPE_PAIR // PairFont }; /* ------------------------------------------------------------------------ 定数 ------------------------------------------------------------------------ */ // 不正な文字コード static const CharCode INVALID_CHARACTER_CODE = INVALID_CHAR_CODE; /* ------------------------------------------------------------------------ 関数 ------------------------------------------------------------------------ */ //! @name コンストラクタ/デストラクタ //@{ //! コンストラクタです。 Font() {} //! デストラクタです。 virtual ~Font(); //@} //! @name フォント情報の取得 //@{ //! @brief フォントの幅を取得します。 //! //! @return ピクセル単位でのフォントの幅を返します。 //! virtual int GetWidth() const = 0; //! @brief フォントの高さを取得します。 //! //! @return ピクセル単位でのフォントの高さを返します。 //! virtual int GetHeight() const = 0; //! @brief フォントのアセントを取得します。 //! //! @return ピクセル単位でのフォントのアセントを返します。 //! virtual int GetAscent() const = 0; //! @brief フォントのディセントを取得します。 //! //! @return ピクセル単位でのフォントのディセントを返します。 //! virtual int GetDescent() const = 0; //! @brief フォントに含まれる最大の文字幅を取得します。 //! //! @return フォントに含まれる最大の文字幅をピクセル単位で返します。 //! virtual int GetMaxCharWidth() const = 0; //! @brief フォントのタイプを取得します。 //! //! @return フォントのタイプを返します。 //! virtual Type GetType() const = 0; //! @brief フォントのテクスチャフォーマットを取得します。 //! //! @return グリフデータのテクスチャフォーマットを返します。 //! virtual TexFmt GetTextureFormat() const = 0; //! @brief フォントが持つ改行幅を取得します。 //! //! @return フォントが持つ改行幅を返します。 //! virtual int GetLineFeed() const = 0; //! @brief フォントのデフォルト文字幅情報を取得します。 //! //! @return フォントのデフォルト文字幅情報を返します。 //! virtual const CharWidths GetDefaultCharWidths() const = 0; //@} //! @name フォント情報の設定 //@{ //! @brief フォントがもつ改行幅を設定します。 //! //! @param[in] linefeed 新しい改行幅。 //! virtual void SetLineFeed(int linefeed) = 0; //! @brief フォントのデフォルト文字幅情報を設定します。 //! //! @param[in] widths 新しいデフォルト文字幅情報。 //! virtual void SetDefaultCharWidths( const CharWidths& widths ) = 0; //! @brief フォントの代替文字を変更します。 //! //! @param[in] c 新しい代替文字の文字コード。 //! //! @return 代替文字の変更に成功したら true 、失敗したら false を返します。@n //! フォント内に文字コード c に対応するグリフが存在しない場合に失敗します。 //! virtual bool SetAlternateChar(CharCode c) = 0; //@} //! @name 文字情報の取得 //@{ //! @brief 文字の文字幅を取得します。 //! //! @param[in] c 幅を求める文字の文字コード。 //! //! @return ピクセル単位での文字幅を返します。 //! virtual int GetCharWidth(CharCode c) const = 0; //! @brief 文字の文字幅情報を取得します。 //! //! @param[in] c 文字幅情報を取得する文字の文字コード。 //! //! @return 文字幅情報を返します。 //! virtual const CharWidths GetCharWidths(CharCode c) const = 0; //! @brief グリフデータを取得します。 //! //! @param[out] pGlyph グリフデータを受け取るバッファへのポインタ //! @param[in] c グリフデータを取得する文字の文字コード //! virtual void GetGlyph( Glyph* pGlyph, CharCode c ) const = 0; //! @brief グリフデータの有無を取得します。 //! //! @param[in] c グリフデータの有無を取得する文字の文字コード //! //! @return グリフデータが存在する場合は true 、存在しない場合は false を返します。 //! virtual bool HasGlyph( CharCode c ) const = 0; //@} //! @name 文字列エンコーディング //@{ //! @brief フォントが対応している文字コードを取得します。 //! //! @return フォントが対応している文字コードを返します。 //! virtual CharacterCode GetCharacterCode() const = 0; //! @brief フォントが対応している文字コード形式の文字列を解釈する //! CharStrmReader を取得します。 //! //! @param[in] dummy CharStrmReaderを取得するCharWriterが扱う文字型。 //! 引数の値そのものは使用しません。 //! //! @return フォントが対応している文字コード形式の //! 文字列を解釈する CharStrmReader を返します。 //! const CharStrmReader GetCharStrmReader(char dummy) const; //! @brief フォントが対応している文字コード形式の文字列を解釈する //! CharStrmReader を取得します。 //! //! @param[in] dummy CharStrmReaderを取得するCharWriterが扱う文字型。 //! 引数の値そのものは使用しません。 //! //! @return フォントが対応している文字コード形式の //! 文字列を解釈する CharStrmReader を返します。 //! const CharStrmReader GetCharStrmReader(wchar_t dummy) const; //@} //! @name シート情報の取得 //@{ //! @brief ベースライン位置を取得します。 //! //! @return セルの上端からベースラインまでのピクセル数を返します。 //! virtual int GetBaselinePos() const = 0; //! @brief セルの高さを取得します。 //! //! @return ピクセル単位でのセルの高さを返します。 //! virtual int GetCellHeight() const = 0; //! @brief セルの幅を取得します。 //! //! @return ピクセル単位でのセルの幅を返します。 //! virtual int GetCellWidth() const = 0; //@} //! @name テクスチャ補間 //@{ //! @brief 文字描画時にテクスチャの線形補間を行うかどうかを指定します。 //! //! @param[in] atSmall 文字がオリジナルサイズより小さく表示される場合に線形補間を //! 行うのであれば true を指定します。 //! @param[in] atLarge 文字がオリジナルサイズより大きく表示される場合に線形補間を //! 行うのであれば true を指定します。 //! virtual void EnableLinearFilter( bool atSmall, bool atLarge ) = 0; //! @brief 文字が小さく表示される場合に線形補間が行われるかを取得します。 //! //! @return 文字がオリジナルサイズより小さく表示される場合に線形補間が行われるのであれば //! true を、行われないのであれば false を返します。 //! virtual bool IsLinearFilterEnableAtSmall() const = 0; //! @brief 文字が大きく表示される場合に線形補間が行われるかを取得します。 //! //! @return 文字がオリジナルサイズより大きく表示される場合に線形補間が行われるのであれば //! true を、行われないのであれば false を返します。 //! virtual bool IsLinearFilterEnableAtLarge() const = 0; //! @brief テクスチャのラップ、フィルタ設定値を取得します。 //! //! @return テクスチャのラップ、フィルタ設定値を返します。 //! virtual u32 GetTextureWrapFilterValue() const = 0; //@} }; namespace internal { inline u32 TextureObject::GetWrapFilter() const { return m_pFont->GetTextureWrapFilterValue(); } void LoadTexture( u16 texWidth, u16 texHeight, TexFmt texFormat, const void* pImage, bool isSmallLinearFilter, bool isLargeLinearFilter); } // namespace internal } // namespace font } // namespace nw #endif // NW_FONT_FONT_H_