/******************************************************************************* | |
* 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; | |
} | |
} |