From 98e86f17bdabab0260a41c68cf46d059056b3c14 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 10 Oct 2019 14:31:22 +0800 Subject: [PATCH] Add FPS Display, Add Preload Extended Art, Add Border Images --- forge-gui-mobile/src/forge/Forge.java | 26 +++++++++++ .../src/forge/assets/FSkinImage.java | 4 ++ .../src/forge/assets/ImageCache.java | 45 +++++++++++++++++++ .../src/forge/assets/ImageLoader.java | 2 +- .../src/forge/card/CardImageRenderer.java | 2 +- .../src/forge/card/CardRenderer.java | 4 +- .../src/main/java/forge/assets/FSkinProp.java | 4 ++ .../java/forge/properties/ForgeConstants.java | 1 + 8 files changed, 84 insertions(+), 4 deletions(-) diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 226a8e96882..c5263a2eed9 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -35,6 +35,8 @@ import forge.util.FileUtil; import forge.util.Localizer; import forge.util.Utils; +import java.io.File; +import java.io.FileFilter; import java.util.ArrayList; import java.util.List; import java.util.Stack; @@ -136,8 +138,32 @@ public class Forge implements ApplicationListener { }); } + private void preloadExtendedArt() { + List keys = new ArrayList<>(); + File[] directories = new File(ForgeConstants.CACHE_CARD_PICS_DIR).listFiles(new FileFilter() { + @Override + public boolean accept(File file) { + if (!file.getName().startsWith("MPS_")) + return false; + return file.isDirectory(); + } + }); + for (File folder : directories) { + File[] files = new File(folder.toString()).listFiles(); + for (File file : files) { + if (file.isFile()) { + keys.add(folder.getName() + "/" +file.getName().replace(".jpg","").replace(".png","")); + } + } + } + for (String artKeys : keys) { + ImageCache.preloadCache(artKeys); + } + } + private void afterDbLoaded() { stopContinuousRendering(); //save power consumption by disabling continuous rendering once assets loaded + preloadExtendedArt(); // Preloads Extended Art to Cache... FSkin.loadFull(splashScreen); diff --git a/forge-gui-mobile/src/forge/assets/FSkinImage.java b/forge-gui-mobile/src/forge/assets/FSkinImage.java index 7048fe68698..cdaaceeaaf7 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinImage.java +++ b/forge-gui-mobile/src/forge/assets/FSkinImage.java @@ -282,6 +282,9 @@ public enum FSkinImage implements FImage { IMG_ABILITY_HEXPROOF_UB (FSkinProp.IMG_ABILITY_HEXPROOF_UB, SourceFile.ABILITIES), //token icon IMG_ABILITY_TOKEN (FSkinProp.IMG_ABILITY_TOKEN, SourceFile.ABILITIES), + //border + IMG_BORDER_BLACK (FSkinProp.IMG_BORDER_BLACK, SourceFile.BORDERS), + IMG_BORDER_WHITE (FSkinProp.IMG_BORDER_WHITE, SourceFile.BORDERS), //PROTECT ICONS IMG_ABILITY_PROTECT_ALL (FSkinProp.IMG_ABILITY_PROTECT_ALL, SourceFile.ABILITIES), IMG_ABILITY_PROTECT_B (FSkinProp.IMG_ABILITY_PROTECT_B, SourceFile.ABILITIES), @@ -308,6 +311,7 @@ public enum FSkinImage implements FImage { OLD_FOILS(ForgeConstants.SPRITE_OLD_FOILS_FILE), TROPHIES(ForgeConstants.SPRITE_TROPHIES_FILE), ABILITIES(ForgeConstants.SPRITE_ABILITY_FILE), + BORDERS(ForgeConstants.SPRITE_BORDER_FILE), MANAICONS(ForgeConstants.SPRITE_MANAICONS_FILE), PLANAR_CONQUEST(ForgeConstants.SPRITE_PLANAR_CONQUEST_FILE); diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java index 57a680cdabd..ad7874620bc 100644 --- a/forge-gui-mobile/src/forge/assets/ImageCache.java +++ b/forge-gui-mobile/src/forge/assets/ImageCache.java @@ -64,6 +64,8 @@ public class ImageCache { .loader(new ImageLoader()) .build(); public static final Texture defaultImage; + public static FImage BlackBorder = FSkinImage.IMG_BORDER_BLACK; + public static FImage WhiteBorder = FSkinImage.IMG_BORDER_WHITE; private static boolean imageLoaded, delayLoadRequested; public static void allowSingleLoad() { @@ -162,6 +164,20 @@ public class ImageCache { } return image; } + public static void preloadCache(String imageKey) { + if (StringUtils.isEmpty(imageKey)) { + return; + } + Texture image; + try { image = cache.get(imageKey); } + catch (final Exception ex) { + image = null; + } + if (image == null) { + image = defaultImage; + cache.put(imageKey, defaultImage); + } + } public static TextureRegion croppedBorderImage(Texture image) { float rscale = 0.96f; int rw = Math.round(image.getWidth()*rscale); @@ -171,6 +187,25 @@ public class ImageCache { TextureRegion rimage = new TextureRegion(image, rx, ry, rw, rh); return rimage; } + public static boolean isWhiteBordered(IPaperCard c) { + if (c == null) + return false; + + CardEdition ed = FModel.getMagicDb().getEditions().get(c.getEdition()); + if (ed != null && ed.isWhiteBorder()) + return true; + return false; + } + public static boolean isWhiteBordered(CardView c) { + if (c == null) + return false; + + CardView.CardStateView state = c.getCurrentState(); + CardEdition ed = FModel.getMagicDb().getEditions().get(state.getSetCode()); + if (ed != null && ed.isWhiteBorder() && state.getFoilIndex() == 0) + return true; + return false; + } public static Color borderColor(IPaperCard c) { if (c == null) return Color.valueOf("#171717"); @@ -207,4 +242,14 @@ public class ImageCache { return true; return false; } + public static FImage getBorderImage(CardView c) { + if (isWhiteBordered(c)) + return WhiteBorder; + return BlackBorder; + } + public static FImage getBorderImage(IPaperCard c) { + if (isWhiteBordered(c)) + return WhiteBorder; + return BlackBorder; + } } diff --git a/forge-gui-mobile/src/forge/assets/ImageLoader.java b/forge-gui-mobile/src/forge/assets/ImageLoader.java index 2670a4e65f3..463fdd783fd 100644 --- a/forge-gui-mobile/src/forge/assets/ImageLoader.java +++ b/forge-gui-mobile/src/forge/assets/ImageLoader.java @@ -21,7 +21,7 @@ final class ImageLoader extends CacheLoader { if (key.length() > 4){ if ((key.substring(0,4).contains("MPS_"))) //TODO add sets to get all extended art??? extendedArt = true; - //use generated extended art... very few cards have this so little performance lost + //use generated extended art... it will preload the cache at startup so... yeah! :) } File file = ImageKeys.getImageFile(key); if (file != null) { diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index 3d76e75f9a3..5fe46790263 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -391,7 +391,7 @@ public class CardImageRenderer { if (ImageCache.isExtendedArt(card)) g.drawImage(image, x, y, w, h); else { - g.drawfillBorder(3, ImageCache.borderColor(card), x, y, w, h, radius); + g.drawImage(ImageCache.getBorderImage(card), x, y, w, h); g.drawImage(ImageCache.croppedBorderImage(image), x + radius / 2.4f, y + radius / 2, w * 0.96f, h * 0.96f); } } diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index c7335dd27da..7a693f153cf 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -405,7 +405,7 @@ public class CardRenderer { if (ImageCache.isExtendedArt(pc)) g.drawImage(image, x, y, w, h); else { - g.drawfillBorder(3, ImageCache.borderColor(pc), x, y, w, h, radius); + g.drawImage(ImageCache.getBorderImage(pc), x, y, w, h); g.drawImage(ImageCache.croppedBorderImage(image), x + radius / 2.4f, y + radius / 2, w * 0.96f, h * 0.96f); } } @@ -456,7 +456,7 @@ public class CardRenderer { if (ImageCache.isExtendedArt(card)) g.drawImage(image, x, y, w, h); else { - g.drawfillBorder(3, ImageCache.borderColor(card), x, y, w, h, radius); + g.drawImage(ImageCache.getBorderImage(card), x, y, w, h); g.drawImage(ImageCache.croppedBorderImage(image), x + radius / 2.4f, y + radius / 2, w * 0.96f, h * 0.96f); } } diff --git a/forge-gui/src/main/java/forge/assets/FSkinProp.java b/forge-gui/src/main/java/forge/assets/FSkinProp.java index 0de1c4bc7ac..a2074450960 100644 --- a/forge-gui/src/main/java/forge/assets/FSkinProp.java +++ b/forge-gui/src/main/java/forge/assets/FSkinProp.java @@ -322,6 +322,9 @@ public enum FSkinProp { IMG_ABILITY_HEXPROOF_UB (new int[] {166, 494, 80, 80}, PropType.ABILITY), //token icon IMG_ABILITY_TOKEN (new int[] {330, 494, 80, 80}, PropType.ABILITY), + //border + IMG_BORDER_BLACK (new int[] {2, 2, 672, 936}, PropType.BORDERS), + IMG_BORDER_WHITE (new int[] {676, 2, 672, 936}, PropType.BORDERS), //Protection From IMG_ABILITY_PROTECT_ALL (new int[] {248, 84, 80, 80}, PropType.ABILITY), IMG_ABILITY_PROTECT_B (new int[] {330, 84, 80, 80}, PropType.ABILITY), @@ -374,6 +377,7 @@ public enum FSkinProp { OLD_FOIL, TROPHY, ABILITY, + BORDERS, MANAICONS, PLANAR_CONQUEST, FAVICON diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index 11c582e9de1..29f0c9aafd7 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -94,6 +94,7 @@ public final class ForgeConstants { public static final String SPRITE_OLD_FOILS_FILE = "sprite_old_foils.png"; public static final String SPRITE_TROPHIES_FILE = "sprite_trophies.png"; public static final String SPRITE_ABILITY_FILE = "sprite_ability.png"; + public static final String SPRITE_BORDER_FILE = "sprite_border.png"; public static final String SPRITE_MANAICONS_FILE = "sprite_manaicons.png"; public static final String SPRITE_AVATARS_FILE = "sprite_avatars.png"; public static final String SPRITE_FAVICONS_FILE = "sprite_favicons.png";