From 596ca5be867db81f46082827fe46c2dcb6de27de Mon Sep 17 00:00:00 2001 From: spjspj <spjspj4@gmail.com> Date: Wed, 28 Feb 2018 01:25:29 +1100 Subject: [PATCH] Adding in way to render BFZ style full art lands (BFZ and HOU full art lands) Things still to do: 1) Get everyone to download the full art Face images ... 2) Add in the collector number to the Face images (<ImageDirector>/FACE/ZEN/Island.<numberneeded>.jpg for example) 4) Maybe even add in an UST (Unstable) way of rendering lands (with the swoosh of opaque full art down the bottom). --- .../mage/card/arcane/ModernCardRenderer.java | 120 ++++++++++++++---- 1 file changed, 95 insertions(+), 25 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 51e7957759..3cd5cbe0bd 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 @@ -313,7 +313,7 @@ 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) { + } else if (isZendikarFullArtLand()) { rect = new Rectangle2D.Float(.079f, .11f, .84f, .84f); } else if (cardView.getFrameStyle().isFullArt() || (cardView.isToken())) { rect = new Rectangle2D.Float(.079f, .11f, .84f, .63f); @@ -332,6 +332,10 @@ public class ModernCardRenderer extends CardRenderer { return TYPE_LINE_Y_FRAC; } } + + private boolean isZendikarFullArtLand() { + return cardView.getFrameStyle() == FrameStyle.BFZ_FULL_ART_BASIC || cardView.getFrameStyle() == FrameStyle.ZEN_FULL_ART_BASIC; + } protected boolean isSourceArtFullArt() { int color = artImage.getRGB(0, artImage.getHeight() / 2); @@ -355,7 +359,7 @@ public class ModernCardRenderer extends CardRenderer { if (artImage != null && !cardView.isFaceDown()) { boolean useFaceArt = false; - if (faceArtImage != null && cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) { + if (faceArtImage != null && !isZendikarFullArtLand()) { useFaceArt = true; } @@ -398,16 +402,11 @@ public class ModernCardRenderer extends CardRenderer { totalContentInset + 1, totalContentInset + boxHeight, contentWidth - 2, typeLineY - totalContentInset - boxHeight, sourceRect, shouldPreserveAspect); - } else if (cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) { + } else if (!isZendikarFullArtLand()) { 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);*/ } } } @@ -435,7 +434,7 @@ public class ModernCardRenderer extends CardRenderer { g.drawRect( totalContentInset, typeLineY, contentWidth - 1, cardHeight - borderWidth * 3 - typeLineY - 1); - } else if (cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) { + } else if (!isZendikarFullArtLand()) { g.drawRect( totalContentInset, totalContentInset, contentWidth - 1, cardHeight - borderWidth * 3 - totalContentInset - 1); @@ -448,7 +447,7 @@ public class ModernCardRenderer extends CardRenderer { g.setPaint(textboxPaint); } - if (cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) { + if (!isZendikarFullArtLand()) { g.fillRect( totalContentInset + 1, typeLineY, contentWidth - 2, cardHeight - borderWidth * 3 - typeLineY - 1); @@ -462,7 +461,7 @@ public class ModernCardRenderer extends CardRenderer { cardWidth / 16, cardHeight - typeLineY - boxHeight - borderWidth * 3); } - if (cardView.getFrameStyle() != FrameStyle.KLD_INVENTION && cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) { + if (cardView.getFrameStyle() != FrameStyle.KLD_INVENTION && !isZendikarFullArtLand()) { // Draw a shadow highlight at the right edge of the content frame g.setColor(new Color(0, 0, 0, 100)); g.fillRect( @@ -482,7 +481,7 @@ public class ModernCardRenderer extends CardRenderer { contentInset, borderPaint, boxColor); // Draw the type line box - if (cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) { + if (!isZendikarFullArtLand()) { CardRendererUtils.drawRoundedBox(g, borderWidth, typeLineY, cardWidth - 2 * borderWidth, boxHeight, @@ -519,7 +518,7 @@ public class ModernCardRenderer extends CardRenderer { contentWidth - nameOffset, boxHeight); // Draw the textbox rules - if (cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) { + if (!isZendikarFullArtLand()) { drawRulesText(g, textboxKeywords, textboxRules, totalContentInset + 2, typeLineY + boxHeight + 2, contentWidth - 4, cardHeight - typeLineY - boxHeight - 4 - borderWidth * 3); @@ -540,17 +539,31 @@ public class ModernCardRenderer extends CardRenderer { 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; + if (cardView.getFrameStyle() == FrameStyle.ZEN_FULL_ART_BASIC) { + // 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, - boxColor, borderPaint); + drawZendikarCurvedFace(g, image, x + topxdelta, totalContentInset + boxHeight, ctrlx, ctrly, x2 + botxdelta, y2, + x + contentWidth - topxdelta, totalContentInset + boxHeight, cardWidth, ctrly, x2 + contentWidth - botxdelta, y2, + boxColor, borderPaint); + } else if (cardView.getFrameStyle() == FrameStyle.BFZ_FULL_ART_BASIC) { + // Draw curved lines (BFZ land style) + int y2 = y; + int yb = totalContentInset + boxHeight; + int topxdelta = 45 * contentWidth / 1000; + int endydelta = 60 * (totalContentInset + y2) / 265; + int x2 = x + contentWidth; + + // Curve ends at 60 out of 265 + drawBFZCurvedFace(g, image, x, yb, x2, y2, + topxdelta, endydelta, + boxColor, borderPaint); + } drawRulesText(g, textboxKeywords, textboxRules, x, y, @@ -615,6 +628,63 @@ public class ModernCardRenderer extends CardRenderer { //curve.transform(AffineTransform.getTranslateInstance(-1,-1)); g2.draw(innercurve); } + + public void drawBFZCurvedFace(Graphics2D g2, BufferedImage image, int x, int y, int x2, int y2, + int topxdelta, int endydelta, + Color boxColor, Paint paint) { + 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); + } + + Path2D.Double curve = new Path2D.Double(); + curve.moveTo(x + topxdelta, y); + curve.quadTo(x, y + endydelta / 2, x, y + endydelta); + curve.lineTo(x, y2); + curve.lineTo(x2, y2); + curve.lineTo(x2, y + endydelta); + curve.quadTo(x2, y + endydelta / 2, x2 - topxdelta, y); + curve.lineTo(x + topxdelta, y); + + Path2D.Double innercurve = new Path2D.Double(); + innercurve.moveTo(x + topxdelta, y+1); + innercurve.quadTo(x+1, y + endydelta / 2, x+1, y + endydelta); + innercurve.lineTo(x+1, y2-1); + innercurve.lineTo(x2-1, y2-1); + innercurve.lineTo(x2-1, y + endydelta); + innercurve.quadTo(x2-1, y + endydelta / 2, x2 - topxdelta, y+1); + innercurve.lineTo(x + topxdelta, y+1); + + Rectangle2D r = curve.getBounds2D(); + int minX = (int) r.getX(); + + g2.setClip(curve); + g2.drawImage(artToUse, minX, y, (x2 - x) + (x - minX) * 2, y2 - y, null); + + g2.setClip(null); + g2.setColor(CardRendererUtils.abitdarker(boxColor)); + g2.setPaint(paint); + g2.draw(curve); + + g2.setColor(Color.black); + g2.draw(innercurve); + } // Draw the name line protected void drawNameLine(Graphics2D g, String baseName, String manaCost, int x, int y, int w, int h) { @@ -892,8 +962,8 @@ 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() || cardView.getFrameStyle() == FrameStyle.ZEN_FULL_ART_BASIC) { - if (cardView.getFrameStyle() != FrameStyle.ZEN_FULL_ART_BASIC) { + if (allRules.size() == 1 && (allRules.get(0) instanceof TextboxBasicManaRule) && cardView.isLand() || isZendikarFullArtLand()) { + if (!isZendikarFullArtLand()) { drawBasicManaTextbox(g, x, y, w, h, ((TextboxBasicManaRule) allRules.get(0)).getBasicManaSymbol()); return; } else // Big circle in the middle for Zendikar lands