]> git.sesse.net Git - vlc/commitdiff
* skin.dtd: added an attribute "resize" in the "Image" element, to define
authorCyril Deguet <asmax@videolan.org>
Wed, 4 May 2005 20:52:43 +0000 (20:52 +0000)
committerCyril Deguet <asmax@videolan.org>
Wed, 4 May 2005 20:52:43 +0000 (20:52 +0000)
  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!

modules/gui/skins2/controls/ctrl_image.cpp
modules/gui/skins2/controls/ctrl_image.hpp
modules/gui/skins2/parser/builder.cpp
modules/gui/skins2/parser/builder_data.def
modules/gui/skins2/parser/builder_data.hpp
modules/gui/skins2/parser/skin_parser.cpp
share/skins2/skin.dtd

index 984bf7ec36a8b5a807b22f4e97f891bd509e31d4..6cae9b6f3f478d241f0e67a5322036a9480d4921 100644 (file)
 
 
 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 );
     }
 }
 
index 8c3c2ad7baa7e811f1d809e63fb49fa813758e30..8595993c2ed01ed99aab033304a96a31b4c24799 100644 (file)
@@ -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
index ba1331af8aee6493c7486571f7e71e2c5c36c3e8..12b044816a77bd0220cb6ca6a85239d86f151d78 100644 (file)
@@ -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
index f14075b18d310341adcb4f43d340e658bd7b6d76..2b1c30f7ce5d3a48504a417e163d19271d0c72e5 100644 (file)
@@ -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
index 9f3022a31adcedc2410ad584f71274f0bb3c109e..9e9bb74e462b6367fc07efa633bbb3116478c517 100644 (file)
@@ -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;
index 7f5a7e8c1c2db1df3c23e4fdab1078ff08d35f9b..987c678183836b562013f154a08014bd09955f9c 100644 (file)
@@ -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 );
     }
index 3c8bbf4c9451bc4c0490ea4c7f79a46d29e7ea54..251d3cc81b40fe388716004ff11577dcc086d3b5 100644 (file)
@@ -85,6 +85,7 @@
         rightbottom CDATA   "lefttop"
         image       CDATA   #REQUIRED
         action      CDATA   "none"
+        resize      CDATA   "mosaic"
         help        CDATA   ""
     >
 <!ELEMENT Button EMPTY>