/******************************************************************************* * 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 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 targetRatio = targetHeight / targetWidth; float sourceRatio = sourceHeight / sourceWidth; float scale = targetWidth / sourceWidth; temp.x = sourceWidth * scale; temp.y = sourceHeight * scale; break; } case fillY: { float targetRatio = targetHeight / targetWidth; float sourceRatio = sourceHeight / sourceWidth; 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; } }