From 1ada3176c1da49d9666ca3a02c669b0773466be5 Mon Sep 17 00:00:00 2001 From: Cyril Deguet Date: Sun, 6 Nov 2005 14:23:16 +0000 Subject: [PATCH] * all: added a new xml element: "SubBitmap". It allows to define several bitmaps in a skin from regions of the same image file. Usage is: --- modules/gui/skins2/parser/builder.cpp | 22 ++++++++++++++++++++++ modules/gui/skins2/parser/builder.hpp | 1 + modules/gui/skins2/parser/builder_data.def | 1 + modules/gui/skins2/parser/builder_data.hpp | 16 ++++++++++++++++ modules/gui/skins2/parser/skin_parser.cpp | 17 ++++++++++++++++- modules/gui/skins2/parser/skin_parser.hpp | 1 + share/skins2/skin.dtd | 10 +++++++++- 7 files changed, 66 insertions(+), 2 deletions(-) diff --git a/modules/gui/skins2/parser/builder.cpp b/modules/gui/skins2/parser/builder.cpp index d2cf34c67d..5099e8a640 100644 --- a/modules/gui/skins2/parser/builder.cpp +++ b/modules/gui/skins2/parser/builder.cpp @@ -90,6 +90,7 @@ Theme *Builder::build() // Create everything from the data in the XML ADD_OBJECTS( Theme ); ADD_OBJECTS( Bitmap ); + ADD_OBJECTS( SubBitmap ); ADD_OBJECTS( BitmapFont ); ADD_OBJECTS( Font ); ADD_OBJECTS( Window ); @@ -149,6 +150,27 @@ void Builder::addBitmap( const BuilderData::Bitmap &rData ) } +void Builder::addSubBitmap( const BuilderData::SubBitmap &rData ) +{ + // Get the parent bitmap + GenericBitmap *pParentBmp = NULL; + GET_BMP( pParentBmp, rData.m_parent ); + if( !pParentBmp ) + { + msg_Err( getIntf(), "unknown bitmap id: %s", rData.m_parent.c_str() ); + return; + } + + // Copy a region of the parent bitmap to the new one + BitmapImpl *pBmp = + new BitmapImpl( getIntf(), rData.m_width, rData.m_height ); + pBmp->drawBitmap( *pParentBmp, rData.m_x, rData.m_y, 0, 0, rData.m_width, + rData.m_height ); + + m_pTheme->m_bitmaps[rData.m_id] = GenericBitmapPtr( pBmp ); +} + + void Builder::addBitmapFont( const BuilderData::BitmapFont &rData ) { GenericBitmap *pBmp = diff --git a/modules/gui/skins2/parser/builder.hpp b/modules/gui/skins2/parser/builder.hpp index 84023fbe79..f041d56ee4 100644 --- a/modules/gui/skins2/parser/builder.hpp +++ b/modules/gui/skins2/parser/builder.hpp @@ -65,6 +65,7 @@ class Builder: public SkinObject void addTheme( const BuilderData::Theme &rData ); void addBitmap( const BuilderData::Bitmap &rData ); + void addSubBitmap( const BuilderData::SubBitmap &rData ); void addBitmapFont( const BuilderData::BitmapFont &rData ); void addFont( const BuilderData::Font &rData ); void addWindow( const BuilderData::Window &rData ); diff --git a/modules/gui/skins2/parser/builder_data.def b/modules/gui/skins2/parser/builder_data.def index 0bc358e233..0c7a7d0cbf 100644 --- a/modules/gui/skins2/parser/builder_data.def +++ b/modules/gui/skins2/parser/builder_data.def @@ -1,5 +1,6 @@ Theme tooltipfont:string magnet:int alpha:uint32_t moveAlpha:uint32_t Bitmap id:string fileName:string alphaColor:uint32_t +SubBitmap id:string parent:string x:int y:int width:int height:int BitmapFont id:string file:string type:string Font id:string fontFile:string size:int Window id:string xPos:int yPos:int visible:bool dragDrop:bool playOnDrop:bool diff --git a/modules/gui/skins2/parser/builder_data.hpp b/modules/gui/skins2/parser/builder_data.hpp index 33b22c863a..04e5bc27c0 100644 --- a/modules/gui/skins2/parser/builder_data.hpp +++ b/modules/gui/skins2/parser/builder_data.hpp @@ -66,6 +66,22 @@ m_id( id ), m_fileName( fileName ), m_alphaColor( alphaColor ) {} /// List list m_listBitmap; + /// Type definition + struct SubBitmap + { + SubBitmap( const string & id, const string & parent, int x, int y, int width, int height ): +m_id( id ), m_parent( parent ), m_x( x ), m_y( y ), m_width( width ), m_height( height ) {} + + const string m_id; + const string m_parent; + int m_x; + int m_y; + int m_width; + int m_height; + }; + /// List + list m_listSubBitmap; + /// Type definition struct BitmapFont { diff --git a/modules/gui/skins2/parser/skin_parser.cpp b/modules/gui/skins2/parser/skin_parser.cpp index 4b510c985a..351d77f5af 100644 --- a/modules/gui/skins2/parser/skin_parser.cpp +++ b/modules/gui/skins2/parser/skin_parser.cpp @@ -64,12 +64,27 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) RequireDefault( "file" ); RequireDefault( "alphacolor" ); - const BuilderData::Bitmap bitmap( uniqueId( attr["id"] ), + m_curBitmapId = uniqueId( attr["id"] ); + const BuilderData::Bitmap bitmap( m_curBitmapId, convertFileName( attr["file"] ), convertColor( attr["alphacolor"] ) ); m_data.m_listBitmap.push_back( bitmap ); } + else if( rName == "SubBitmap" ) + { + RequireDefault( "id" ); + RequireDefault( "x" ); + RequireDefault( "y" ); + RequireDefault( "width" ); + RequireDefault( "height" ); + + const BuilderData::SubBitmap bitmap( uniqueId( attr["id"] ), + m_curBitmapId, atoi( attr["x"] ), atoi( attr["y"] ), + atoi( attr["width"] ), atoi( attr["height"] ) ); + m_data.m_listSubBitmap.push_back( bitmap ); + } + else if( rName == "BitmapFont" ) { RequireDefault( "id" ); diff --git a/modules/gui/skins2/parser/skin_parser.hpp b/modules/gui/skins2/parser/skin_parser.hpp index 957df56b4f..92952c8e35 100644 --- a/modules/gui/skins2/parser/skin_parser.hpp +++ b/modules/gui/skins2/parser/skin_parser.hpp @@ -43,6 +43,7 @@ class SkinParser: public XMLParser /// Container for mapping data from the XML BuilderData m_data; /// Current IDs + string m_curBitmapId; string m_curWindowId; string m_curLayoutId; string m_curListId; diff --git a/share/skins2/skin.dtd b/share/skins2/skin.dtd index ed09bc4dc2..bed5dbf624 100644 --- a/share/skins2/skin.dtd +++ b/share/skins2/skin.dtd @@ -12,12 +12,20 @@ > - + + +