Merge pull request #4551 from spjspj/master

Adding in way to render Zendikar full art lands.
This commit is contained in:
spjspj 2018-02-26 15:31:10 +11:00 committed by GitHub
commit 871b035bb4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 281 additions and 84 deletions

View file

@ -302,7 +302,7 @@ public class CardPanelRenderImpl extends CardPanel {
= new CardPanelAttributes(cardWidth, cardHeight, isChoosable(), isSelected());
// Draw card itself
cardRenderer.draw(g2d, attribs);
cardRenderer.draw(g2d, attribs, image);
// Done
g2d.dispose();

View file

@ -17,10 +17,10 @@ import mage.view.PermanentView;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.image.RasterFormatException;
import java.util.ArrayList;
import java.util.List;
import java.awt.image.BufferedImage;
/**
* @author stravant@gmail.com
@ -201,7 +201,8 @@ public abstract class CardRenderer {
// The Draw Method
// The draw method takes the information caculated by the constructor
// and uses it to draw to a concrete size of card and graphics.
public void draw(Graphics2D g, CardPanelAttributes attribs) {
public void draw(Graphics2D g, CardPanelAttributes attribs, BufferedImage image) {
// Pre template method layout, to calculate shared layout info
layout(attribs.cardWidth, attribs.cardHeight);
isSelected = attribs.isSelected;
@ -211,7 +212,7 @@ public abstract class CardRenderer {
drawBorder(g);
drawBackground(g);
drawArt(g);
drawFrame(g);
drawFrame(g, image);
if (!cardView.isAbility()) {
drawOverlays(g);
drawCounters(g);
@ -226,7 +227,7 @@ public abstract class CardRenderer {
protected abstract void drawArt(Graphics2D g);
protected abstract void drawFrame(Graphics2D g);
protected abstract void drawFrame(Graphics2D g, BufferedImage image);
// Template methods that are possible to override, but unlikely to be
// overridden.
@ -462,22 +463,44 @@ public abstract class CardRenderer {
}
} else {
StringBuilder sbType = new StringBuilder();
for (SuperType superType : cardView.getSuperTypes()) {
sbType.append(superType).append(' ');
}
for (CardType cardType : cardView.getCardTypes()) {
sbType.append(cardType.toString()).append(' ');
}
if (!cardView.getSubTypes().isEmpty()) {
sbType.append("- ");
for (SubType subType : cardView.getSubTypes()) {
sbType.append(subType).append(' ');
String spType = getCardSuperTypeLine();
String subType = getCardSubTypeLine();
if (spType.equalsIgnoreCase("")) {
sbType.append(subType);
} else {
sbType.append(spType);
if (!subType.equalsIgnoreCase("")) {
sbType.append("- ");
sbType.append(subType);
}
}
return sbType.toString();
}
}
protected String getCardSuperTypeLine() {
StringBuilder spType = new StringBuilder();
for (SuperType superType : cardView.getSuperTypes()) {
spType.append(superType).append(' ');
}
for (CardType cardType : cardView.getCardTypes()) {
spType.append(cardType.toString()).append(' ');
}
return spType.toString();
}
protected String getCardSubTypeLine() {
StringBuilder subType = new StringBuilder();
if (!cardView.getSubTypes().isEmpty()) {
for (SubType sType : cardView.getSubTypes()) {
subType.append(sType).append(' ');
}
}
return subType.toString();
}
// Set the card art image (CardPanel will give it to us when it
// is loaded and ready)
public void setArtImage(Image image) {

View file

@ -52,7 +52,7 @@ public final class CardRendererUtils {
return bimage;
}
private static Color abitbrighter(Color c) {
public static Color abitbrighter(Color c) {
int r = c.getRed();
int g = c.getGreen();
int b = c.getBlue();
@ -68,7 +68,7 @@ public final class CardRendererUtils {
alpha);
}
private static Color abitdarker(Color c) {
public static Color abitdarker(Color c) {
int r = c.getRed();
int g = c.getGreen();
int b = c.getBlue();
@ -107,6 +107,36 @@ public final class CardRendererUtils {
g.setColor(abitdarker(g.getColor()));
g.drawLine(x + 1 + bevel, y + h - 2, x + 1 + bevel + w - 2 * bevel - 2, y + h - 2);
}
public static void drawZendikarLandBox(Graphics2D g, int x, int y, int w, int h, int bevel, Paint border, Paint fill) {
g.setColor(new Color(0, 0, 0, 150));
g.drawOval(x - 1, y, bevel * 2, h);
g.setPaint(border);
g.drawOval(x, y, bevel * 2 - 1, h - 1);
g.drawOval(x + w - bevel * 2, y, bevel * 2 - 1, h - 1);
g.drawOval(x + 1, y + 1, bevel * 2 - 3, h - 3);
g.drawOval(x + 1 + w - bevel * 2, y + 1, bevel * 2 - 3, h - 3);
// The big circle in the middle.. (diameter=2+1/4 of height) - 3/4 above line, 1/2 below 0.75 + .5 + 1= 2.25 = 9/4
g.drawOval(x + w / 2 - h - h/8, y - 3*h/4, 9*h/4, 9*h/4);
g.drawRect(x + bevel, y, w - 2 * bevel, h - 1);
g.drawRect(x + 1 + bevel, y + 1, w - 2 * bevel - 2, h - 3);
g.setPaint(fill);
g.setPaint(fill);
g.setColor(abitbrighter(g.getColor()));
g.drawLine(x + 1 + bevel, y + 1, x + 1 + bevel + w - 2 * bevel - 2, y + 1);
g.setPaint(fill);
g.setColor(abitdarker(g.getColor()));
g.drawLine(x + 1 + bevel, y + h - 2, x + 1 + bevel + w - 2 * bevel - 2, y + h - 2);
g.fillOval(x + 2, y + 2, bevel * 2 - 4, h - 4);
g.fillOval(x + 2 + w - bevel * 2, y + 2, bevel * 2 - 4, h - 4);
g.fillRect(x + bevel, y + 2, w - 2 * bevel, h - 4);
g.fillOval(x + w / 2 - h - h/8, y - 3*h/4, 9*h/4, 9*h/4);
}
// Get the width of a mana cost rendered with ManaSymbols.draw
public static int getManaCostWidth(String manaCost, int symbolSize) {

View file

@ -7,6 +7,7 @@ package org.mage.card.arcane;
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.QuadCurve2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
@ -312,6 +313,8 @@ public class ModernCardRenderer extends CardRenderer {
Rectangle2D rect;
if (useInventionFrame()) {
rect = new Rectangle2D.Float(0, 0, 1, 1);
} else if (cardView.getFrameStyle() == FrameStyle.ZEN_FULL_ART_BASIC) {
rect = new Rectangle2D.Float(.079f, .11f, .84f, .84f);
} else if (cardView.getFrameStyle().isFullArt() || (cardView.isToken())) {
rect = new Rectangle2D.Float(.079f, .11f, .84f, .63f);
} else {
@ -352,7 +355,7 @@ public class ModernCardRenderer extends CardRenderer {
if (artImage != null && !cardView.isFaceDown()) {
boolean useFaceArt = false;
if (faceArtImage != null) {
if (faceArtImage != null && cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) {
useFaceArt = true;
}
@ -395,17 +398,22 @@ public class ModernCardRenderer extends CardRenderer {
totalContentInset + 1, totalContentInset + boxHeight,
contentWidth - 2, typeLineY - totalContentInset - boxHeight,
sourceRect, shouldPreserveAspect);
} else {
} else if (cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) {
drawArtIntoRect(g,
totalContentInset + 1, totalContentInset + boxHeight,
contentWidth - 2, typeLineY - totalContentInset - boxHeight,
sourceRect, shouldPreserveAspect);
} else {
/* drawArtIntoRect(g,
totalContentInset + 1, totalContentInset + boxHeight,
contentWidth - 2, typeLineY,
sourceRect, shouldPreserveAspect);*/
}
}
}
@Override
protected void drawFrame(Graphics2D g) {
protected void drawFrame(Graphics2D g, BufferedImage image) {
// Get the card colors to base the frame on
ObjectColor frameColors = getFrameObjectColor();
@ -421,12 +429,13 @@ public class ModernCardRenderer extends CardRenderer {
// Draw the main card content border
g.setPaint(borderPaint);
if (cardView.getFrameStyle() == FrameStyle.KLD_INVENTION) {
g.drawImage(FRAME_INVENTION, 0, 0, cardWidth, cardHeight, null);
g.drawRect(
totalContentInset, typeLineY,
contentWidth - 1, cardHeight - borderWidth * 3 - typeLineY - 1);
} else {
} else if (cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) {
g.drawRect(
totalContentInset, totalContentInset,
contentWidth - 1, cardHeight - borderWidth * 3 - totalContentInset - 1);
@ -437,11 +446,13 @@ public class ModernCardRenderer extends CardRenderer {
g.setPaint(new Color(255, 255, 255, 150));
} else {
g.setPaint(textboxPaint);
}
g.fillRect(
totalContentInset + 1, typeLineY,
contentWidth - 2, cardHeight - borderWidth * 3 - typeLineY - 1);
if (cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) {
g.fillRect(
totalContentInset + 1, typeLineY,
contentWidth - 2, cardHeight - borderWidth * 3 - typeLineY - 1);
}
// If it's a planeswalker, extend the textbox left border by some
if (cardView.isPlanesWalker()) {
@ -451,7 +462,7 @@ public class ModernCardRenderer extends CardRenderer {
cardWidth / 16, cardHeight - typeLineY - boxHeight - borderWidth * 3);
}
if (cardView.getFrameStyle() != FrameStyle.KLD_INVENTION) {
if (cardView.getFrameStyle() != FrameStyle.KLD_INVENTION && cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) {
// Draw a shadow highlight at the right edge of the content frame
g.setColor(new Color(0, 0, 0, 100));
g.fillRect(
@ -470,26 +481,31 @@ public class ModernCardRenderer extends CardRenderer {
cardWidth - 2 * borderWidth, boxHeight,
contentInset,
borderPaint, boxColor);
// Draw the type line box
CardRendererUtils.drawRoundedBox(g,
borderWidth, typeLineY,
cardWidth - 2 * borderWidth, boxHeight,
contentInset,
borderPaint, boxColor);
if (cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) {
CardRendererUtils.drawRoundedBox(g,
borderWidth, typeLineY,
cardWidth - 2 * borderWidth, boxHeight,
contentInset,
borderPaint, boxColor);
// Draw a small separator between the type line and box, and shadow
// at the left of the texbox, and above the name line
g.setColor(new Color(0, 0, 0, 150));
g.fillRect(
totalContentInset - 1, totalContentInset - 1,
contentWidth + 1, 1);
g.fillRect(
totalContentInset + 1, typeLineY + boxHeight,
contentWidth - 2, 1);
g.fillRect(
cardWidth - totalContentInset - 1, typeLineY + boxHeight,
1, cardHeight - borderWidth * 3 - typeLineY - boxHeight);
// Draw a small separator between the type line and box, and shadow
// at the left of the texbox, and above the name line
g.setColor(new Color(0, 0, 0, 150));
g.fillRect(
totalContentInset - 1, totalContentInset - 1,
contentWidth + 1, 1);
g.fillRect(
totalContentInset + 1, typeLineY + boxHeight,
contentWidth - 2, 1);
g.fillRect(
cardWidth - totalContentInset - 1, typeLineY + boxHeight,
1, cardHeight - borderWidth * 3 - typeLineY - boxHeight);
// Draw the type line
drawTypeLine(g, getCardTypeLine(),
totalContentInset, typeLineY,
contentWidth, boxHeight, true);
}
// Draw the transform circle
int nameOffset = drawTransformationCircle(g, borderPaint);
@ -502,20 +518,126 @@ public class ModernCardRenderer extends CardRenderer {
totalContentInset + nameOffset, totalContentInset,
contentWidth - nameOffset, boxHeight);
// Draw the type line
drawTypeLine(g, getCardTypeLine(),
totalContentInset, typeLineY,
contentWidth, boxHeight);
// Draw the textbox rules
drawRulesText(g, textboxKeywords, textboxRules,
totalContentInset + 2, typeLineY + boxHeight + 2,
contentWidth - 4, cardHeight - typeLineY - boxHeight - 4 - borderWidth * 3);
if (cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) {
drawRulesText(g, textboxKeywords, textboxRules,
totalContentInset + 2, typeLineY + boxHeight + 2,
contentWidth - 4, cardHeight - typeLineY - boxHeight - 4 - borderWidth * 3);
} else {
int x = totalContentInset;
int y = typeLineY + boxHeight + (cardHeight - typeLineY - boxHeight - 4 - borderWidth * 3) / 2 - contentInset;
int w = contentWidth - 2;
int h = boxHeight - 4;
CardRendererUtils.drawZendikarLandBox(g,
x, y, w, h,
contentInset,
borderPaint, boxColor);
drawTypeLine(g, getCardSuperTypeLine(),
totalContentInset + 2, typeLineY + boxHeight + (cardHeight - typeLineY - boxHeight - 4 - borderWidth * 3) / 2 - contentInset,
contentWidth / 2 - boxHeight, boxHeight - 4, false);
drawTypeLine(g, getCardSubTypeLine(),
totalContentInset + 4 * contentWidth / 7 + boxHeight, typeLineY + boxHeight + (cardHeight - typeLineY - boxHeight - 4 - borderWidth * 3) / 2 - contentInset,
3 * contentWidth / 7 - boxHeight - contentInset, boxHeight - 4, true);
// Draw curved lines (old Zendikar land style) - bigger (around 6%) inset on curve on bottom than inset (around 4.5%) on top...
int x2 = x;
int y2 = y;
int topxdelta = 45 * contentWidth / 1000;
int botxdelta = 58 * contentWidth / 1000;
int ctrlx = 0;
int ctrly = (totalContentInset + y2) / 2;
drawZendikarCurvedFace(g, image, x + topxdelta, totalContentInset + boxHeight, ctrlx, ctrly, x2 + botxdelta, y2,
x + contentWidth - topxdelta, totalContentInset + boxHeight, cardWidth, ctrly, x2 + contentWidth - botxdelta, y2,
cardWidth, cardHeight);
QuadCurve2D q = new QuadCurve2D.Float();
q.setCurve(x + topxdelta, totalContentInset + boxHeight, ctrlx, ctrly, x2 + botxdelta, y2);
g.setColor(boxColor);
g.setPaint(borderPaint);
g.draw(q);
q.setCurve(x + topxdelta - 1, totalContentInset + boxHeight, ctrlx, ctrly, x2 + botxdelta - 1, y2);
g.draw(q);
q.setCurve(x + contentWidth - topxdelta, totalContentInset + boxHeight, cardWidth, ctrly, x2 + contentWidth - botxdelta, y2);
g.draw(q);
q.setCurve(x + contentWidth - topxdelta + 1, totalContentInset + boxHeight, cardWidth, ctrly, x2 + contentWidth - botxdelta + 1, y2);
g.draw(q);
g.setColor(Color.BLACK);
q.setCurve(x + topxdelta + 1, totalContentInset + boxHeight, ctrlx, ctrly, x2 + botxdelta + 1, y2 - 1);
g.draw(q);
q.setCurve(x + contentWidth - topxdelta - 1, totalContentInset + boxHeight, cardWidth, ctrly, x2 + contentWidth - botxdelta - 1, y2 - 1);
g.draw(q);
drawRulesText(g, textboxKeywords, textboxRules,
x, y,
w, h);
}
// Draw the bottom right stuff
drawBottomRight(g, borderPaint, boxColor);
}
public void drawZendikarCurvedFace(Graphics2D g2, BufferedImage image, int x, int y, int ctrlx, int ctrly, int w, int h,
int x2, int y2, int ctrlx2, int ctrly2, int w2, int h2,
int cardWidth, int cardHeight) {
BufferedImage artToUse = faceArtImage;
boolean hadToUseFullArt = false;
if (faceArtImage == null) {
if (artImage == null) {
return;
}
hadToUseFullArt = true;
artToUse = artImage;
}
int srcW = artToUse.getWidth();
int srcH = artToUse.getHeight();
if (hadToUseFullArt) {
// Get a box based on the standard scan from gatherer.
// Width = 185/223 pixels (centered)
// Height = 220/310, 38 pixels from top
int subx = 19 * srcW / 223;
int suby = 38 * srcH / 310;
artToUse = artImage.getSubimage(subx, suby, 185*srcW / 223, 220*srcH / 310);
}
Rectangle2D rect = new Rectangle2D.Float();
rect.setRect(0, 0, srcW, srcH);
g2.clip(rect);
QuadCurve2D q = new QuadCurve2D.Float();
q.setCurve(x, y, ctrlx, ctrly, w, h);
g2.setClip(null);
g2.clip(q);
//g2.drawImage(faceArtImage, x, y, (x2-x), (h2-y), null);
Rectangle2D r = q.getBounds2D();
int minX = (int) r.getX();
g2.drawImage(artToUse, minX, y, (x2 - x) + (x - minX) * 2, h2 - y, null);
QuadCurve2D q2 = new QuadCurve2D.Float();
q2.setCurve(x2, y2, ctrlx2, ctrly2, w2, h2);
g2.setClip(null);
g2.clip(q2);
g2.drawImage(artToUse, minX, y, (x2 - x) + (x - minX) * 2, h2 - y, null);
Polygon p = new Polygon();
//x = 10;
//y = 0;
p.addPoint(x, y);
p.addPoint(x2, y);
p.addPoint(w2, h2);
p.addPoint(w, h2);
p.addPoint(x, y);
g2.setClip(null);
g2.clip(p);
g2.drawImage(artToUse, minX, y, (x2 - x) + (x - minX) * 2, h2 - y, null);
g2.setClip(null);
}
// Draw the name line
protected void drawNameLine(Graphics2D g, String baseName, String manaCost, int x, int y, int w, int h) {
// Width of the mana symbols
@ -566,13 +688,13 @@ public class ModernCardRenderer extends CardRenderer {
}
// Draw the type line (color indicator, types, and expansion symbol)
protected void drawTypeLine(Graphics2D g, String baseTypeLine, int x, int y, int w, int h) {
protected void drawTypeLine(Graphics2D g, String baseTypeLine, int x, int y, int w, int h, boolean withSymbol) {
// Draw expansion symbol
int expansionSymbolWidth;
int expansionSymbolWidth = 0;
if (PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_RENDERING_SET_SYMBOL, "false").equals("false")) {
if (cardView.isAbility()) {
expansionSymbolWidth = 0;
} else {
} else if (withSymbol) {
expansionSymbolWidth = drawExpansionSymbol(g, x, y, w, h);
}
} else {
@ -792,9 +914,20 @@ public class ModernCardRenderer extends CardRenderer {
}
// Basic mana draw mana symbol in textbox (for basic lands)
if (allRules.size() == 1 && (allRules.get(0) instanceof TextboxBasicManaRule) && cardView.isLand()) {
drawBasicManaTextbox(g, x, y, w, h, ((TextboxBasicManaRule) allRules.get(0)).getBasicManaSymbol());
return;
if (allRules.size() == 1 && (allRules.get(0) instanceof TextboxBasicManaRule) && cardView.isLand() || cardView.getFrameStyle() == FrameStyle.ZEN_FULL_ART_BASIC) {
if (cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) {
drawBasicManaTextbox(g, x, y, w, h, ((TextboxBasicManaRule) allRules.get(0)).getBasicManaSymbol());
return;
} else // Big circle in the middle for Zendikar lands
if (allRules.size() == 1) {
drawBasicManaSymbol(g, x + w / 2 - h - h / 8, y - 3 * h / 4, 9 * h / 4, 9 * h / 4, ((TextboxBasicManaRule) allRules.get(0)).getBasicManaSymbol());
return;
} else {
if (allRules.size() > 1) {
drawBasicManaSymbol(g, x + w / 2 - h - h / 8, y - 3 * h / 4, 9 * h / 4, 9 * h / 4, cardView.getFrameColor().toString());
}
return;
}
}
// Go through possible font sizes in descending order to find the best fit
@ -847,6 +980,11 @@ public class ModernCardRenderer extends CardRenderer {
ManaSymbols.draw(g, symbs, x + (w - manaCostWidth) / 2, y + (h - symbHeight) / 2, symbHeight, Color.black, 2);
}
private void drawBasicManaSymbol(Graphics2D g, int x, int y, int w, int h, String symbol) {
String symbs = symbol;
ManaSymbols.draw(g, symbs, x, y, w, Color.black, 2);
}
// Get the first line of the textbox, the keyword string
private static String getKeywordRulesString(ArrayList<TextboxRule> keywords) {
StringBuilder builder = new StringBuilder();

View file

@ -8,6 +8,7 @@ import mage.view.CardView;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
@ -17,6 +18,7 @@ import java.util.List;
public class ModernSplitCardRenderer extends ModernCardRenderer {
private class HalfCardProps {
int x, y, w, h, cw, ch;
String name;
@ -27,7 +29,11 @@ public class ModernSplitCardRenderer extends ModernCardRenderer {
ArrayList<TextboxRule> keywords = new ArrayList<>();
}
private static ArrayList<CardType> ONLY_LAND_TYPE = new ArrayList<CardType>() {{add(CardType.LAND);}};
private static ArrayList<CardType> ONLY_LAND_TYPE = new ArrayList<CardType>() {
{
add(CardType.LAND);
}
};
// Right and left halves of the card content
private HalfCardProps rightHalf = new HalfCardProps();
@ -88,20 +94,20 @@ public class ModernSplitCardRenderer extends ModernCardRenderer {
// Decide size of divider
if (isAftermath()) {
dividerSize = borderWidth;
dividerAt = (int)(cardHeight*0.54);
dividerAt = (int) (cardHeight * 0.54);
} else {
int availHeight = cardHeight - totalContentInset - 3*borderWidth;
dividerSize = borderWidth*2;
dividerAt = (int)(totalContentInset + availHeight * 0.5 - borderWidth);
int availHeight = cardHeight - totalContentInset - 3 * borderWidth;
dividerSize = borderWidth * 2;
dividerAt = (int) (totalContentInset + availHeight * 0.5 - borderWidth);
}
// Decide size of each halves box
rightHalf.x = leftHalf.x = totalContentInset;
rightHalf.w = leftHalf.w = cardWidth - 2*totalContentInset;
rightHalf.w = leftHalf.w = cardWidth - 2 * totalContentInset;
leftHalf.y = totalContentInset;
leftHalf.h = dividerAt - totalContentInset;
rightHalf.y = dividerAt + dividerSize;
rightHalf.h = cardHeight - rightHalf.y - borderWidth*3;
rightHalf.h = cardHeight - rightHalf.y - borderWidth * 3;
// Content width / height (Exchanged from width / height if the card part is rotated)
if (isAftermath()) {
@ -126,7 +132,7 @@ public class ModernSplitCardRenderer extends ModernCardRenderer {
private ObjectColor getColorFromManaCostHack(ManaCosts costs) {
ObjectColor c = new ObjectColor();
List<String> symbols = costs.getSymbols();
for (String symbol: symbols) {
for (String symbol : symbols) {
if (symbol.contains("W")) {
c.setWhite(true);
} else if (symbol.contains("U")) {
@ -154,18 +160,18 @@ public class ModernSplitCardRenderer extends ModernCardRenderer {
// Draw main part (most of card)
g.fillRoundRect(
borderWidth, borderWidth,
cardWidth - 2*borderWidth, leftHalf.h + contentInset - borderWidth - 2*cornerRadius + (cornerRadius - 1),
cardWidth - 2 * borderWidth, leftHalf.h + contentInset - borderWidth - 2 * cornerRadius + (cornerRadius - 1),
cornerRadius - 1, cornerRadius - 1);
// Draw the M15 rounded "swoosh" at the bottom
g.fillRoundRect(
borderWidth, dividerAt - borderWidth - 4*cornerRadius,
cardWidth - 2*borderWidth, cornerRadius * 4,
borderWidth, dividerAt - borderWidth - 4 * cornerRadius,
cardWidth - 2 * borderWidth, cornerRadius * 4,
cornerRadius * 2, cornerRadius * 2);
// Draw the cutout into the "swoosh" for the textbox to lie over
g.fillRect(
borderWidth + contentInset, dividerAt - 2*borderWidth,
borderWidth + contentInset, dividerAt - 2 * borderWidth,
cardWidth - borderWidth * 2 - contentInset * 2, borderWidth * 2);
}
@ -176,8 +182,8 @@ public class ModernSplitCardRenderer extends ModernCardRenderer {
// Draw the M15 rounded "swoosh"es at the top and bottom
g.fillRoundRect(
borderWidth, dividerAt + dividerSize + borderWidth,
cardWidth - 2*borderWidth, rightHalf.h - 2*borderWidth,
cornerRadius*2, cornerRadius*2);
cardWidth - 2 * borderWidth, rightHalf.h - 2 * borderWidth,
cornerRadius * 2, cornerRadius * 2);
// Draw the cutout into the "swoosh" for the textbox to lie over
g.fillRect(
@ -236,8 +242,8 @@ public class ModernSplitCardRenderer extends ModernCardRenderer {
// Background of textbox
g.setPaint(textboxPaint);
g.fillRect(
1, typeLineY,
half.cw - 2, half.ch - typeLineY - 1);
1, typeLineY,
half.cw - 2, half.ch - typeLineY - 1);
// Draw the name line box
CardRendererUtils.drawRoundedBox(g,
@ -261,7 +267,7 @@ public class ModernSplitCardRenderer extends ModernCardRenderer {
// Draw the type line
drawTypeLine(g, half.typeLineString,
0, typeLineY,
half.cw, boxHeight - 4);
half.cw, boxHeight - 4, true);
// Draw the textbox rules
drawRulesText(g, half.keywords, half.rules,
@ -270,13 +276,13 @@ public class ModernSplitCardRenderer extends ModernCardRenderer {
}
private Graphics2D getUnmodifiedHalfContext(Graphics2D g) {
Graphics2D g2 = (Graphics2D)g.create();
Graphics2D g2 = (Graphics2D) g.create();
g2.translate(leftHalf.x, leftHalf.y);
return g2;
}
private Graphics2D getAftermathHalfContext(Graphics2D g) {
Graphics2D g2 = (Graphics2D)g.create();
Graphics2D g2 = (Graphics2D) g.create();
g2.translate(rightHalf.x, rightHalf.y);
g2.rotate(Math.PI / 2);
g2.translate(0, -rightHalf.w);
@ -284,7 +290,7 @@ public class ModernSplitCardRenderer extends ModernCardRenderer {
}
private Graphics2D getLeftHalfContext(Graphics2D g) {
Graphics2D g2 = (Graphics2D)g.create();
Graphics2D g2 = (Graphics2D) g.create();
g2.translate(leftHalf.x, leftHalf.y);
g2.rotate(-Math.PI / 2);
g2.translate(-leftHalf.cw, 0);
@ -292,7 +298,7 @@ public class ModernSplitCardRenderer extends ModernCardRenderer {
}
private Graphics2D getRightHalfContext(Graphics2D g) {
Graphics2D g2 = (Graphics2D)g.create();
Graphics2D g2 = (Graphics2D) g.create();
g2.translate(rightHalf.x, rightHalf.y);
g2.rotate(-Math.PI / 2);
g2.translate(-rightHalf.cw, 0);
@ -300,13 +306,13 @@ public class ModernSplitCardRenderer extends ModernCardRenderer {
}
@Override
protected void drawFrame(Graphics2D g) {
protected void drawFrame(Graphics2D g, BufferedImage image) {
if (isAftermath()) {
drawSplitHalfFrame(getUnmodifiedHalfContext(g), leftHalf, (int)(leftHalf.ch * TYPE_LINE_Y_FRAC));
drawSplitHalfFrame(getUnmodifiedHalfContext(g), leftHalf, (int) (leftHalf.ch * TYPE_LINE_Y_FRAC));
drawSplitHalfFrame(getAftermathHalfContext(g), rightHalf, (rightHalf.ch - boxHeight) / 2);
} else {
drawSplitHalfFrame(getLeftHalfContext(g), leftHalf, (int)(leftHalf.ch * TYPE_LINE_Y_FRAC));
drawSplitHalfFrame(getRightHalfContext(g), rightHalf, (int)(rightHalf.ch * TYPE_LINE_Y_FRAC));
drawSplitHalfFrame(getLeftHalfContext(g), leftHalf, (int) (leftHalf.ch * TYPE_LINE_Y_FRAC));
drawSplitHalfFrame(getRightHalfContext(g), rightHalf, (int) (rightHalf.ch * TYPE_LINE_Y_FRAC));
if (isFuse()) {
Graphics2D g2 = getRightHalfContext(g);
int totalFuseBoxWidth = rightHalf.cw * 2 + 2 * borderWidth + dividerSize;
@ -319,7 +325,7 @@ public class ModernSplitCardRenderer extends ModernCardRenderer {
borderPaint, boxColor);
drawNameLine(g2, "Fuse (You may cast both halves from your hand)", "",
0, rightHalf.ch,
totalFuseBoxWidth - 2*borderWidth, boxHeight);
totalFuseBoxWidth - 2 * borderWidth, boxHeight);
}
}
}