Skip to content

Commit

Permalink
Implement support for image scaling for the ImageComponent
Browse files Browse the repository at this point in the history
  • Loading branch information
Gurkenlabs committed Sep 28, 2017
1 parent 6b01bb0 commit 562e1e3
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 52 deletions.
73 changes: 38 additions & 35 deletions src/de/gurkenlabs/litiengine/gui/GuiComponent.java
Expand Up @@ -126,6 +126,7 @@ protected GuiComponent(final double x, final double y) {
this.y = y;
this.setTextXMargin(this.getWidth() / 16);
this.setSelected(false);
this.setEnabled(true);
this.initializeComponents();
}

Expand All @@ -152,15 +153,15 @@ public boolean drawTextShadow() {
}

public Appearance getAppearance() {
return appearance;
return this.appearance;
}

public Appearance getAppearanceHovered() {
return hoveredAppearance;
return this.hoveredAppearance;
}

public Appearance getAppearanceDisabled() {
return disabledAppearance;
return this.disabledAppearance;
}

/**
Expand Down Expand Up @@ -775,41 +776,43 @@ private boolean mouseEventShouldBeForwarded(final MouseEvent e) {
}

private void renderText(Graphics2D g) {
if (this.getText() != null) {
final FontMetrics fm = g.getFontMetrics();

double defaultTextX;
double defaultTextY = fm.getAscent() + (this.getHeight() - (fm.getAscent() + fm.getDescent())) / 2;
switch (this.getTextAlignment()) {
case LEFT:
defaultTextX = this.getTextXMargin();
break;
case RIGHT:
defaultTextX = this.getWidth() - this.getTextXMargin() - fm.stringWidth(this.getTextToRender(g));
break;
case CENTER:
default:
defaultTextX = this.getWidth() / 2 - fm.stringWidth(this.getTextToRender(g)) / 2.0;
break;
}
if (this.getTextY() == 0) {
this.setTextY(defaultTextY);
}
if (this.getText() == null || this.getText().isEmpty()) {
return;
}

if (this.getTextX() == 0) {
this.setTextX(defaultTextX);
}
if (this.getTextAngle() == 0) {
if (this.drawTextShadow()) {
RenderEngine.drawTextWithShadow(g, this.getTextToRender(g), this.getX() + this.getTextX(), this.getY() + this.getTextY(), this.getTextShadowColor());
} else {
RenderEngine.drawText(g, this.getTextToRender(g), this.getX() + this.getTextX(), this.getY() + this.getTextY());
}
} else if (this.getTextAngle() == 90) {
RenderEngine.drawRotatedText(g, this.getX() + this.getTextX(), this.getY() + this.getTextY() - fm.stringWidth(this.getTextToRender(g)), this.getTextAngle(), this.getTextToRender(g));
final FontMetrics fm = g.getFontMetrics();

double defaultTextX;
double defaultTextY = fm.getAscent() + (this.getHeight() - (fm.getAscent() + fm.getDescent())) / 2;
switch (this.getTextAlignment()) {
case LEFT:
defaultTextX = this.getTextXMargin();
break;
case RIGHT:
defaultTextX = this.getWidth() - this.getTextXMargin() - fm.stringWidth(this.getTextToRender(g));
break;
case CENTER:
default:
defaultTextX = this.getWidth() / 2 - fm.stringWidth(this.getTextToRender(g)) / 2.0;
break;
}
if (this.getTextY() == 0) {
this.setTextY(defaultTextY);
}

if (this.getTextX() == 0) {
this.setTextX(defaultTextX);
}
if (this.getTextAngle() == 0) {
if (this.drawTextShadow()) {
RenderEngine.drawTextWithShadow(g, this.getTextToRender(g), this.getX() + this.getTextX(), this.getY() + this.getTextY(), this.getTextShadowColor());
} else {
RenderEngine.drawRotatedText(g, this.getX() + this.getTextX(), this.getY() + this.getTextY(), this.getTextAngle(), this.getTextToRender(g));
RenderEngine.drawText(g, this.getTextToRender(g), this.getX() + this.getTextX(), this.getY() + this.getTextY());
}
} else if (this.getTextAngle() == 90) {
RenderEngine.drawRotatedText(g, this.getX() + this.getTextX(), this.getY() + this.getTextY() - fm.stringWidth(this.getTextToRender(g)), this.getTextAngle(), this.getTextToRender(g));
} else {
RenderEngine.drawRotatedText(g, this.getX() + this.getTextX(), this.getY() + this.getTextY(), this.getTextAngle(), this.getTextToRender(g));
}
}
}
48 changes: 35 additions & 13 deletions src/de/gurkenlabs/litiengine/gui/ImageComponent.java
Expand Up @@ -11,7 +11,6 @@
import de.gurkenlabs.litiengine.graphics.ImageCache;
import de.gurkenlabs.litiengine.graphics.RenderEngine;
import de.gurkenlabs.litiengine.graphics.Spritesheet;
import de.gurkenlabs.litiengine.sound.Sound;
import de.gurkenlabs.util.ImageProcessing;

public class ImageComponent extends GuiComponent {
Expand All @@ -20,12 +19,12 @@ public class ImageComponent extends GuiComponent {
public static final int BACKGROUND_PRESSED_INDEX = 2;
public static final int BACKGROUND_DISABLED_INDEX = 3;

private Sound hoverSound;

private Image image;

private Spritesheet spritesheet;

private ImageScaleMode imageScaleMode;

public ImageComponent(final double x, final double y, final Image image) {
super(x, y, image.getWidth(null), image.getHeight(null));
this.image = image;
Expand Down Expand Up @@ -82,13 +81,36 @@ public Image getBackground() {
return img;
}

@Override
public Sound getHoverSound() {
return this.hoverSound;
public Image getImage() {
if (this.image == null) {
return null;
}

int imageWidth = this.image.getWidth(null);
int imageHeight = this.image.getHeight(null);

if (this.getImageScaleMode() == ImageScaleMode.STRETCH) {
imageWidth = (int) this.getWidth();
imageHeight = (int) this.getHeight();
}

final String cacheKey = MessageFormat.format("{0}_{1}x{2}", this.image.hashCode(), imageWidth, imageHeight);
if (ImageCache.SPRITES.containsKey(cacheKey)) {
return ImageCache.SPRITES.get(cacheKey);
}

BufferedImage bufferedImage = ImageProcessing.toBufferedImage(this.image);
if (bufferedImage == null) {
return this.image;
}

BufferedImage img = ImageProcessing.scaleImage(bufferedImage, imageWidth, imageHeight);
ImageCache.SPRITES.put(cacheKey, img);
return img;
}

public Image getImage() {
return this.image;
public ImageScaleMode getImageScaleMode() {
return imageScaleMode;
}

protected Spritesheet getSpritesheet() {
Expand All @@ -114,16 +136,16 @@ public void render(final Graphics2D g) {
super.render(g);
}

@Override
public void setHoverSound(final Sound hoverSound) {
this.hoverSound = hoverSound;
}

public void setImage(final Image image) {
this.image = image;
}

public void setImageScaleMode(ImageScaleMode imageScaleMode) {
this.imageScaleMode = imageScaleMode;
}

public void setSpriteSheet(final Spritesheet spr) {
this.spritesheet = spr;
}

}
5 changes: 5 additions & 0 deletions src/de/gurkenlabs/litiengine/gui/ImageScaleMode.java
@@ -0,0 +1,5 @@
package de.gurkenlabs.litiengine.gui;

public enum ImageScaleMode {
NORMAL, STRETCH
}
12 changes: 8 additions & 4 deletions src/de/gurkenlabs/util/ImageProcessing.java
Expand Up @@ -497,19 +497,23 @@ public static BufferedImage setOpacity(final Image img, final float opacity) {
}

public static BufferedImage toBufferedImage(final Image img) {
if (img == null) {
return null;
}

if (img instanceof BufferedImage) {
return (BufferedImage) img;
}

// Create a buffered image with transparency
final BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
final BufferedImage bimage = getCompatibleImage(img.getWidth(null), img.getHeight(null));
if (bimage == null) {
return null;
}

// Draw the image on to the buffered image
final Graphics2D bGr = bimage.createGraphics();
bGr.drawImage(img, 0, 0, null);
bGr.dispose();

// Return the buffered image
return bimage;
}

Expand Down

0 comments on commit 562e1e3

Please sign in to comment.