/*******************************************************************************
* 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.scenes.scene2d.ui;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.NinePatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
import com.badlogic.gdx.scenes.scene2d.utils.NinePatchDrawable;
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
import com.badlogic.gdx.scenes.scene2d.utils.TransformDrawable;
import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Scaling;
/** Displays a {@link Drawable}, scaled various way within the widgets bounds. The preferred size is the min size of the drawable.
* Only when using a {@link TextureRegionDrawable} will the actor's scale, rotation, and origin be used when drawing.
* @author Nathan Sweet */
public class Image extends Widget {
private Scaling scaling;
private int align = Align.center;
private float imageX, imageY, imageWidth, imageHeight;
private Drawable drawable;
/** Creates an image with no region or patch, stretched, and aligned center. */
public Image () {
this((Drawable)null);
}
/** Creates an image stretched, and aligned center.
* @param patch May be null. */
public Image (NinePatch patch) {
this(new NinePatchDrawable(patch), Scaling.stretch, Align.center);
}
/** Creates an image stretched, and aligned center.
* @param region May be null. */
public Image (TextureRegion region) {
this(new TextureRegionDrawable(region), Scaling.stretch, Align.center);
}
/** Creates an image stretched, and aligned center. */
public Image (Texture texture) {
this(new TextureRegionDrawable(new TextureRegion(texture)));
}
/** Creates an image stretched, and aligned center. */
public Image (Skin skin, String drawableName) {
this(skin.getDrawable(drawableName), Scaling.stretch, Align.center);
}
/** Creates an image stretched, and aligned center.
* @param drawable May be null. */
public Image (Drawable drawable) {
this(drawable, Scaling.stretch, Align.center);
}
/** Creates an image aligned center.
* @param drawable May be null. */
public Image (Drawable drawable, Scaling scaling) {
this(drawable, scaling, Align.center);
}
/** @param drawable May be null. */
public Image (Drawable drawable, Scaling scaling, int align) {
setDrawable(drawable);
this.scaling = scaling;
this.align = align;
setSize(getPrefWidth(), getPrefHeight());
}
public void layout () {
if (drawable == null) return;
float regionWidth = drawable.getMinWidth();
float regionHeight = drawable.getMinHeight();
float width = getWidth();
float height = getHeight();
Vector2 size = scaling.apply(regionWidth, regionHeight, width, height);
imageWidth = size.x;
imageHeight = size.y;
if ((align & Align.left) != 0)
imageX = 0;
else if ((align & Align.right) != 0)
imageX = (int)(width - imageWidth);
else
imageX = (int)(width / 2 - imageWidth / 2);
if ((align & Align.top) != 0)
imageY = (int)(height - imageHeight);
else if ((align & Align.bottom) != 0)
imageY = 0;
else
imageY = (int)(height / 2 - imageHeight / 2);
}
public void draw (Batch batch, float parentAlpha) {
validate();
Color color = getColor();
batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);
float x = getX();
float y = getY();
float scaleX = getScaleX();
float scaleY = getScaleY();
if (drawable instanceof TransformDrawable) {
float rotation = getRotation();
if (scaleX != 1 || scaleY != 1 || rotation != 0) {
((TransformDrawable)drawable).draw(batch, x + imageX, y + imageY, getOriginX() - imageX, getOriginY() - imageY,
imageWidth, imageHeight, scaleX, scaleY, rotation);
return;
}
}
if (drawable != null) drawable.draw(batch, x + imageX, y + imageY, imageWidth * scaleX, imageHeight * scaleY);
}
public void setDrawable (Skin skin, String drawableName) {
setDrawable(skin.getDrawable(drawableName));
}
/** @param drawable May be null. */
public void setDrawable (Drawable drawable) {
if (this.drawable == drawable) return;
if (drawable != null) {
if (getPrefWidth() != drawable.getMinWidth() || getPrefHeight() != drawable.getMinHeight()) invalidateHierarchy();
} else
invalidateHierarchy();
this.drawable = drawable;
}
/** @return May be null. */
public Drawable getDrawable () {
return drawable;
}
public void setScaling (Scaling scaling) {
if (scaling == null) throw new IllegalArgumentException("scaling cannot be null.");
this.scaling = scaling;
invalidate();
}
public void setAlign (int align) {
this.align = align;
invalidate();
}
public float getMinWidth () {
return 0;
}
public float getMinHeight () {
return 0;
}
public float getPrefWidth () {
if (drawable != null) return drawable.getMinWidth();
return 0;
}
public float getPrefHeight () {
if (drawable != null) return drawable.getMinHeight();
return 0;
}
public float getImageX () {
return imageX;
}
public float getImageY () {
return imageY;
}
public float getImageWidth () {
return imageWidth;
}
public float getImageHeight () {
return imageHeight;
}
}