/*==LICENSE==* CyanWorlds.com Engine - MMOG client, server and tools Copyright (C) 2011 Cyan Worlds, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . You can contact Cyan Worlds, Inc. by email legal@cyan.com or by snail mail at: Cyan Worlds, Inc. 14617 N Newport Hwy Mead, WA 99021 *==LICENSE==*/ ////////////////////////////////////////////////////////////////////////////// // // // plDynamicTextMsg Header // // Message wrapper for commands to plDynamicTextMap. // // // ////////////////////////////////////////////////////////////////////////////// #include "plgDispatch.h" #include "../plMessage/plDynamicTextMsg.h" #include "pyKey.h" #include "plPythonFileMod.h" #include "pyColor.h" #include "pyImage.h" #include "../plGImage/plDynamicTextMap.h" #include "pyDynamicText.h" pyDynamicText::pyDynamicText() { IInit(); } pyDynamicText::pyDynamicText(pyKey& key) { IInit(); fReceivers.Append(key.getKey()); } pyDynamicText::pyDynamicText(plKey key) { IInit(); fReceivers.Append(key); } void pyDynamicText::IInit() { fSenderKey = nil; fNetPropagate = false; fNetForce = false; fWrap = false; fClip = false; } // methods that will be exposed to Python void pyDynamicText::SetSender(pyKey& selfKey) { fSenderKey = selfKey.getKey(); } void pyDynamicText::ClearReceivers() { fReceivers.Reset(); } void pyDynamicText::AddReceiver(pyKey& key) { fReceivers.Append(key.getKey()); } void pyDynamicText::SetNetPropagate(hsBool propagate) { fNetPropagate = propagate; } void pyDynamicText::SetNetForce(hsBool force) { fNetForce = force; } ////////////////////////////////////////////// // internal methods ////////////////////////////////////////////// plDynamicTextMsg* pyDynamicText::ICreateDTMsg() { // must have a receiver! if ( fReceivers.Count() > 0 ) { plDynamicTextMsg* pMsg = TRACKED_NEW plDynamicTextMsg; if ( fSenderKey ) pMsg->SetSender(fSenderKey); if ( fNetPropagate ) pMsg->SetBCastFlag(plMessage::kNetPropagate); if ( fNetForce ) pMsg->SetBCastFlag(plMessage::kNetForce); // add all our receivers to the message receiver list int i; for ( i=0; iAddReceiver(fReceivers[i]); } return pMsg; } else return nil; } ////////////////////////////////////////////// // dynamicText commands ////////////////////////////////////////////// // // Need to determine whether to send over the network (netpropagate) or not // void pyDynamicText::ClearToColor( pyColor& color ) { // create message plDynamicTextMsg* pMsg = ICreateDTMsg(); if ( pMsg ) { pMsg->ClearToColor(color.getColor()); plgDispatch::MsgSend( pMsg ); // whoosh... off it goes } } void pyDynamicText::Flush( void ) { // create message plDynamicTextMsg* pMsg = ICreateDTMsg(); if ( pMsg ) { pMsg->Flush(); plgDispatch::MsgSend( pMsg ); // whoosh... off it goes } } void pyDynamicText::PurgeImage( void ) { // create message plDynamicTextMsg* pMsg = ICreateDTMsg(); if ( pMsg ) { pMsg->PurgeImage(); plgDispatch::MsgSend( pMsg ); // whoosh... off it goes } } void pyDynamicText::SetTextColor( pyColor& color ) { SetTextColor2(color,false); } void pyDynamicText::SetTextColor2( pyColor& color, bool blockRGB ) { // create message plDynamicTextMsg* pMsg = ICreateDTMsg(); if ( pMsg ) { pMsg->SetTextColor(color.getColor(),blockRGB); plgDispatch::MsgSend( pMsg ); // whoosh... off it goes } } void pyDynamicText::SetFont( const char *facename, Int16 size ) { // create message plDynamicTextMsg* pMsg = ICreateDTMsg(); if ( pMsg ) { pMsg->SetFont(facename,size); plgDispatch::MsgSend( pMsg ); // whoosh... off it goes } } void pyDynamicText::FillRect( UInt16 left, UInt16 top, UInt16 right, UInt16 bottom, pyColor& color ) { // create message plDynamicTextMsg* pMsg = ICreateDTMsg(); if ( pMsg ) { pMsg->FillRect(left,top,right,bottom,color.getColor()); plgDispatch::MsgSend( pMsg ); // whoosh... off it goes } } void pyDynamicText::FrameRect( UInt16 left, UInt16 top, UInt16 right, UInt16 bottom, pyColor& color ) { // create message plDynamicTextMsg* pMsg = ICreateDTMsg(); if ( pMsg ) { pMsg->FrameRect(left,top,right,bottom,color.getColor()); plgDispatch::MsgSend( pMsg ); // whoosh... off it goes } } void pyDynamicText::SetClipping( UInt16 clipLeft, UInt16 clipTop, UInt16 clipRight, UInt16 clipBottom) { fClip = true; fClipLeft = clipLeft; fClipTop = clipTop; fClipRight = clipRight; fClipBottom = clipBottom; } void pyDynamicText::UnsetClipping() { fClip = false; } void pyDynamicText::SetWrapping( UInt16 wrapWidth, UInt16 wrapHeight ) { fWrap = true; fWrapWidth = wrapWidth; fWrapHeight = wrapHeight; } void pyDynamicText::UnsetWrapping() { fWrap = false; } // // Draw text paying attention to Clipping and Wrapping if user wanted it // void pyDynamicText::DrawText( Int16 x, Int16 y, const char *text ) { // create message plDynamicTextMsg* pMsg = ICreateDTMsg(); if ( pMsg ) { // The priority is: // 1) wrap (if you wrap you probably don't need to clip) // 2) clip // 3) just draw if ( fWrap ) pMsg->DrawWrappedString(x,y,fWrapWidth,fWrapHeight,text); else if ( fClip ) pMsg->DrawClippedString(x,y,fClipLeft,fClipTop,fClipRight,fClipBottom,text); else pMsg->DrawString(x,y,text); plgDispatch::MsgSend( pMsg ); // whoosh... off it goes } } void pyDynamicText::DrawTextW( Int16 x, Int16 y, std::wstring text ) { // create message plDynamicTextMsg* pMsg = ICreateDTMsg(); if ( pMsg ) { // The priority is: // 1) wrap (if you wrap you probably don't need to clip) // 2) clip // 3) just draw if ( fWrap ) pMsg->DrawWrappedString(x,y,fWrapWidth,fWrapHeight,text.c_str()); else if ( fClip ) pMsg->DrawClippedString(x,y,fClipLeft,fClipTop,fClipRight,fClipBottom,text.c_str()); else pMsg->DrawString(x,y,text.c_str()); plgDispatch::MsgSend( pMsg ); // whoosh... off it goes } } // // Draw an image on the DynamicMap // void pyDynamicText::DrawImage( UInt16 x, UInt16 y, pyImage& image, hsBool respectAlpha ) { // create message plDynamicTextMsg* pMsg = ICreateDTMsg(); if ( pMsg ) { pMsg->DrawImage( x, y, image.GetKey(), respectAlpha); plgDispatch::MsgSend( pMsg ); // whoosh... off it goes } } // // Draw an image on the DynamicMap // void pyDynamicText::DrawImageClipped( UInt16 x, UInt16 y, pyImage& image, UInt16 cx, UInt16 cy, UInt16 cw, UInt16 ch, hsBool respectAlpha ) { // create message plDynamicTextMsg* pMsg = ICreateDTMsg(); if ( pMsg ) { pMsg->DrawClippedImage( x, y, image.GetKey(), cx, cy, cw, ch, respectAlpha); plgDispatch::MsgSend( pMsg ); // whoosh... off it goes } } UInt16 pyDynamicText::GetWidth( void ) { // We better just pick our first key. Note that the ONLY time we should be getting multiple receivers // is if the export process ends up creating multiple copies of the material. Now, WHY you'd be wanting // to draw all of them is a question for wiser men, but they should all be the same size regardless if( fReceivers.GetCount() == 0 ) return 0; plDynamicTextMap *dtMap = plDynamicTextMap::ConvertNoRef( fReceivers[ 0 ]->ObjectIsLoaded() ); if( dtMap == nil ) return 0; return (UInt16)dtMap->GetWidth(); } UInt16 pyDynamicText::GetHeight( void ) { // We better just pick our first key. Note that the ONLY time we should be getting multiple receivers // is if the export process ends up creating multiple copies of the material. Now, WHY you'd be wanting // to draw all of them is a question for wiser men, but they should all be the same size regardless if( fReceivers.GetCount() == 0 ) return 0; plDynamicTextMap *dtMap = plDynamicTextMap::ConvertNoRef( fReceivers[ 0 ]->ObjectIsLoaded() ); if( dtMap == nil ) return 0; return (UInt16)dtMap->GetHeight(); } void pyDynamicText::CalcTextExtents( std::wstring text, unsigned &width, unsigned &height ) { width = 0; height = 0; if (fReceivers.GetCount() == 0) return; plDynamicTextMap* dtMap = plDynamicTextMap::ConvertNoRef(fReceivers[0]->ObjectIsLoaded()); if (!dtMap) return; width = dtMap->CalcStringWidth(text.c_str(), (UInt16*)&height); } void pyDynamicText::SetJustify(UInt8 justify) { plDynamicTextMsg* pMsg = ICreateDTMsg(); if (pMsg) { pMsg->SetJustify(justify); plgDispatch::MsgSend(pMsg); } } void pyDynamicText::SetLineSpacing(Int16 spacing) { plDynamicTextMsg* pMsg = ICreateDTMsg(); if (pMsg) { pMsg->SetLineSpacing(spacing); plgDispatch::MsgSend(pMsg); } } plKey pyDynamicText::GetImage() { if (fReceivers.GetCount() > 0) return fReceivers[0]; else return nil; }