diff --git a/forge-gui-desktop/src/main/java/forge/ImageCache.java b/forge-gui-desktop/src/main/java/forge/ImageCache.java index 491661487a5..ed296c269af 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageCache.java +++ b/forge-gui-desktop/src/main/java/forge/ImageCache.java @@ -82,8 +82,12 @@ public class ImageCache { .expireAfterAccess(15, TimeUnit.MINUTES) .build(new ImageLoader()); private static final BufferedImage _defaultImage; + private static final BufferedImage _stars; + private static final BufferedImage _inv_stars; static { BufferedImage defImage = null; + BufferedImage stars = null; + BufferedImage inv_stars = null; try { defImage = ImageIO.read(new File(ForgeConstants.NO_CARD_FILE)); } catch (Exception ex) { @@ -91,6 +95,40 @@ public class ImageCache { } finally { _defaultImage = (null == defImage) ? new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB) : defImage; } + try { + stars = ImageIO.read(new File(ForgeConstants.STARS_FILE)); + inv_stars =ImageIO.read(new File(ForgeConstants.STARS_FILE)); + // https://github.com/yusufshakeel/Java-Image-Processing-Project/blob/master/example/Negative.java + //get image width and height + int width = inv_stars.getWidth(); + int height = inv_stars.getHeight(); + + //convert to negative + for(int y = 0; y < height; y++){ + for(int x = 0; x < width; x++){ + int p = inv_stars.getRGB(x,y); + + int a = (p>>24)&0xff; + int r = (p>>16)&0xff; + int g = (p>>8)&0xff; + int b = p&0xff; + + //subtract RGB from 255 + r = 255 - r; + g = 255 - g; + b = 255 - b; + + //set new RGB value + p = (a<<24) | (r<<16) | (g<<8) | b; + inv_stars.setRGB(x, y, p); + } + } + } catch (Exception ex) { + System.err.println("could not load default stars image"); + } finally { + _stars = (null == stars) ? new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB) : stars; + _inv_stars = (null == inv_stars) ? new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB) : inv_stars; + } } public static void clear() { @@ -464,4 +502,8 @@ public class ImageCache { } public static BufferedImage getDefaultImage() { return _defaultImage; } + + public static BufferedImage getStarsImage() { return _stars; } + + public static BufferedImage getInvertedStarsImage() { return _inv_stars; } } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java index a0c12ad1a5a..5f0934b2c60 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import forge.ImageCache; import org.apache.commons.lang3.StringUtils; import forge.card.CardRarity; @@ -287,6 +288,11 @@ public class FCardImageRenderer { //determine colors for borders final List borderColors = CardDetailUtil.getBorderColors(state, true); Color[] colors = fillColorBackground(g, borderColors, x, y, w, h, BLACK_BORDER_THICKNESS); + if (state.isEnchantment()) { + //draw fake nyx effect + g.drawImage(state.getColors().hasWhite() && state.getColors().countColors() == 1 ? + ImageCache.getInvertedStarsImage() : ImageCache.getStarsImage(), x, y, w, h, null); + } x += OUTER_BORDER_THICKNESS; y += OUTER_BORDER_THICKNESS; diff --git a/forge-gui/res/defaults/stars.png b/forge-gui/res/defaults/stars.png new file mode 100644 index 00000000000..1390f0dcd0e Binary files /dev/null and b/forge-gui/res/defaults/stars.png differ diff --git a/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java index 9fc2f2cbc84..699d85aac5f 100644 --- a/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java @@ -67,20 +67,20 @@ public class CardDetailUtil { public static DetailColors getBorderColor(final CardStateView card, final boolean canShow) { if (card == null) { - return getBorderColors(null, false, false, false).iterator().next(); + return getBorderColors(null, false, false, false, false).iterator().next(); } - return getBorderColors(card.getColors(), card.isLand(), canShow, false).iterator().next(); + return getBorderColors(card.getColors(), card.isLand(), canShow, false, card.isEnchantment()).iterator().next(); } public static List getBorderColors(final CardStateView card, final boolean canShow) { if (card == null) { - return getBorderColors(null, false, false, true); + return getBorderColors(null, false, false, true, false); } - return getBorderColors(card.getColors(), card.isLand(), canShow, true); + return getBorderColors(card.getColors(), card.isLand(), canShow, true, card.isEnchantment()); } public static List getBorderColors(final ColorSet colorSet) { - return getBorderColors(colorSet, false, true, true); + return getBorderColors(colorSet, false, true, true, false); } - private static List getBorderColors(final ColorSet cardColors, final boolean isLand, final boolean canShow, final boolean supportMultiple) { + private static List getBorderColors(final ColorSet cardColors, final boolean isLand, final boolean canShow, final boolean supportMultiple, final boolean isEnchantment) { final List borderColors = new ArrayList<>(); if (cardColors == null || !canShow) { diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java index e148705256e..5fcfee4aed5 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java @@ -279,6 +279,7 @@ public final class ForgeConstants { // data that has defaults in the program dir but overrides/additions in the user dir private static final String _DEFAULTS_DIR = RES_DIR + "defaults" + PATH_SEPARATOR; public static final String NO_CARD_FILE = _DEFAULTS_DIR + "no_card.jpg"; + public static final String STARS_FILE = _DEFAULTS_DIR + "stars.png"; public static final FileLocation WINDOW_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "window.xml"); public static final FileLocation MATCH_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "match.xml"); public static final FileLocation WORKSHOP_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "workshop.xml");