/* * Copyright (C) =USTC= Fu Li * * Author : Fu Li * Create : 2003-3-30 * Home : http://www.crazy-bit.com/ * Mail : crazybit@263.net * History : */ #ifndef __PCL_OBJECT_LAYER__2003_03_30__H__ #define __PCL_OBJECT_LAYER__2003_03_30__H__ #include "ObjImage.h" class FCMemoLayer ; class FCMemoTextLayer ; class FCObjLayer ; // image layer class FCObjTextLayer ; // text image layer //============================================================================= /// Layer object's property. struct PACK_Layer { /// layer's visible flag. int m_bLayerVisible ; /// layer's limit flag. int m_bLayerLimited ; /// layer's transparency percentage. int m_nAlphaPercent ; }; /// Layer's memo. class FCMemoLayer : public PACK_Layer { public: enum MEMO_TYPE { MEMO_LAYER_NORMAL, MEMO_LAYER_TEXT, }; virtual MEMO_TYPE GetMemoType() const {return MEMO_LAYER_NORMAL;} }; /** * Layer object. * layer's bpp must be 32bit. */ class FCObjLayer : public FCObjImage { public: /// Constructor FCObjLayer() { m_LayerProp.m_bLayerVisible = true ; m_LayerProp.m_bLayerLimited = false ; m_LayerProp.m_nAlphaPercent = 100 ; } FCObjLayer& operator= (const FCObjLayer& layer) { FCObjImage::operator= (layer) ; m_LayerProp = layer.m_LayerProp ; return *this ; } virtual int Serialize (bool bSave, BYTE* pSave) { const BYTE * pStartBak = pSave ; bSave ? ( *(PACK_Layer*)pSave = m_LayerProp ) : ( m_LayerProp = *(PACK_Layer*)pSave ) ; pSave += sizeof(PACK_Layer); pSave += FCObjImage::Serialize (bSave, pSave) ; return pSave - pStartBak ; } /** * @name memo exchange. */ //@{ /// Create a FCMemoLayer object. you must use delete to delete it. high recommend using std::auto_ptr to wrap it. virtual FCMemoLayer* CreateMemoObj() const { FCMemoLayer * pMemo = new FCMemoLayer ; *(PACK_Layer*)pMemo = m_LayerProp ; return pMemo ; } /// Set layer's property. virtual void SetMemoObj (const FCMemoLayer* pMemo) { if (pMemo) m_LayerProp = *(const PACK_Layer*)pMemo ; } //@} /** Is layer visible. */ bool IsLayerVisible() const {return m_LayerProp.m_bLayerVisible ? true : false;} /** Layer's transparent percent. [0..100] */ int GetLayerTransparent() const {return m_LayerProp.m_nAlphaPercent;} /** Is layer limited. */ bool IsLayerLimited() const {return m_LayerProp.m_bLayerLimited ? true : false;} /// Get/Set layer's name. std::string& LayerName() {return m_strLayerName;} protected: PACK_Layer m_LayerProp ; std::string m_strLayerName ; }; //============================================================================= /// Text layer object's property. struct PACK_TextLayer { std::string m_strText ; std::string m_strFace ; int m_nFontSize ; RGBQUAD m_crFont ; bool m_bAntiAliased ; bool m_bBold ; bool m_bItalic ; bool m_bAddShadow ; // 是否加阴影 SHADOWDATA m_ShadowData ; // 阴影参数 bool m_bToolEdited ; // 被别的tool编辑过的图层不能通过create创建了,蜕变为普通图层 }; /// Text layer's memo. class FCMemoTextLayer : public FCMemoLayer, public PACK_TextLayer { virtual MEMO_TYPE GetMemoType() const {return MEMO_LAYER_TEXT;} }; //----------------------------------------------------------------------------- /** * Text layer object. * the layer initialized to limited when constructor. */ class FCObjTextLayer : public FCObjLayer { public: /// Constructor FCObjTextLayer() { m_TxtLayerProp.m_bBold = false ; m_TxtLayerProp.m_bItalic = false ; m_TxtLayerProp.m_bAntiAliased = true ; m_TxtLayerProp.m_nFontSize = 24 ; m_TxtLayerProp.m_crFont = FCColor::crWhite() ; m_TxtLayerProp.m_bAddShadow = false ; m_LayerProp.m_bLayerLimited = true ; // init text-layer is limited m_TxtLayerProp.m_bToolEdited = false ; m_sizeToOldPos.cx = m_sizeToOldPos.cy = 0 ; } FCObjTextLayer& operator= (const FCObjTextLayer& layer) { FCObjLayer::operator= (layer) ; m_TxtLayerProp = layer.m_TxtLayerProp ; m_sizeToOldPos = layer.m_sizeToOldPos ; return *this ; } virtual FCMemoLayer* CreateMemoObj() const { FCMemoTextLayer * pMemo = new FCMemoTextLayer ; // set basic property std::auto_ptr pLM (FCObjLayer::CreateMemoObj()) ; *static_cast(pMemo) = *pLM ; *static_cast(pMemo) = m_TxtLayerProp ; return pMemo ; } virtual void SetMemoObj (const FCMemoLayer* pMemo) { FCObjLayer::SetMemoObj (pMemo) ; if (pMemo->GetMemoType() != FCMemoLayer::MEMO_LAYER_TEXT) { assert(false) ; return ; } const FCMemoTextLayer * pTxt = (const FCMemoTextLayer*)pMemo ; m_TxtLayerProp = *(const PACK_TextLayer*)pTxt ; } bool& ToolEditFlag() {return m_TxtLayerProp.m_bToolEdited;} private: PACK_TextLayer m_TxtLayerProp ; SIZE m_sizeToOldPos ; friend class FCWin32 ; }; //============================================================================= // inline Implement //============================================================================= #endif