/*
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
This file is part of the JUCE library .
Copyright ( c ) 2015 - ROLI Ltd .
Permission is granted to use this software under the terms of either :
a ) the GPL v2 ( or any later version )
b ) the Affero GPL v3
Details of these licenses can be found at : www . gnu . org / licenses
JUCE is distributed in the hope that it will be useful , but WITHOUT ANY
WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE . See the GNU General Public License for more details .
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
To release a closed - source product which uses JUCE , commercial licenses are
available : visit www . juce . com for more information .
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*/
RectanglePlacement : : RectanglePlacement ( const RectanglePlacement & other ) noexcept
: flags ( other . flags )
{
}
RectanglePlacement & RectanglePlacement : : operator = ( const RectanglePlacement & other ) noexcept
{
flags = other . flags ;
return * this ;
}
bool RectanglePlacement : : operator = = ( const RectanglePlacement & other ) const noexcept
{
return flags = = other . flags ;
}
bool RectanglePlacement : : operator ! = ( const RectanglePlacement & other ) const noexcept
{
return flags ! = other . flags ;
}
void RectanglePlacement : : applyTo ( double & x , double & y , double & w , double & h ,
const double dx , const double dy , const double dw , const double dh ) const noexcept
{
if ( w = = 0 | | h = = 0 )
return ;
if ( ( flags & stretchToFit ) ! = 0 )
{
x = dx ;
y = dy ;
w = dw ;
h = dh ;
}
else
{
double scale = ( flags & fillDestination ) ! = 0 ? jmax ( dw / w , dh / h )
: jmin ( dw / w , dh / h ) ;
if ( ( flags & onlyReduceInSize ) ! = 0 )
scale = jmin ( scale , 1.0 ) ;
if ( ( flags & onlyIncreaseInSize ) ! = 0 )
scale = jmax ( scale , 1.0 ) ;
w * = scale ;
h * = scale ;
if ( ( flags & xLeft ) ! = 0 )
x = dx ;
else if ( ( flags & xRight ) ! = 0 )
x = dx + dw - w ;
else
x = dx + ( dw - w ) * 0.5 ;
if ( ( flags & yTop ) ! = 0 )
y = dy ;
else if ( ( flags & yBottom ) ! = 0 )
y = dy + dh - h ;
else
y = dy + ( dh - h ) * 0.5 ;
}
}
AffineTransform RectanglePlacement : : getTransformToFit ( const Rectangle < float > & source , const Rectangle < float > & destination ) const noexcept
{
if ( source . isEmpty ( ) )
return AffineTransform : : identity ;
float newX = destination . getX ( ) ;
float newY = destination . getY ( ) ;
float scaleX = destination . getWidth ( ) / source . getWidth ( ) ;
float scaleY = destination . getHeight ( ) / source . getHeight ( ) ;
if ( ( flags & stretchToFit ) = = 0 )
{
scaleX = ( flags & fillDestination ) ! = 0 ? jmax ( scaleX , scaleY )
: jmin ( scaleX , scaleY ) ;
if ( ( flags & onlyReduceInSize ) ! = 0 )
scaleX = jmin ( scaleX , 1.0f ) ;
if ( ( flags & onlyIncreaseInSize ) ! = 0 )
scaleX = jmax ( scaleX , 1.0f ) ;
scaleY = scaleX ;
if ( ( flags & xRight ) ! = 0 )
newX + = destination . getWidth ( ) - source . getWidth ( ) * scaleX ; // right
else if ( ( flags & xLeft ) = = 0 )
newX + = ( destination . getWidth ( ) - source . getWidth ( ) * scaleX ) / 2.0f ; // centre
if ( ( flags & yBottom ) ! = 0 )
newY + = destination . getHeight ( ) - source . getHeight ( ) * scaleX ; // bottom
else if ( ( flags & yTop ) = = 0 )
newY + = ( destination . getHeight ( ) - source . getHeight ( ) * scaleX ) / 2.0f ; // centre
}
return AffineTransform : : translation ( - source . getX ( ) , - source . getY ( ) )
. scaled ( scaleX , scaleY )
. translated ( newX , newY ) ;
}