From: Cyril Deguet Date: Wed, 4 May 2005 20:52:43 +0000 (+0000) Subject: * skin.dtd: added an attribute "resize" in the "Image" element, to define X-Git-Tag: 0.8.2~334 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=f07020df7a1e67b6d063e82839b1fb29c92bc384;p=vlc * skin.dtd: added an attribute "resize" in the "Image" element, to define the method used to resize the image, which can be "mosaic" (the default) or "scale". Note that the previous behaviour was always "scale" before, but mosaic is much much faster, so use scale method only for fun ;) * skins2/*: support of the new mosaic method; playlist resize with this method is significantly faster! --- diff --git a/modules/gui/skins2/controls/ctrl_image.cpp b/modules/gui/skins2/controls/ctrl_image.cpp index 984bf7ec36..6cae9b6f3f 100644 --- a/modules/gui/skins2/controls/ctrl_image.cpp +++ b/modules/gui/skins2/controls/ctrl_image.cpp @@ -32,8 +32,10 @@ CtrlImage::CtrlImage( intf_thread_t *pIntf, const GenericBitmap &rBitmap, - const UString &rHelp, VarBool *pVisible ): - CtrlFlat( pIntf, rHelp, pVisible ), m_rBitmap( rBitmap ) + resize_t resizeMethod, const UString &rHelp, + VarBool *pVisible ): + CtrlFlat( pIntf, rHelp, pVisible ), m_rBitmap( rBitmap ), + m_resizeMethod( resizeMethod ) { OSFactory *pOsFactory = OSFactory::instance( pIntf ); // Create an initial unscaled image in the buffer @@ -79,16 +81,42 @@ void CtrlImage::draw( OSGraphics &rImage, int xDest, int yDest ) { int width = pPos->getWidth(); int height = pPos->getHeight(); - if( width != m_pImage->getWidth() || height != m_pImage->getHeight() ) + + if( m_resizeMethod == kScale ) + { + // Use scaling method + if( width != m_pImage->getWidth() || + height != m_pImage->getHeight() ) + { + OSFactory *pOsFactory = OSFactory::instance( getIntf() ); + // Rescale the image with the actual size of the control + ScaledBitmap bmp( getIntf(), m_rBitmap, width, height ); + SKINS_DELETE( m_pImage ); + m_pImage = pOsFactory->createOSGraphics( width, height ); + m_pImage->drawBitmap( bmp, 0, 0 ); + } + rImage.drawGraphics( *m_pImage, 0, 0, xDest, yDest ); + } + else { - OSFactory *pOsFactory = OSFactory::instance( getIntf() ); - // Rescale the image with the actual size of the control - ScaledBitmap bmp( getIntf(), m_rBitmap, width, height ); - SKINS_DELETE( m_pImage ); - m_pImage = pOsFactory->createOSGraphics( width, height ); - m_pImage->drawBitmap( bmp, 0, 0 ); + // Use mosaic method + while( width > 0 ) + { + int curWidth = __MIN( width, m_pImage->getWidth() ); + height = pPos->getHeight(); + int curYDest = yDest; + while( height > 0 ) + { + int curHeight = __MIN( height, m_pImage->getHeight() ); + rImage.drawGraphics( *m_pImage, 0, 0, xDest, curYDest, + curWidth, curHeight ); + curYDest += curHeight; + height -= m_pImage->getHeight(); + } + xDest += curWidth; + width -= m_pImage->getWidth(); + } } - rImage.drawGraphics( *m_pImage, 0, 0, xDest, yDest ); } } diff --git a/modules/gui/skins2/controls/ctrl_image.hpp b/modules/gui/skins2/controls/ctrl_image.hpp index 8c3c2ad7ba..8595993c2e 100644 --- a/modules/gui/skins2/controls/ctrl_image.hpp +++ b/modules/gui/skins2/controls/ctrl_image.hpp @@ -36,9 +36,17 @@ class OSGraphics; class CtrlImage: public CtrlFlat { public: + /// Resize methods + typedef enum + { + kMosaic, // Repeat the base image in a mosaic + kScale // Scale the base image + } resize_t; + // Create an image with the given bitmap (which is NOT copied) CtrlImage( intf_thread_t *pIntf, const GenericBitmap &rBitmap, - const UString &rHelp, VarBool *pVisible ); + resize_t resizeMethod, const UString &rHelp, + VarBool *pVisible ); virtual ~CtrlImage(); /// Handle an event on the control @@ -58,6 +66,8 @@ class CtrlImage: public CtrlFlat const GenericBitmap &m_rBitmap; /// Buffer to stored the rendered bitmap OSGraphics *m_pImage; + /// Resize method + resize_t m_resizeMethod; }; #endif diff --git a/modules/gui/skins2/parser/builder.cpp b/modules/gui/skins2/parser/builder.cpp index ba1331af8a..12b044816a 100644 --- a/modules/gui/skins2/parser/builder.cpp +++ b/modules/gui/skins2/parser/builder.cpp @@ -389,7 +389,9 @@ void Builder::addImage( const BuilderData::Image &rData ) Interpreter *pInterpreter = Interpreter::instance( getIntf() ); VarBool *pVisible = pInterpreter->getVarBool( rData.m_visible, m_pTheme ); - CtrlImage *pImage = new CtrlImage( getIntf(), *pBmp, + CtrlImage::resize_t resizeMethod = + (rData.m_resize == "scale" ? CtrlImage::kScale : CtrlImage::kMosaic); + CtrlImage *pImage = new CtrlImage( getIntf(), *pBmp, resizeMethod, UString( getIntf(), rData.m_help.c_str() ), pVisible ); // Compute the position of the control diff --git a/modules/gui/skins2/parser/builder_data.def b/modules/gui/skins2/parser/builder_data.def index f14075b18d..2b1c30f7ce 100644 --- a/modules/gui/skins2/parser/builder_data.def +++ b/modules/gui/skins2/parser/builder_data.def @@ -7,7 +7,7 @@ Layout id:string width:int height:int minWidth:int maxWidth:int minHeight:int ma Anchor xPos:int yPos:int range:int priority:int points:string layoutId:string Button id:string xPos:int yPos:int leftTop:string rightBottom:string visible:string upId:string downId:string overId:string actionId:string tooltip:string help:string layer:int windowId:string layoutId:string Checkbox id:string xPos:int yPos:int leftTop:string rightBottom:string visible:string up1Id:string down1Id:string over1Id:string up2Id:string down2Id:string over2Id:string state:string action1:string action2:string tooltip1:string tooltip2:string help:string layer:int windowId:string layoutId:string -Image id:string xPos:int yPos:int leftTop:string rightBottom:string visible:string bmpId:string actionId:string help:string layer:int windowId:string layoutId:string +Image id:string xPos:int yPos:int leftTop:string rightBottom:string visible:string bmpId:string actionId:string resize:string help:string layer:int windowId:string layoutId:string Text id:string xPos:int yPos:int visible:string fontId:string text:string width:int leftTop:string rightBottom:string color:uint32_t help:string layer:int windowId:string layoutId:string RadialSlider id:string visible:string xPos:int yPos:int leftTop:string rightBottom:string sequence:string nbImages:int minAngle:float maxAngle:float value:string tooltip:string help:string layer:int windowId:string layoutId:string Slider id:string visible:string xPos:int yPos:int leftTop:string rightBottom:string upId:string downId:string overId:string points:string thickness:int value:string tooltip:string help:string layer:int windowId:string layoutId:string diff --git a/modules/gui/skins2/parser/builder_data.hpp b/modules/gui/skins2/parser/builder_data.hpp index 9f3022a31a..9e9bb74e46 100644 --- a/modules/gui/skins2/parser/builder_data.hpp +++ b/modules/gui/skins2/parser/builder_data.hpp @@ -201,8 +201,8 @@ m_id( id ), m_xPos( xPos ), m_yPos( yPos ), m_leftTop( leftTop ), m_rightBottom( /// Type definition struct Image { - Image( const string & id, int xPos, int yPos, const string & leftTop, const string & rightBottom, const string & visible, const string & bmpId, const string & actionId, const string & help, int layer, const string & windowId, const string & layoutId ): -m_id( id ), m_xPos( xPos ), m_yPos( yPos ), m_leftTop( leftTop ), m_rightBottom( rightBottom ), m_visible( visible ), m_bmpId( bmpId ), m_actionId( actionId ), m_help( help ), m_layer( layer ), m_windowId( windowId ), m_layoutId( layoutId ) {} + Image( const string & id, int xPos, int yPos, const string & leftTop, const string & rightBottom, const string & visible, const string & bmpId, const string & actionId, const string & resize, const string & help, int layer, const string & windowId, const string & layoutId ): +m_id( id ), m_xPos( xPos ), m_yPos( yPos ), m_leftTop( leftTop ), m_rightBottom( rightBottom ), m_visible( visible ), m_bmpId( bmpId ), m_actionId( actionId ), m_resize( resize ), m_help( help ), m_layer( layer ), m_windowId( windowId ), m_layoutId( layoutId ) {} const string m_id; int m_xPos; @@ -212,6 +212,7 @@ m_id( id ), m_xPos( xPos ), m_yPos( yPos ), m_leftTop( leftTop ), m_rightBottom( const string m_visible; const string m_bmpId; const string m_actionId; + const string m_resize; const string m_help; int m_layer; const string m_windowId; diff --git a/modules/gui/skins2/parser/skin_parser.cpp b/modules/gui/skins2/parser/skin_parser.cpp index 7f5a7e8c1c..987c678183 100644 --- a/modules/gui/skins2/parser/skin_parser.cpp +++ b/modules/gui/skins2/parser/skin_parser.cpp @@ -173,13 +173,14 @@ void SkinParser::handleBeginElement( const string &rName, AttrList_t &attr ) CheckDefault( "lefttop", "lefttop" ); CheckDefault( "rightbottom", "lefttop" ); CheckDefault( "action", "none" ); + CheckDefault( "resize", "mosaic" ); CheckDefault( "help", "" ); const BuilderData::Image imageData( uniqueId( attr["id"] ), atoi( attr["x"] ) + m_xOffset, atoi( attr["y"] ) + m_yOffset, attr["lefttop"], attr["rightbottom"], attr["visible"], - attr["image"], attr["action"], attr["help"], m_curLayer, - m_curWindowId, m_curLayoutId ); + attr["image"], attr["action"], attr["resize"], attr["help"], + m_curLayer, m_curWindowId, m_curLayoutId ); m_curLayer++; m_data.m_listImage.push_back( imageData ); } diff --git a/share/skins2/skin.dtd b/share/skins2/skin.dtd index 3c8bbf4c94..251d3cc81b 100644 --- a/share/skins2/skin.dtd +++ b/share/skins2/skin.dtd @@ -85,6 +85,7 @@ rightbottom CDATA "lefttop" image CDATA #REQUIRED action CDATA "none" + resize CDATA "mosaic" help CDATA "" >