com.badlogic.gdx.utils.Scaling.java Source code

Java tutorial

Introduction

Here is the source code for com.badlogic.gdx.utils.Scaling.java

Source

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