magarena/src/magic/cardBuilder/renderers/ImageFrame.java

207 lines
9.2 KiB
Java

package magic.cardBuilder.renderers;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import magic.cardBuilder.CardResource;
import magic.cardBuilder.ResourceManager;
import magic.model.IRenderableCard;
import magic.model.MagicColor;
import magic.model.MagicType;
import magic.ui.ImageFileIO;
import magic.ui.MagicImages;
import magic.ui.helpers.ImageHelper;
import magic.utility.MagicFileSystem;
public class ImageFrame {
private static BufferedImage defaultBackground(MagicColor color) {
switch (color) {
case White:
return ResourceManager.newFrame(CardResource.defaultWhite);
case Blue:
return ResourceManager.newFrame(CardResource.defaultBlue);
case Black:
return ResourceManager.newFrame(CardResource.defaultBlack);
case Red:
return ResourceManager.newFrame(CardResource.defaultRed);
case Green:
return ResourceManager.newFrame(CardResource.defaultGreen);
}
return null;
}
private static BufferedImage defaultSymbol(MagicType type) {
switch (type) {
case Artifact:
return ResourceManager.newFrame(CardResource.artifactSymbol);
case Creature:
return ResourceManager.newFrame(CardResource.creatureSymbol);
case Enchantment:
return ResourceManager.newFrame(CardResource.enchantmentSymbol);
case Instant:
return ResourceManager.newFrame(CardResource.instantSymbol);
case Land:
return ResourceManager.newFrame(CardResource.landSymbol);
case Planeswalker:
return ResourceManager.newFrame(CardResource.planeswalkerSymbol);
case Sorcery:
return ResourceManager.newFrame(CardResource.sorcerySymbol);
default:
return null;
}
}
static void drawImage(BufferedImage card, IRenderableCard cardDef) {
Graphics2D g2d = card.createGraphics();
if (cardDef.isPlaneswalker()) {
g2d.drawImage(getCardImage(cardDef), null, 27, 54);
} else if (cardDef.isToken()) {
g2d.drawImage(getCardImage(cardDef), null, 29, 64);
} else {
g2d.drawImage(getCardImage(cardDef), null, 29, 60);
}
g2d.dispose();
}
private static BufferedImage getDefaultBackground(IRenderableCard cardDef) {
if (cardDef.isMulti()) {
if (cardDef.isHybrid() || (cardDef.isToken() && cardDef.getNumColors() == 2)) {
List<BufferedImage> colorDefaults = Frame.getColorPairOrder(cardDef).stream().filter(cardDef::hasColor).map(ImageFrame::defaultBackground).collect(Collectors.toList());
return Frame.getBlendedFrame(
ResourceManager.newFrame(colorDefaults.get(0)),
ResourceManager.newFrame(CardResource.defaultHybridBlend),
ResourceManager.newFrame(colorDefaults.get(1))
);
} else {
return ResourceManager.newFrame(CardResource.defaultMulti);
}
}
for (MagicColor color : MagicColor.values()) {
if (cardDef.hasColor(color)) {
return defaultBackground(color);
}
}
if (cardDef.hasType(MagicType.Land)) {
return ResourceManager.newFrame(CardResource.defaultLand);
}
if (cardDef.hasType(MagicType.Artifact)) {
return ResourceManager.newFrame(CardResource.defaultArtifact);
}
return ResourceManager.newFrame(CardResource.defaultColorless);
}
private static BufferedImage getDefaultSymbol(IRenderableCard cardDef) {
Set<MagicType> cardTypes = cardDef.getTypes();
cardTypes.removeAll(MagicType.SUPERTYPES);
cardTypes.remove(MagicType.Tribal);
if (cardTypes.size() > 1) {
if (cardDef.isCreature()) {
return ResourceManager.newFrame(CardResource.creatureSymbol);
}
return ResourceManager.newFrame(CardResource.multiSymbol);
}
if (!cardTypes.isEmpty()) {
return defaultSymbol(cardTypes.iterator().next());
}
return ResourceManager.newFrame(CardResource.magarenaSymbol);
}
public static BufferedImage getCardImage(IRenderableCard cardDef) {
File cropFile = MagicFileSystem.getCroppedCardImage(cardDef);
if (cropFile.exists()) {
if (cardDef.isPlaneswalker()) {
BufferedImage crop = ImageHelper.scale(ImageFileIO.toImg(cropFile, MagicImages.MISSING_CARD), 320, 234);
if (OracleText.getPlaneswalkerAbilityCount(cardDef) <= 3) {
BufferedImage blend = ResourceManager.newFrame(CardResource.getPlaneswalkerImageBlend);
return Frame.getBlendedFrame(new BufferedImage(320, 234, BufferedImage.TYPE_INT_ARGB), blend, crop);
} else {
BufferedImage cropSmall = crop.getSubimage(0, 0, 320, 201);
BufferedImage blend = ImageHelper.scale(ResourceManager.newFrame(CardResource.getPlaneswalkerImageBlend), 320, 201);
return Frame.getBlendedFrame(new BufferedImage(320, 210, BufferedImage.TYPE_INT_ARGB), blend, cropSmall);
}
} else if (cardDef.isToken()) {
if (cardDef.hasText()) {
BufferedImage crop = ImageHelper.scale(ImageFileIO.toImg(cropFile, MagicImages.MISSING_CARD), 320, 289);
BufferedImage blend = ResourceManager.newFrame(CardResource.tokenImageMaskSmall);
return Frame.getBlendedFrame(new BufferedImage(320, 289, BufferedImage.TYPE_INT_ARGB), blend, crop);
} else {
BufferedImage crop = ImageHelper.scale(ImageFileIO.toImg(cropFile, MagicImages.MISSING_CARD), 320, 360);
BufferedImage blend = ResourceManager.newFrame(CardResource.tokenImageMaskLarge);
return Frame.getBlendedFrame(new BufferedImage(320, 360, BufferedImage.TYPE_INT_ARGB), blend, crop);
}
} else {
BufferedImage image = ImageFileIO.toImg(cropFile, MagicImages.MISSING_CARD);
return ImageHelper.scale(image, 316, 231);
}
}
if (cardDef.isPlaneswalker()) {
return buildPlaneswalkerImage(cardDef);
}
if (cardDef.isToken()) {
return buildTokenImage(cardDef);
}
return buildDefaultImage(cardDef);
}
private static BufferedImage buildDefaultImage(IRenderableCard cardDef) {
File fullImage = MagicFileSystem.getPrintedCardImage(cardDef);
if (fullImage.exists()) {
BufferedImage full = ImageHelper.scale(ImageFileIO.toImg(fullImage, MagicImages.MISSING_CARD),375,523);
return full.getSubimage(29, 60, 316, 231);
}
return getCompositeImage(getDefaultBackground(cardDef), getDefaultSymbol(cardDef));
}
private static BufferedImage buildPlaneswalkerImage(IRenderableCard cardDef) {
int WIDTH = 320;
int HEIGHT;
BufferedImage blend;
if (OracleText.getPlaneswalkerAbilityCount(cardDef) <= 3) {
HEIGHT = 234;
blend = ResourceManager.newFrame(CardResource.getPlaneswalkerImageBlend);
} else {
HEIGHT = 201;
blend = ImageHelper.scale(ResourceManager.newFrame(CardResource.getPlaneswalkerImageBlend), WIDTH, HEIGHT);
}
BufferedImage background = ImageHelper.scale(getDefaultBackground(cardDef), WIDTH, HEIGHT);
BufferedImage symbol = ImageHelper.scale(getDefaultSymbol(cardDef), WIDTH, HEIGHT);
BufferedImage image = Frame.getBlendedFrame(new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB), blend, background);
return getCompositeImage(image, symbol);
}
private static BufferedImage buildTokenImage(IRenderableCard cardDef) {
int HEIGHT;
BufferedImage blend;
if (cardDef.hasText()) {
HEIGHT = 289;
blend = ResourceManager.newFrame(CardResource.tokenImageMaskSmall);
} else {
HEIGHT = 360;
blend = ResourceManager.newFrame(CardResource.tokenImageMaskLarge);
}
int WIDTH = 317;
BufferedImage background = ImageHelper.scale(getDefaultBackground(cardDef), WIDTH, HEIGHT);
BufferedImage symbol = ImageHelper.scale(getDefaultSymbol(cardDef), WIDTH, HEIGHT);
BufferedImage image = Frame.getBlendedFrame(new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB), blend, background);
return getCompositeImage(image,symbol);
}
static BufferedImage getCompositeImage(BufferedImage baseFrame, BufferedImage topFrame) {
//create top Image
Graphics2D graphics2D = topFrame.createGraphics();
graphics2D.drawImage(topFrame, null, 0, 0);
graphics2D.dispose();
//draw top on top of baseFrame
Graphics2D graphics2D1 = baseFrame.createGraphics();
graphics2D1.drawImage(topFrame, null, 0, 0);
graphics2D1.dispose();
return ResourceManager.newFrame(baseFrame);
}
}