]> git.sesse.net Git - vlc/commitdiff
* skins2/controls/ctrl_image.cpp: Allow resizing to a width of 1 now that the
authorOlivier Teulière <ipkiss@videolan.org>
Wed, 16 Aug 2006 07:03:52 +0000 (07:03 +0000)
committerOlivier Teulière <ipkiss@videolan.org>
Wed, 16 Aug 2006 07:03:52 +0000 (07:03 +0000)
   bug in ScaledBitmap is fixed
 * skins2/controls/ctrl_slider.*: Support resizing of the SliderBackground control

modules/gui/skins2/controls/ctrl_image.cpp
modules/gui/skins2/controls/ctrl_slider.cpp
modules/gui/skins2/controls/ctrl_slider.hpp

index 75f8972afc13bbf57ba4f22027e9d83e0e3c8d5b..18bc2af637be78b91785ca884d8927d291dd5376 100644 (file)
@@ -100,7 +100,7 @@ void CtrlImage::draw( OSGraphics &rImage, int xDest, int yDest )
         if( m_resizeMethod == kScale )
         {
             // Use scaling method
-            if( width > 1 && height > 1 )
+            if( width > 0 && height > 0 )
             {
                 if( width != m_pImage->getWidth() ||
                     height != m_pImage->getHeight() )
index d15631b209b0073b21359db35fcd9271df1fe70c..b87e9e4efd56ec7b0de19b642155264bd62d3a21 100644 (file)
@@ -27,6 +27,7 @@
 #include "../events/evt_mouse.hpp"
 #include "../events/evt_scroll.hpp"
 #include "../src/generic_bitmap.hpp"
+#include "../src/scaled_bitmap.hpp"
 #include "../src/top_window.hpp"
 #include "../src/os_factory.hpp"
 #include "../src/os_graphics.hpp"
@@ -315,18 +316,13 @@ CtrlSliderBg::CtrlSliderBg( intf_thread_t *pIntf,
     CtrlGeneric( pIntf, rHelp, pVisible ), m_pCursor( NULL ),
     m_rVariable( rVariable ), m_thickness( thickness ), m_rCurve( rCurve ),
     m_width( rCurve.getWidth() ), m_height( rCurve.getHeight() ),
-    m_pImgSeq( NULL ), m_nbHoriz( nbHoriz ), m_nbVert( nbVert ),
+    m_pImgSeq( pBackground ), m_nbHoriz( nbHoriz ), m_nbVert( nbVert ),
     m_padHoriz( padHoriz ), m_padVert( padVert ), m_bgWidth( 0 ),
     m_bgHeight( 0 ), m_position( 0 )
 {
     if( pBackground )
     {
         // Build the background image sequence
-        OSFactory *pOsFactory = OSFactory::instance( getIntf() );
-        m_pImgSeq = pOsFactory->createOSGraphics( pBackground->getWidth(),
-                                                  pBackground->getHeight() );
-        m_pImgSeq->drawBitmap( *pBackground, 0, 0 );
-
         m_bgWidth = (pBackground->getWidth() + m_padHoriz) / nbHoriz;
         m_bgHeight = (pBackground->getHeight() + m_padVert) / nbVert;
 
@@ -342,7 +338,6 @@ CtrlSliderBg::CtrlSliderBg( intf_thread_t *pIntf,
 CtrlSliderBg::~CtrlSliderBg()
 {
     m_rVariable.delObserver( this );
-    delete m_pImgSeq;
 }
 
 
@@ -361,12 +356,24 @@ void CtrlSliderBg::draw( OSGraphics &rImage, int xDest, int yDest )
 {
     if( m_pImgSeq )
     {
-        // Locate the right image in the background bitmap
-        int x = m_bgWidth * ( m_position % m_nbHoriz );
-        int y = m_bgHeight * ( m_position / m_nbHoriz );
-        // Draw the background image
-        rImage.drawGraphics( *m_pImgSeq, x, y, xDest, yDest,
-                             m_bgWidth - m_padHoriz, m_bgHeight - m_padVert );
+        if( m_bgWidth > 0 && m_bgHeight > 0 )
+        {
+            // Compute the resize factors
+            float factorX, factorY;
+            getResizeFactors( factorX, factorY );
+
+            // Rescale the image with the actual size of the control
+            ScaledBitmap bmp( getIntf(), *m_pImgSeq, m_bgWidth * m_nbHoriz,
+                              m_bgHeight * m_nbVert );
+
+            // Locate the right image in the background bitmap
+            int x = m_bgWidth * ( m_position % m_nbHoriz );
+            int y = m_bgHeight * ( m_position / m_nbHoriz );
+            // Draw the background image
+            rImage.drawBitmap( bmp, x, y, xDest, yDest,
+                               m_bgWidth - (int)(m_padHoriz * factorX),
+                               m_bgHeight - (int)(m_padVert * factorY) );
+        }
     }
 }
 
@@ -420,6 +427,24 @@ void CtrlSliderBg::handleEvent( EvtGeneric &rEvent )
 }
 
 
+void CtrlSliderBg::onResize()
+{
+    if( m_pImgSeq )
+    {
+        // Compute only the new size of an elementary image.
+        // The actual resizing is done in the draw() method for now...
+
+        // Compute the resize factors
+        float factorX, factorY;
+        getResizeFactors( factorX, factorY );
+
+        // Size of one elementary background image (padding included)
+        m_bgWidth = (int)(m_pImgSeq->getWidth() * factorX / m_nbHoriz);
+        m_bgHeight = (int)(m_pImgSeq->getHeight() * factorY / m_nbVert);
+    }
+}
+
+
 void CtrlSliderBg::associateCursor( CtrlSliderCursor &rCursor )
 {
     m_pCursor = &rCursor;
index ec9a8a969e430483830cc42d5814af4e53c90e77..bfa7c58e152f664c5ad7c461fbed62456723d6c6 100644 (file)
@@ -128,6 +128,9 @@ class CtrlSliderBg: public CtrlGeneric, public Observer<VarPercent>
         /// Handle an event
         virtual void handleEvent( EvtGeneric &rEvent );
 
+        /// Method called when the control is resized
+        virtual void onResize();
+
         /// Get the type of control (custom RTTI)
         virtual string getType() const { return "slider_bg"; }
 
@@ -146,7 +149,7 @@ class CtrlSliderBg: public CtrlGeneric, public Observer<VarPercent>
         /// Initial size of the control
         int m_width, m_height;
         /// Background image sequence (optional)
-        OSGraphics *m_pImgSeq;
+        GenericBitmap *m_pImgSeq;
         /// Number of images in the background bitmap
         int m_nbHoriz, m_nbVert;
         /// Number of pixels between two images