From 8cf065e3458400baf560a7a7e8edd117bc7a0748 Mon Sep 17 00:00:00 2001 From: spjspj Date: Sat, 3 Mar 2018 23:51:47 +1100 Subject: [PATCH] For actual cards on modo, the full background is always printed to it (not just part of the top left corner of the background). --- .../mage/card/arcane/ModernCardRenderer.java | 81 ++++++++++++++---- .../cardrender/background_texture_vehicle.png | Bin 685 -> 19249 bytes 2 files changed, 65 insertions(+), 16 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/ModernCardRenderer.java b/Mage.Client/src/main/java/org/mage/card/arcane/ModernCardRenderer.java index b34eab7801e..25264f7cde4 100644 --- a/Mage.Client/src/main/java/org/mage/card/arcane/ModernCardRenderer.java +++ b/Mage.Client/src/main/java/org/mage/card/arcane/ModernCardRenderer.java @@ -8,8 +8,10 @@ package org.mage.card.arcane; import java.awt.*; import java.awt.font.*; import java.awt.geom.Arc2D; +import java.awt.geom.Area; import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; @@ -70,6 +72,13 @@ public class ModernCardRenderer extends CardRenderer { BufferedImage img = CardRendererUtils.toBufferedImage(icon.getImage()); return new TexturePaint(img, new Rectangle(0, 0, img.getWidth(), img.getHeight())); } + + private static BufferedImage loadBackgroundImage(String name) { + URL url = ModernCardRenderer.class.getResource("/cardrender/background_texture_" + name + ".png"); + ImageIcon icon = new ImageIcon(url); + BufferedImage img = CardRendererUtils.toBufferedImage(icon.getImage()); + return img; + } private static BufferedImage loadFramePart(String name) { URL url = ModernCardRenderer.class.getResource("/cardrender/" + name + ".png"); @@ -99,6 +108,16 @@ public class ModernCardRenderer extends CardRenderer { public static final Paint BG_TEXTURE_ARTIFACT = loadBackgroundTexture("artifact"); public static final Paint BG_TEXTURE_LAND = loadBackgroundTexture("land"); public static final Paint BG_TEXTURE_VEHICLE = loadBackgroundTexture("vehicle"); + + public static final BufferedImage BG_IMG_WHITE = loadBackgroundImage("white"); + public static final BufferedImage BG_IMG_BLUE = loadBackgroundImage("blue"); + public static final BufferedImage BG_IMG_BLACK = loadBackgroundImage("black"); + public static final BufferedImage BG_IMG_RED = loadBackgroundImage("red"); + public static final BufferedImage BG_IMG_GREEN = loadBackgroundImage("green"); + public static final BufferedImage BG_IMG_GOLD = loadBackgroundImage("gold"); + public static final BufferedImage BG_IMG_ARTIFACT = loadBackgroundImage("artifact"); + public static final BufferedImage BG_IMG_LAND = loadBackgroundImage("land"); + public static final BufferedImage BG_IMG_VEHICLE = loadBackgroundImage("vehicle"); public static final BufferedImage FRAME_INVENTION = loadFramePart("invention_frame"); @@ -281,27 +300,30 @@ public class ModernCardRenderer extends CardRenderer { // Just draw a brown rectangle drawCardBack(g); } else { - BufferedImage bufferedImage = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB); - - // Set texture to paint with - g.setPaint(getBackgroundPaint(cardView.getColor(), cardView.getCardTypes(), cardView.getSubTypes())); + BufferedImage bg = getBackgroundImage(cardView.getColor(), cardView.getCardTypes(), cardView.getSubTypes()); + if (bg == null) { + return; + } + int bgw = bg.getWidth(); + int bgh = bg.getHeight(); // Draw main part (most of card) - g.fillRoundRect( - borderWidth, borderWidth, + RoundRectangle2D rr = new RoundRectangle2D.Double(borderWidth, borderWidth, cardWidth - borderWidth * 2, cardHeight - borderWidth * 4 - cornerRadius * 2, cornerRadius - 1, cornerRadius - 1); + Area a = new Area(rr); - // Draw the M15 rounded "swoosh" at the bottom - g.fillRoundRect( - borderWidth, cardHeight - borderWidth * 4 - cornerRadius * 4, + RoundRectangle2D rr2 = new RoundRectangle2D.Double(borderWidth, cardHeight - borderWidth * 4 - cornerRadius * 4, cardWidth - borderWidth * 2, cornerRadius * 4, cornerRadius * 2, cornerRadius * 2); - - // Draw the cutout into the "swoosh" for the textbox to lie over - g.fillRect( - borderWidth + contentInset, cardHeight - borderWidth * 5, - cardWidth - borderWidth * 2 - contentInset * 2, borderWidth * 2); + a.add(new Area(rr2)); + + // Draw the M15 rounded "swoosh" at the bottom + Rectangle r = new Rectangle(borderWidth + contentInset, cardHeight - borderWidth * 5, cardWidth - borderWidth * 2 - contentInset * 2, borderWidth * 2); + a.add(new Area(r)); + g.setClip(a); + g.drawImage(bg, 0, 0, cardWidth, cardHeight, 0, 0, bgw, bgh, BOX_BLUE, null); + g.setClip(null); } } @@ -545,7 +567,7 @@ public class ModernCardRenderer extends CardRenderer { int x2 = x + contentWidth; int y2 = y; int thisy = totalContentInset + boxHeight; - drawZendikarCurvedFace(g, image, x, thisy, x2, y2, + drawZendikarCurvedFace(g, image, x, thisy, x2, y2, boxColor, borderPaint); } else if (cardView.getFrameStyle() == FrameStyle.BFZ_FULL_ART_BASIC) { // Draw curved lines (BFZ land style) @@ -1249,7 +1271,34 @@ public class ModernCardRenderer extends CardRenderer { return new Color(71, 86, 101); } } - + + // Determine which background image to use from a set of colors + // and the current card. + protected static BufferedImage getBackgroundImage(ObjectColor colors, Collection types, SubTypeList subTypes) { + if (subTypes.contains(SubType.VEHICLE)) { + return BG_IMG_VEHICLE; + } else if (types.contains(CardType.LAND)) { + return BG_IMG_LAND; + } else if (types.contains(CardType.ARTIFACT)) { + return BG_IMG_ARTIFACT; + } else if (colors.isMulticolored()) { + return BG_IMG_GOLD; + } else if (colors.isWhite()) { + return BG_IMG_WHITE; + } else if (colors.isBlue()) { + return BG_IMG_BLUE; + } else if (colors.isBlack()) { + return BG_IMG_BLACK; + } else if (colors.isRed()) { + return BG_IMG_RED; + } else if (colors.isGreen()) { + return BG_IMG_GREEN; + } else { + // Colorless + return null; + } + } + // Get the box color for the given colors protected Color getBoxColor(ObjectColor colors, Collection types, boolean isNightCard) { if (cardView.isAbility()) { diff --git a/Mage.Client/src/main/resources/cardrender/background_texture_vehicle.png b/Mage.Client/src/main/resources/cardrender/background_texture_vehicle.png index 2f58f34a36174e2509d793d5414726fc8157be6b..87282e34bc8e3e7e5d1a5e9545257de32c40cd3e 100644 GIT binary patch literal 19249 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 XvsaK>K~^c800000NkvXXu0mjf8eAxT