Commit 31dafe28 authored by Erwan Tulou's avatar Erwan Tulou

skins2: extend xoffset and yoffset parameters

Till now, these two parameters only had a meaning for geographical positioning.
As explained at http://forum.videolan.org/viewtopic.php?f=26&t=111572,
extending xoffset and yoffset for the general case would help a lot skin
developpers easily position an object of unknown size around a given point :
for instance,
    x="50%" xoffset="-50%" would center an object horizontally.
    x="100%" xoffset="-100%" would set an object to the East

This patch doesn't modify the existing behaviour. It just implements a new
feature for the case where it was a silent no op.

x,y, width, height percentages are computed against the parent container
xoffset and yoffset percentages are computed against the current object

TODO: this approach could be generalized to all objects (need to extend the dtd)
parent 2bbc88ce
......@@ -959,33 +959,45 @@ void SkinParser::convertPosition( string position, string xOffset,
int refWidth, int refHeight, int* p_x, int* p_y )
{
int iPosition = getPosition( position );
if( iPosition == POS_UNDEF )
return;
if( iPosition != POS_UNDEF )
{
// compute offset against the parent object size
// for backward compatibility
int i_xOffset = getDimension( xOffset, refWidth );
int i_yOffset = getDimension( yOffset, refHeight );
int i_xMargin = getDimension( xMargin, refWidth );
int i_yMargin = getDimension( yMargin, refHeight );
// compute *p_x
if( iPosition & POS_LEFT )
*p_x = i_xMargin;
else if( iPosition & POS_RIGHT )
*p_x = refWidth - width - i_xMargin;
else
*p_x = ( refWidth - width ) / 2;
// compute *p_y
if( iPosition & POS_TOP )
*p_y = i_yMargin;
else if( iPosition & POS_BOTTOM )
*p_y = refHeight - height - i_yMargin;
else
*p_y = ( refHeight - height ) / 2;
// add offset
*p_x += i_xOffset;
*p_y += i_yOffset;
}
else
{
// compute offset against the current object size
int i_xOffset = getDimension( xOffset, width );
int i_yOffset = getDimension( yOffset, height );
int i_xOffset = getDimension( xOffset, refWidth );
int i_yOffset = getDimension( yOffset, refHeight );
int i_xMargin = getDimension( xMargin, refWidth );
int i_yMargin = getDimension( yMargin, refHeight );
// compute *p_x
if( iPosition & POS_LEFT )
*p_x = i_xMargin;
else if( iPosition & POS_RIGHT )
*p_x = refWidth - width - i_xMargin;
else
*p_x = ( refWidth - width ) / 2;
// compute *p_y
if( iPosition & POS_TOP )
*p_y = i_yMargin;
else if( iPosition & POS_BOTTOM )
*p_y = refHeight - height - i_yMargin;
else
*p_y = ( refHeight - height ) / 2;
// add offset
*p_x += i_xOffset;
*p_y += i_yOffset;
// add offset
*p_x += i_xOffset;
*p_y += i_yOffset;
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment