blob: 480ca98a43cfe5ebb6c46a474fb57131654e5ff5 [file] [log] [blame]
/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.badlogic.gdx.utils;
import com.badlogic.gdx.math.Vector2;
/** Various scaling types for fitting one rectangle into another.
* @author Nathan Sweet */
public enum Scaling {
/** Scales the source to fit the target while keeping the same aspect ratio. This may cause the source to be smaller than the
* target in one direction. */
fit,
/** Scales the source to fill the target while keeping the same aspect ratio. This may cause the source to be larger than the
* target in one direction. */
fill,
/** Scales the source to fill the target in the x direction while keeping the same aspect ratio. This may cause the source to be
* smaller or larger than the target in the y direction. */
fillX,
/** Scales the source to fill the target in the y direction while keeping the same aspect ratio. This may cause the source to be
* smaller or larger than the target in the x direction. */
fillY,
/** Scales the source to fill the target. This may cause the source to not keep the same aspect ratio. */
stretch,
/** Scales the source to fill the target in the x direction, without changing the y direction. This may cause the source to not
* keep the same aspect ratio. */
stretchX,
/** Scales the source to fill the target in the y direction, without changing the x direction. This may cause the source to not
* keep the same aspect ratio. */
stretchY,
/** The source is not scaled. */
none;
static private final Vector2 temp = new Vector2();
/** Returns the size of the source scaled to the target. Note the same Vector2 instance is always returned and should never be
* cached. */
public Vector2 apply (float sourceWidth, float sourceHeight, float targetWidth, float targetHeight) {
switch (this) {
case fit: {
float targetRatio = targetHeight / targetWidth;
float sourceRatio = sourceHeight / sourceWidth;
float scale = targetRatio > sourceRatio ? targetWidth / sourceWidth : targetHeight / sourceHeight;
temp.x = sourceWidth * scale;
temp.y = sourceHeight * scale;
break;
}
case fill: {
float targetRatio = targetHeight / targetWidth;
float sourceRatio = sourceHeight / sourceWidth;
float scale = targetRatio < sourceRatio ? targetWidth / sourceWidth : targetHeight / sourceHeight;
temp.x = sourceWidth * scale;
temp.y = sourceHeight * scale;
break;
}
case fillX: {
float scale = targetWidth / sourceWidth;
temp.x = sourceWidth * scale;
temp.y = sourceHeight * scale;
break;
}
case fillY: {
float scale = targetHeight / sourceHeight;
temp.x = sourceWidth * scale;
temp.y = sourceHeight * scale;
break;
}
case stretch:
temp.x = targetWidth;
temp.y = targetHeight;
break;
case stretchX:
temp.x = targetWidth;
temp.y = sourceHeight;
break;
case stretchY:
temp.x = sourceWidth;
temp.y = targetHeight;
break;
case none:
temp.x = sourceWidth;
temp.y = sourceHeight;
break;
}
return temp;
}
}