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
{
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 );
}
}
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
const GenericBitmap &m_rBitmap;
/// Buffer to stored the rendered bitmap
OSGraphics *m_pImage;
+ /// Resize method
+ resize_t m_resizeMethod;
};
#endif
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
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
/// 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;
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;
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 );
}
rightbottom CDATA "lefttop"
image CDATA #REQUIRED
action CDATA "none"
+ resize CDATA "mosaic"
help CDATA ""
>
<!ELEMENT Button EMPTY>