/*---------------------------------------------------------------------------* Project: NintendoWare File: lyt_TextBox.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_LYT_TEXTBOX_H_ #define NW_LYT_TEXTBOX_H_ #include #include #include #include #include namespace nw { namespace font { class Font; template class TagProcessorBase; template class TextWriterBase; } // namespace nw::font namespace lyt { class DrawInfo; struct ResBlockSet; //--------------------------------------------------------------------------- //! :category 描画 //! //! @brief テキストの表示を行うペインです。 //! //! @since 2009/09/18 初版。 //--------------------------------------------------------------------------- class TextBox : public Pane { typedef Pane Base; public: //! 実行時型情報です。 NW_UT_RUNTIME_TYPEINFO; //! TextBox が使用するタグプロセッサの定義です。 typedef font::TagProcessorBase TagProcessor; //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! @brief コンストラクタです。 //! //! @details //! 文字列用バッファを確保してオブジェクトを生成します。 //! allocStrLen に 0 を指定した場合は文字列用バッファを確保しません。 //! //! @param allocStrLen 確保する文字列用バッファの文字数です。 //! //! @since 2009/09/18 初版。 //! explicit TextBox(u16 allocStrLen = 0); //! @brief コンストラクタです。 //! //! @details //! str を初期の文字列として設定します。 //! //! pFont で指定したフォントを描画用のフォントとして設定します。 //! //! @param allocStrLen 確保する文字列用バッファの文字数です。 //! @param str テキスト文字列です。 //! @param pFont フォントへのポインタです。 //! //! @since 2009/09/18 初版。 //! TextBox( u16 allocStrLen, const wchar_t* str, const font::Font* pFont); //! @brief コンストラクタです。 //! //! @details //! 文字列用バッファを確保してオブジェクトを生成します。 //! allocStrLen に 0 を指定した場合は文字列用バッファを確保しません。 //! //! str を初期の文字列として設定します。 //! 文字列の長さは必ず strLen で指定した値になります。終端文字(0000h)を判断しません。 //! //! pFont で指定したフォントを描画用のフォントとして設定します。 //! //! @param allocStrLen 確保する文字列用バッファの文字数です。 //! @param str テキスト文字列です。 //! @param strLen テキスト文字列長です。 //! @param pFont フォントへのポインタです。 //! //! @since 2009/09/18 初版。 //! TextBox( u16 allocStrLen, const wchar_t* str, u16 strLen, const font::Font* pFont); //! @brief コンストラクタです。 //! //! @details //! リソースからオブジェクトを生成します。 //! //! @param pBlock リソースへのポインタです。 //! @param resBlockSet ResBlockSet への参照です。 //! //! @since 2009/09/18 初版。 //! TextBox( const res::TextBox* pBlock, const ResBlockSet& resBlockSet); //! @brief デストラクタです。 //! //! @details //! 設定されているフォントオブジェクトは破棄しません。 //! //! @date 2010/01/26 フォントは破棄しない仕様に変更しました。 //! @since 2009/09/18 初版。 //! virtual ~TextBox(); //@} //---------------------------------------- //! @name 文字列操作 //@{ //! @brief 格納している文字列を取得します。 //! //! @return //! 格納している文字列の先頭アドレスを返します。 //! 文字列用バッファが確保されていなければ NULL を返します。 //! //! @sa SetString //! @sa GetStringLength //! //! @since 2009/09/18 初版。 //! const wchar_t* GetString() const { return m_TextBuf; } //! @brief 文字列用バッファを取得します。 //! //! @details //! 文字列用バッファを確保するには AllocStringBuffer() を呼び出してください。 //! //! @return //! 文字列用バッファの先頭アドレスを返します。 //! 文字列用バッファが確保されていなければ NULL を返します。 //! //! @sa GetStringBufferLength //! @sa AllocStringBuffer //! //! @since 2009/09/18 初版。 //! const wchar_t* GetStringBuffer() const { return m_TextBuf; } //! @brief 格納している文字列の文字数を取得します。 //! //! @return 格納している文字列の長さ(文字数)を返します。 //! //! @sa SetString //! @sa GetString //! //! @since 2009/09/18 初版。 //! u16 GetStringLength() const { return m_TextLen; } //! @brief 文字列用バッファの格納可能な文字数を取得します。 //! //! @return 文字列用バッファの長さを返します。 //! //! @sa GetStringBuffer //! @sa AllocStringBuffer //! //! @since 2009/09/18 初版。 //! u16 GetStringBufferLength() const; //! @brief 文字列用バッファを確保します。 //! //! @details //! 既に確保しているバッファの長さが minLen で指定した //! 長さより大きい場合は何もしません。 //! //! @param minLen 確保する文字列用バッファの長さ(文字数)です。 //! //! @sa FreeStringBuffer //! //! @date 2010/05/10 引数 isDoubleBuffer を削除しました。 //! @date 2010/02/19 引数 isDoubleBuffer を追加しました。 //! @since 2009/09/18 初版。 //! virtual void AllocStringBuffer(u16 minLen); //! @brief 文字列用バッファを解放します。 //! //! @sa AllocStringBuffer //! //! @since 2009/09/18 初版。 //! virtual void FreeStringBuffer(); //! @brief 文字列バッファに文字列を格納します。 //! //! @details //! 指定した文字列の長さが文字列用バッファの長さを超える場合は、 //! 文字列用バッファの長さを超える分が切り捨てられます。 //! //! @param str 格納する文字列です。 //! @param dstIdx 格納位置です。 //! //! @return 格納した文字列の長さを返します。 //! //! @sa GetString //! @sa GetStringLength //! //! @since 2009/09/18 初版。 //! virtual u16 SetString( const wchar_t* str, u16 dstIdx = 0); //! @brief 文字列バッファに文字列を格納します。 //! //! @details //! 文字列の長さは strLen で指定された値です。終端文字を判断しません。 //! //! 指定した文字列の長さが文字列用バッファの長さを超える場合は、 //! 文字列用バッファの長さを超える分が切り捨てられます。 //! //! @param str 格納する文字列です。 //! @param dstIdx 格納位置です。 //! @param strLen 格納する文字列の長さです。 //! //! @return 格納した文字列の長さを返します。 //! //! @sa GetString //! @sa GetStringLength //! //! @date 2010/04/09 strLen の値が 0 だった場合の記述に誤りがありました。値 0 は終端文字までを意味しません。 //! @since 2009/09/18 初版。 //! virtual u16 SetString( const wchar_t* str, u16 dstIdx, u16 strLen); //@} //---------------------------------------- //! @name 設定/取得 //@{ //! @brief テキストの表示色を取得します。 //! //! @param type 表示色の種類です。 lyt::TextColor を指定します。 //! //! @return 表示色を返します。 //! //! @sa SetTextColor //! @sa lyt::TextColor //! //! @since 2009/09/18 初版。 //! const ut::Color8 GetTextColor(u32 type) const { NW_ASSERT(type < TEXTCOLOR_MAX); return m_TextColors[type]; } //! @brief テキストの表示色を設定します。 //! //! @details //! 指定の表示色を設定します。 //! //! @param type 表示色の種類です。 lyt::TextColor を指定します。 //! @param value 表示色です。 //! //! @sa GetTextColor //! @sa lyt::TextColor //! //! @since 2009/09/18 初版。 //! void SetTextColor(u32 type, ut::Color8 value) { NW_ASSERT(type < TEXTCOLOR_MAX); m_TextColors[type] = value; } //! @brief テキストの表示色を設定します。 //! //! @details //! テキストの表示色の上端と下端を同時に設定します。 //! //! @param top 上端の表示色です。 //! @param bottom 下端の表示色です。 //! //! @sa GetTextColor //! //! @since 2009/09/18 初版。 //! void SetTextColor( ut::Color8 top, ut::Color8 bottom ) { m_TextColors[TEXTCOLOR_TOP ] = top; m_TextColors[TEXTCOLOR_BOTTOM] = bottom; } //! @brief テキストのフォントを取得します。 //! //! @sa SetFont //! //! @date 2010/01/26 フォントは破棄しない仕様に変更しました。 //! @since 2009/09/18 初版。 //! const font::Font* GetFont() const; //! @brief テキストのフォントを設定します。 //! //! @details //! 同時に、フォントサイズを指定されたフォントオブジェクトのサイズに設定します。 //! //! NULL を渡した場合はフォントの設定を解除します。 //! //! @param pFont フォントオブジェクトへのポインタです。 //! //! @sa GetFont //! //! @date 2010/01/26 フォントは破棄しない仕様に変更しました。 //! @since 2009/09/18 初版。 //! void SetFont(const font::Font* pFont); //! @brief テキストのフォントサイズを取得します。 //! //! @return テキストのフォントサイズを返します。 //! //! @sa SetFontSize //! //! @since 2009/09/18 初版。 //! const Size& GetFontSize() const { return m_FontSize; } //! @brief テキストのフォントサイズを設定します。 //! //! @param fontSize フォントサイズです。 //! //! @sa GetFontSize //! //! @since 2009/09/18 初版。 //! void SetFontSize(const Size& fontSize) { if (UpdatePTDirty(!(m_FontSize == fontSize))) { m_FontSize = fontSize; } } //! @brief テキストの行間隔を取得します。 //! //! @return テキストの行間隔を返します。 //! //! @sa SetLineSpace //! //! @since 2009/09/18 初版。 //! f32 GetLineSpace() const { return m_LineSpace; } //! @brief テキストの行間隔を設定します。 //! //! @param space 行間です。 //! //! @sa GetLineSpace //! //! @since 2009/09/18 初版。 //! void SetLineSpace(f32 space) { if (UpdatePTDirty(m_LineSpace != space)) { m_LineSpace = space; } } //! @brief テキストの文字間隔を取得します。 //! //! @return テキストの文字間隔を返します。 //! //! @sa SetCharSpace //! //! @since 2009/09/18 初版。 //! f32 GetCharSpace() const { return m_CharSpace; } //! @brief テキストの文字間隔を設定します。 //! //! @param space 文字間隔です。 //! //! @sa GetCharSpace //! //! @since 2009/09/18 初版。 //! void SetCharSpace(f32 space) { if (UpdatePTDirty(m_CharSpace != space)) { m_CharSpace = space; } } //! @brief テキスト表示基準位置設定の水平位置指定を取得します。 //! //! @return テキスト表示基準位置設定の水平位置指定を返します。 //! //! @sa SetTextPositionH //! @sa GetTextPositionV //! //! @since 2009/09/18 初版。 //! HorizontalPosition GetTextPositionH() const { return internal::GetHorizontalPosition(m_TextPosition); } //! @brief テキスト表示基準位置設定の水平位置指定を設定します。 //! //! @param val テキスト表示基準位置指定です。 //! //! @sa GetTextPositionH //! @sa SetTextPositionV //! //! @since 2009/09/18 初版。 //! void SetTextPositionH(HorizontalPosition val) { if (UpdatePTDirty(GetTextPositionH() != val)) { internal::SetHorizontalPosition(&m_TextPosition, u8(val)); } } //! @brief テキスト表示基準位置設定の垂直位置指定を取得します。 //! //! @return テキスト表示基準位置設定の垂直位置指定を返します。 //! //! @sa SetTextPositionV //! @sa GetTextPositionH //! //! @since 2009/09/18 初版。 //! VerticalPosition GetTextPositionV() const { return internal::GetVerticalPosition(m_TextPosition); } //! @brief テキスト表示基準位置設定の垂直位置指定を設定します。 //! //! @param val テキスト表示基準位置指定です。 //! //! @sa GetTextPositionV //! @sa SetTextPositionH //! //! @since 2009/09/18 初版。 //! void SetTextPositionV(VerticalPosition val) { if (UpdatePTDirty(GetTextPositionV() != val)) { internal::SetVerticalPosition(&m_TextPosition, u8(val)); } } //! @brief 行そろえ指定を取得します。 //! //! @return 行そろえ指定を返します。 //! //! @sa SetTextAlignment //! //! @since 2009/09/18 初版。 //! TextAlignment GetTextAlignment() const { return static_cast(m_Bits.textAlignment); } //! @brief 行そろえ指定を設定します。 //! //! @param val 行そろえの指定です。 //! //! @sa GetTextAlignment //! //! @since 2009/09/18 初版。 //! void SetTextAlignment(TextAlignment val) { if (UpdatePTDirty(GetTextAlignment() != val)) { m_Bits.textAlignment = val; } } //! @brief タグプロセッサを取得します。 //! //! @return //! タグプロセッサを返します。 //! タグプロセッサが設定されていない場合は NULL を返します。 //! //! @sa SetTagProcessor //! //! @since 2009/09/18 初版。 //! TagProcessor* GetTagProcessor() const { return m_pTagProcessor; } //! @brief タグプロセッサを設定します。 //! //! @details //! NULL を渡した場合はタグプロセッサの設定を解除します。 //! //! @param pTagProcessor タグプロセッサへのポインタです。 //! //! @sa GetTagProcessor //! //! @since 2009/09/18 初版。 //! void SetTagProcessor(TagProcessor* pTagProcessor) { if (UpdatePTDirty(m_pTagProcessor != pTagProcessor)) { m_pTagProcessor = pTagProcessor; } } //! @brief テキストの表示色(頂点カラー)を取得します。 //! //! @details //! idx が lyt::VERTEXCOLOR_LT のときは上端の色、 //! idx が lyt::VERTEXCOLOR_LB のときは下端の色を返します。 //! //! idx が lyt::VERTEXCOLOR_RT または lyt::VERTEXCOLOR_RB のときは //! 対応する頂点カラーを返しますが表示には使用されていません。 //! //! @param idx インデックスです。 lyt::VertexColor を指定します。 //! //! @return テキストの表示色を返します。 //! //! @sa SetVtxColor //! @sa GetVtxColorElement //! @sa lyt::VertexColor //! //! @since 2009/09/18 初版。 //! virtual const ut::Color8 GetVtxColor(u32 idx) const; //! @brief テキストの表示色(頂点カラー)を設定します。 //! //! @details //! idx が lyt::VERTEXCOLOR_LT のときは上端の色を、 //! idx が lyt::VERTEXCOLOR_LB のときは下端の色を変更します。 //! //! idx が lyt::VERTEXCOLOR_RT、 lyt::VERTEXCOLOR_RB のときは //! 対応する頂点カラーを変更しますが表示には使用されていません。 //! //! @param idx インデックスです。 lyt::VertexColor を指定します。 //! @param value テキストの表示色です。 //! //! @sa GetVtxColor //! @sa SetVtxColorElement //! @sa lyt::VertexColor //! //! @since 2009/09/18 初版。 //! virtual void SetVtxColor(u32 idx, ut::Color8 value); //! @brief テキストの表示色(頂点カラー)の成分を取得します。 //! //! @details //! idx が lyt::ANIMTARGET_VERTEXCOLOR_LT_* のときは上端の色、 //! idx が lyt::ANIMTARGET_VERTEXCOLOR_LB_* のときは下端の色の各成分を返します。 //! //! idx が lyt::ANIMTARGET_VERTEXCOLOR_RT_*、 lyt::ANIMTARGET_VERTEXCOLOR_RB_* のときは //! 対応する頂点カラーの各成分を返しますが表示には使用されていません。 //! //! @param idx インデックスです。 lyt::AnimTargetPaneColor を指定します。 //! //! @return テキストの表示色の成分を返します。 //! //! @sa SetVtxColorElement //! @sa GetVtxColor //! @sa lyt::AnimTargetPaneColor //! //! @since 2009/09/18 初版。 //! virtual u8 GetVtxColorElement(u32 idx) const; //! @brief テキストの表示色(頂点カラー)の成分を設定します。 //! //! @details //! idx が lyt::ANIMTARGET_VERTEXCOLOR_LT_* のときは上端の色、 //! idx が lyt::ANIMTARGET_VERTEXCOLOR_LB_* のときは下端の色の各成分を変更します。 //! //! idx が lyt::ANIMTARGET_VERTEXCOLOR_RT_*、 lyt::ANIMTARGET_VERTEXCOLOR_RB_* のときは //! 対応する頂点カラーの各成分を変更しますが表示には使用されていません。 //! //! @param idx インデックスです。 lyt::AnimTargetPaneColor を指定します。 //! @param value カラーの成分値です。 //! //! @sa GetVtxColorElement //! @sa SetVtxColor //! @sa lyt::AnimTargetPaneColor //! //! @since 2009/09/18 初版。 //! virtual void SetVtxColorElement(u32 idx, u8 value); #ifdef NW_LYT_DRAWER_ENABLE //! @brief テキストの描画用データを作成します。(Drawer::Draw()関数用) //! //! @details //! テキストの個々の文字に依存する描画データを作成します。 //! 既に作成済みで再生成する必要がない場合は、何も行われません。 //! また、明示的に呼び出さない場合でも Drawer::Draw() を通じて、 //! このペインの MakeUniformData() の中で呼びだされます。 //! //! ※ Drawer::Draw()関数を使用してレイアウトデータを描画する場合に使用します。 //! //! 次の関数を呼び出した場合は再生成が行われます。 //! //! SetFont //! SetFontSize //! SetLineSpace //! SetCharSpace //! SetTextPositionH //! SetTextPositionV //! SetTextAlignment //! SetTagProcessor //! SetString //! //! @param pDrawer Drawerオブジェクトへのポインタです。 //! //! @sa Drawer::Draw //! //! @since 2010/05/20 初版。 //! void UpdateDrawCharData(Drawer* pDrawer) { if (m_TextLen <= 0 || !m_pFont) { return; } UpdateDrawCharDataImpl(pDrawer); } #endif //! @brief テキストが描画される矩形を取得します。 //! //! @return 矩形を返します。 //! //! @since 2009/09/18 初版。 //! const ut::Rect GetTextDrawRect() const; using Base::GetMaterial; //! @brief ペインが持つマテリアルの数を取得します。 //! //! @return マテリアルの数を返します。 //! //! @since 2010/01/26 初版。 //! virtual u8 GetMaterialNum() const; //! @brief ペインのマテリアルを取得します。 //! //! @details //! idx には 0 のみ指定できます。 //! //! @param idx インデックスです。 //! //! @return マテリアルへのポインタを返します。 //! //! @sa SetMaterial //! //! @since 2010/01/26 初版。 //! virtual Material* GetMaterial(u32 idx) const; //! @brief マテリアルを設定します。 //! //! @details //! 現在設定されているマテリアルが TextBox オブジェクトの //! 生成時に同時に生成されたものだった場合には、 //! そのマテリアルは破棄されます。 //! //! @param pMaterial マテリアルへのポインタです。 //! //! @sa GetMaterial //! //! @since 2010/01/26 初版。 //! void SetMaterial(Material* pMaterial); //@} //! @details :private font::DispStringBuffer* GetDispStringBuffer() const { return m_pDispStringBuf; } //! @details :private void GetTextGlobalMtx(nw::math::MTX34* pMtx) const; #ifdef NW_LYT_DRAWER_ENABLE virtual void MakeUniformDataSelf( DrawInfo* pDrawInfo, Drawer* pDrawer ) const; #endif protected: #ifdef NW_LYT_DMPGL_ENABLED virtual void DrawSelf(const DrawInfo& drawInfo); virtual void LoadMtx(const DrawInfo& drawInfo); #endif protected: //! @details :private void SetFontInfo(font::WideTextWriter* pWriter) const; //! @details :private void SetTextPos(font::WideTextWriter* pWriter) const; //! @details :private math::VEC2 AdjustTextPos( const Size& size, bool isCeil ) const; //! @details :private void Init(u16 allocStrLen); //! @details :private void InitMaterial(); //! @details :private u16 SetStringImpl( const wchar_t* str, u16 dstIdx, u32 strLen); //! :private //! @brief 文字の位置・テクスチャが変更になったかどうかの状態を更新します。 bool UpdatePTDirty(bool isChanged) { m_Bits.isPTDirty |= isChanged ? 1: 0; return isChanged; } #ifdef NW_LYT_DRAWER_ENABLE //! :private //! @brief テキストの描画用データを更新します。(Drawer::Draw()用) void UpdateDrawCharDataImpl(Drawer* pDrawer) { if (m_Bits.isPTDirty || (! m_pDispStringBuf->IsGeneratedCommand() && pDrawer)) { SetupDrawCharData(pDrawer); } } #endif #ifdef NW_LYT_DRAWER_ENABLE //! :private //! @brief テキストの描画用データを作成します。(Drawer::Draw()用) void SetupDrawCharData(Drawer* pDrawer); #endif //! @details :private void SetupTextWriter(font::WideTextWriter* pWriter); private: //! @details :private wchar_t* m_TextBuf; //! @details :private ut::Color8 m_TextColors[TEXTCOLOR_MAX]; //! @details :private const font::Font* m_pFont; //! @details :private Size m_FontSize; //! @details :private f32 m_LineSpace; //! @details :private f32 m_CharSpace; //! @details :private TagProcessor* m_pTagProcessor; //! @details :private u16 m_TextBufBytes; //! @details :private u16 m_TextLen; //! @details :private u8 m_TextPosition; //! @details :private struct Bits { u8 textAlignment: 2; u8 isPTDirty : 1; // 位置・テクスチャが変更になったら真 }; //! @details :private Bits m_Bits; //! @details :private Material* m_pMaterial; //! @details :private font::DispStringBuffer* m_pDispStringBuf; }; } // namespace nw::lyt } // namespace nw #endif // NW_LYT_TEXTBOX_H_