package magic.ui.widget;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import javax.swing.JLabel;
import magic.data.GeneralConfig;
import magic.ui.duel.resolution.ResolutionProfileResult;
import magic.ui.duel.resolution.ResolutionProfileType;
import magic.ui.screen.interfaces.IThemeStyle;
import magic.ui.theme.Theme;
import magic.ui.helpers.ImageHelper;
import magic.ui.utility.MagicStyle;
@SuppressWarnings("serial")
public class ZoneBackgroundLabel extends JLabel implements IThemeStyle {
private int playerX;
private int handY;
private BufferedImage cachedImage;
private Dimension cachedSize = new Dimension();
public ZoneBackgroundLabel() {
setOpaque(true);
refreshStyle();
}
public void setZones(final ResolutionProfileResult result) {
final Rectangle rect=result.getBoundary(ResolutionProfileType.GameZones);
playerX=rect.width;
handY=rect.height;
}
private void paintZoneTile(final Graphics g,final BufferedImage aImage,final Rectangle rect) {
final int imageWidth=aImage.getWidth();
final int imageHeight=aImage.getHeight();
final int x2=rect.x+rect.width;
final int y2=rect.y+rect.height;
for (int y=rect.y;y<y2;y+=imageHeight) {
for (int x=rect.x;x<x2;x+=imageWidth) {
g.drawImage(aImage,x,y,this);
}
}
}
private void paintZoneStretch(final Graphics g,final BufferedImage aImage,final Rectangle rect) {
final int iw=aImage.getWidth();
final int ih=aImage.getHeight();
final int iw2=ih*rect.width/rect.height;
final Rectangle imageRect;
if (iw2<=iw) {
imageRect=new Rectangle((iw-iw2)/2,0,iw2,ih);
} else {
final int ih2=iw*rect.height/rect.width;
imageRect=new Rectangle(0,(ih-ih2)/2,iw,ih2);
}
g.drawImage(aImage,rect.x,rect.y,rect.x+rect.width,rect.y+rect.height,
imageRect.x,imageRect.y,imageRect.x+imageRect.width,imageRect.y+imageRect.height,this);
}
private void paintZone(final Graphics g,final BufferedImage aImage,final Rectangle rect,final boolean stretch) {
if (stretch) {
paintZoneStretch(g,aImage,rect);
} else {
paintZoneTile(g,aImage,rect);
}
}
private void drawLayout1(final Graphics g) {
final Theme theme = MagicStyle.getTheme();
final Dimension size = getSize();
final int stretch = theme.getValue(Theme.VALUE_GAME_STRETCH);
final boolean battlefieldStretch = (stretch & 1) == 1;
paintZone(g,
theme.getTexture(Theme.TEXTURE_BATTLEFIELD),
new Rectangle(0, 0, size.width, size.height),
battlefieldStretch
);
}
private void drawLayout2(final Graphics g) {
final Theme theme = MagicStyle.getTheme();
final Dimension size = getSize();
final int stretch = theme.getValue(Theme.VALUE_GAME_STRETCH);
final boolean battlefieldStretch = (stretch & 1) == 1;
final boolean playerStretch = (stretch & 2) == 2;
paintZone(g,
theme.getTexture(Theme.TEXTURE_PLAYER),
new Rectangle(0, 0, size.width, size.height),
playerStretch
);
paintZone(g,
theme.getTexture(Theme.TEXTURE_BATTLEFIELD),
new Rectangle(playerX, 0, size.width - playerX, handY),
battlefieldStretch
);
}
private void drawLayout3(final Graphics g) {
final Theme theme = MagicStyle.getTheme();
final Dimension size = getSize();
final int stretch = theme.getValue(Theme.VALUE_GAME_STRETCH);
final boolean battlefieldStretch = (stretch & 1) == 1;
final boolean playerStretch = (stretch & 2) == 2;
final boolean handStretch = (stretch & 4) == 4;
paintZone(g,
theme.getTexture(Theme.TEXTURE_PLAYER),
new Rectangle(0, 0, playerX, size.height),
playerStretch
);
paintZone(g,
theme.getTexture(Theme.TEXTURE_BATTLEFIELD),
new Rectangle(playerX, 0, size.width - playerX, handY),
battlefieldStretch
);
paintZone(g,
theme.getTexture(Theme.TEXTURE_HAND),
new Rectangle(playerX, handY, size.width - playerX, handY),
handStretch
);
}
private void drawBattlefieldBorder(final Graphics g) {
final Theme theme = MagicStyle.getTheme();
final Dimension size = getSize();
final int border = theme.getValue(Theme.VALUE_GAME_BORDER);
if (border > 0) {
final Graphics2D g2d = (Graphics2D) g;
g2d.setPaint(theme.getColor(Theme.COLOR_GAME_BORDER));
g2d.fillRect(playerX, 0, border, handY);
g2d.fillRect(playerX, handY, size.width - playerX, border);
}
}
private void drawThemeBackground(final Graphics g) {
switch (MagicStyle.getTheme().getValue(Theme.VALUE_GAME_LAYOUT)) {
case 1:
drawLayout1(g);
break;
case 2:
drawLayout2(g);
break;
case 3:
drawLayout3(g);
break;
}
drawBattlefieldBorder(g);
}
private boolean redrawImage() {
return cachedImage == null || !cachedSize.equals(getSize());
}
private void createBackgroundImage() {
cachedSize = new Dimension(getSize());
cachedImage = ImageHelper.getCompatibleBufferedImage(cachedSize.width, cachedSize.height);
final Graphics2D g2d = cachedImage.createGraphics();
drawThemeBackground(g2d);
g2d.dispose();
}
@Override
public void paintComponent(final Graphics g) {
// paintComponent() will only be called if instance is visible.
if (redrawImage()) {
createBackgroundImage();
}
g.drawImage(cachedImage, 0, 0, null);
}
@Override
public void refreshStyle() {
cachedImage = null;
setVisible(!GeneralConfig.getInstance().isCustomBackground());
}
}