/*******************************************************************************
* 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.NinePatch;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.utils.Align;
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.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;
setWidth(getPrefWidth());
setHeight(getPrefHeight());
}
public void layout() {
float regionWidth, regionHeight;
if (drawable != null) {
regionWidth = drawable.getMinWidth();
regionHeight = drawable.getMinHeight();
} else
return;
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(SpriteBatch 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 != null) {
if (drawable.getClass() == TextureRegionDrawable.class) {
TextureRegion region = ((TextureRegionDrawable) drawable).getRegion();
float rotation = getRotation();
if (scaleX == 1 && scaleY == 1 && rotation == 0)
batch.draw(region, x + imageX, y + imageY, imageWidth, imageHeight);
else {
batch.draw(region, x + imageX, y + imageY, getOriginX() - imageX, getOriginY() - imageY,
imageWidth, imageHeight, scaleX, scaleY, rotation);
}
} else
drawable.draw(batch, x + imageX, y + imageY, imageWidth * scaleX, imageHeight * scaleY);
}
}
public void setDrawable(Drawable drawable) {
if (drawable != null) {
if (this.drawable == drawable)
return;
if (getPrefWidth() != drawable.getMinWidth() || getPrefHeight() != drawable.getMinHeight())
invalidateHierarchy();
} else {
if (getPrefWidth() != 0 || getPrefHeight() != 0)
invalidateHierarchy();
}
this.drawable = drawable;
}
public Drawable getDrawable() {
return drawable;
}
public void setScaling(Scaling scaling) {
if (scaling == null)
throw new IllegalArgumentException("scaling cannot be null.");
this.scaling = scaling;
}
public void setAlign(int align) {
this.align = align;
}
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;
}
}