advantis
10/1/2012 - 8:53 AM

CGRect proportional scaling

CGRect proportional scaling

#import "tgmath.h"

CGRect ADVRectScaleToSize(CGRect sourceRect, CGSize targetSize, UIViewContentMode contentMode)
{
	CGSize sourceSize = sourceRect.size;

	CGFloat horizontalRatio = targetSize.width / sourceSize.width;
	CGFloat verticalRatio = targetSize.height / sourceSize.height;

	CGFloat ratio;
	switch (contentMode)
	{
		case UIViewContentModeScaleAspectFit:
			ratio = fmin(horizontalRatio, verticalRatio);
	        break;
		case UIViewContentModeScaleAspectFill:
			ratio = fmax(horizontalRatio, verticalRatio);
	        break;
	        // TODO: Implement other modes
		default:
			return sourceRect;
	}

	CGSize scaledSize = CGSizeMake(floor(ratio * sourceSize.width),
	                               floor(ratio * sourceSize.height));

	sourceRect.origin.x += floor((targetSize.width - scaledSize.width) / 2.f);
	sourceRect.origin.y += floor((targetSize.height - scaledSize.height) / 2.f);
	sourceRect.size = scaledSize;

	return sourceRect;
}