From 5ba5b70f1fcc96946df01c3e053fe12f1d784fa3 Mon Sep 17 00:00:00 2001 From: drdev Date: Thu, 16 Oct 2014 16:17:18 +0000 Subject: [PATCH] Refactor some the image loading code into forge-core --- .gitattributes | 2 +- forge-core/src/main/java/forge/ImageKeys.java | 158 ++++++++++++++++++ forge-game/src/main/java/forge/ImageKeys.java | 58 ------- .../src/main/java/forge/ImageLoader.java | 91 +--------- .../src/forge/assets/ImageLoader.java | 126 +------------- .../src/main/java/forge/assets/ImageUtil.java | 3 +- .../src/main/java/forge/model/FModel.java | 6 + 7 files changed, 183 insertions(+), 261 deletions(-) create mode 100644 forge-core/src/main/java/forge/ImageKeys.java delete mode 100644 forge-game/src/main/java/forge/ImageKeys.java diff --git a/.gitattributes b/.gitattributes index b2ade094d42..07923f0ccaa 100644 --- a/.gitattributes +++ b/.gitattributes @@ -154,6 +154,7 @@ forge-core/.settings/org.eclipse.m2e.core.prefs -text forge-core/pom.xml -text forge-core/src/main/java/forge/CardStorageReader.java -text forge-core/src/main/java/forge/FTrace.java -text +forge-core/src/main/java/forge/ImageKeys.java -text forge-core/src/main/java/forge/LobbyPlayer.java -text forge-core/src/main/java/forge/StaticData.java -text forge-core/src/main/java/forge/card/BoosterGenerator.java svneol=native#text/plain @@ -267,7 +268,6 @@ forge-game/.settings/org.eclipse.jdt.core.prefs -text forge-game/.settings/org.eclipse.m2e.core.prefs -text forge-game/pom.xml -text forge-game/src/main/java/forge/GameCommand.java svneol=native#text/plain -forge-game/src/main/java/forge/ImageKeys.java -text forge-game/src/main/java/forge/game/CardTraitBase.java -text forge-game/src/main/java/forge/game/Direction.java -text forge-game/src/main/java/forge/game/Game.java -text diff --git a/forge-core/src/main/java/forge/ImageKeys.java b/forge-core/src/main/java/forge/ImageKeys.java new file mode 100644 index 00000000000..86a7192c4b9 --- /dev/null +++ b/forge-core/src/main/java/forge/ImageKeys.java @@ -0,0 +1,158 @@ +package forge; + +import java.io.File; + +import org.apache.commons.lang3.StringUtils; + +import forge.card.CardDb; +import forge.item.*; + +public class ImageKeys { + public static final String CARD_PREFIX = "c:"; + public static final String TOKEN_PREFIX = "t:"; + public static final String ICON_PREFIX = "i:"; + public static final String BOOSTER_PREFIX = "b:"; + public static final String FATPACK_PREFIX = "f:"; + public static final String BOOSTERBOX_PREFIX = "x:"; + public static final String PRECON_PREFIX = "p:"; + public static final String TOURNAMENTPACK_PREFIX = "o:"; + + public static final String MORPH_IMAGE = "morph"; + public static final String HIDDEN_CARD = TOKEN_PREFIX + MORPH_IMAGE; + + public static final String BACKFACE_POSTFIX = "$alt"; + + private static String CACHE_CARD_PICS_DIR, CACHE_TOKEN_PICS_DIR, CACHE_ICON_PICS_DIR, CACHE_BOOSTER_PICS_DIR, + CACHE_FATPACK_PICS_DIR, CACHE_BOOSTERBOX_PICS_DIR, CACHE_PRECON_PICS_DIR, CACHE_TOURNAMENTPACK_PICS_DIR; + + public static void initializeDirs(String cards, String tokens, String icons, String boosters, + String fatPacks, String boosterBoxes, String precons, String tournamentPacks) { + CACHE_CARD_PICS_DIR = cards; + CACHE_TOKEN_PICS_DIR = tokens; + CACHE_ICON_PICS_DIR = icons; + CACHE_BOOSTER_PICS_DIR = boosters; + CACHE_FATPACK_PICS_DIR = fatPacks; + CACHE_BOOSTERBOX_PICS_DIR = boosterBoxes; + CACHE_PRECON_PICS_DIR = precons; + CACHE_TOURNAMENTPACK_PICS_DIR = tournamentPacks; + } + + // image file extensions for various formats in order of likelihood + // the last, empty, string is for keys that come in with an extension already in place + private static final String[] FILE_EXTENSIONS = { ".jpg", ".png", "" }; + + public static String getImageKey(PaperCard pc, boolean altState) { + return ImageKeys.CARD_PREFIX + pc.getName() + CardDb.NameSetSeparator + pc.getEdition() + CardDb.NameSetSeparator + pc.getArtIndex() + (altState ? BACKFACE_POSTFIX : ""); + } + + // Inventory items don't have to know how a certain client should draw them. + // That's why this method is not encapsulated and overloaded in the InventoryItem descendants + public static String getImageKey(InventoryItem ii, boolean altState) { + if (ii instanceof PaperCard) { + return getImageKey((PaperCard)ii, altState); + } + if (ii instanceof TournamentPack) { + return ImageKeys.TOURNAMENTPACK_PREFIX + ((TournamentPack)ii).getEdition(); + } + if (ii instanceof BoosterPack) { + BoosterPack bp = (BoosterPack)ii; + int cntPics = StaticData.instance().getEditions().get(bp.getEdition()).getCntBoosterPictures(); + String suffix = (1 >= cntPics) ? "" : ("_" + bp.getArtIndex()); + return ImageKeys.BOOSTER_PREFIX + bp.getEdition() + suffix; + } + if (ii instanceof FatPack) { + return ImageKeys.FATPACK_PREFIX + ((FatPack)ii).getEdition(); + } + if (ii instanceof BoosterBox) { + return ImageKeys.BOOSTERBOX_PREFIX + ((BoosterBox)ii).getEdition(); + } + if (ii instanceof PreconDeck) { + return ImageKeys.PRECON_PREFIX + ((PreconDeck)ii).getImageFilename(); + } + if (ii instanceof PaperToken) { + return ImageKeys.TOKEN_PREFIX + ((PaperToken)ii).getImageFilename(); + } + return null; + } + + public static String getTokenKey(String tokenName) { + return ImageKeys.TOKEN_PREFIX + tokenName; + } + + public static File getImageFile(String key) { + if (StringUtils.isEmpty(key)) { + return null; + } + + final String dir; + final String filename; + if (key.startsWith(ImageKeys.TOKEN_PREFIX)) { + filename = key.substring(ImageKeys.TOKEN_PREFIX.length()); + dir = CACHE_TOKEN_PICS_DIR; + } else if (key.startsWith(ImageKeys.ICON_PREFIX)) { + filename = key.substring(ImageKeys.ICON_PREFIX.length()); + dir = CACHE_ICON_PICS_DIR; + } else if (key.startsWith(ImageKeys.BOOSTER_PREFIX)) { + filename = key.substring(ImageKeys.BOOSTER_PREFIX.length()); + dir = CACHE_BOOSTER_PICS_DIR; + } else if (key.startsWith(ImageKeys.FATPACK_PREFIX)) { + filename = key.substring(ImageKeys.FATPACK_PREFIX.length()); + dir = CACHE_FATPACK_PICS_DIR; + } else if (key.startsWith(ImageKeys.BOOSTERBOX_PREFIX)) { + filename = key.substring(ImageKeys.BOOSTERBOX_PREFIX.length()); + dir = CACHE_BOOSTERBOX_PICS_DIR; + } else if (key.startsWith(ImageKeys.PRECON_PREFIX)) { + filename = key.substring(ImageKeys.PRECON_PREFIX.length()); + dir = CACHE_PRECON_PICS_DIR; + } else if (key.startsWith(ImageKeys.TOURNAMENTPACK_PREFIX)) { + filename = key.substring(ImageKeys.TOURNAMENTPACK_PREFIX.length()); + dir = CACHE_TOURNAMENTPACK_PICS_DIR; + } else { + filename = key; + dir = CACHE_CARD_PICS_DIR; + } + + File file = findFile(dir, filename); + + // some S00 cards are really part of 6ED + /*if (file == null) { //TODO: Uncomment this + String s2kAlias = ImageUtil.getSetFolder("S00"); + if (filename.startsWith(s2kAlias)) { + file = findFile(dir, filename.replace(s2kAlias, ImageUtil.getSetFolder("6ED"))); + } + }*/ + + // try without set prefix + String setlessFilename = null; + if (file == null && filename.contains("/")) { + setlessFilename = filename.substring(filename.indexOf('/') + 1); + file = findFile(dir, setlessFilename); + + // try lowering the art index to the minimum for regular cards + if (file == null && setlessFilename.contains(".full")) { + file = findFile(dir, setlessFilename.replaceAll("[0-9]*[.]full", "1.full")); + } + } + + if (file == null) { + System.out.println("File not found, no image created: " + key); + } + + return file; + } + + private static File findFile(String dir, String filename) { + for (String ext : FILE_EXTENSIONS) { + File file = new File(dir, filename + ext); + if (file.exists()) { + return file; + } + } + return null; + } + + //shortcut for determine if a card image exists + public static boolean doesCardImageExist(String filename) { + return findFile(CACHE_CARD_PICS_DIR, filename) != null; + } +} diff --git a/forge-game/src/main/java/forge/ImageKeys.java b/forge-game/src/main/java/forge/ImageKeys.java deleted file mode 100644 index 26c4ecea824..00000000000 --- a/forge-game/src/main/java/forge/ImageKeys.java +++ /dev/null @@ -1,58 +0,0 @@ -package forge; - -import forge.card.CardDb; -import forge.item.*; - -public class ImageKeys { - public static final String CARD_PREFIX = "c:"; - public static final String TOKEN_PREFIX = "t:"; - public static final String ICON_PREFIX = "i:"; - public static final String BOOSTER_PREFIX = "b:"; - public static final String FATPACK_PREFIX = "f:"; - public static final String BOOSTERBOX_PREFIX = "x:"; - public static final String PRECON_PREFIX = "p:"; - public static final String TOURNAMENTPACK_PREFIX = "o:"; - - public static final String MORPH_IMAGE = "morph"; - public static final String HIDDEN_CARD = TOKEN_PREFIX + MORPH_IMAGE; - - public static final String BACKFACE_POSTFIX = "$alt"; - - public static String getImageKey(PaperCard pc, boolean altState) { - return ImageKeys.CARD_PREFIX + pc.getName() + CardDb.NameSetSeparator + pc.getEdition() + CardDb.NameSetSeparator + pc.getArtIndex() + (altState ? BACKFACE_POSTFIX : ""); - } - - // Inventory items don't have to know how a certain client should draw them. - // That's why this method is not encapsulated and overloaded in the InventoryItem descendants - public static String getImageKey(InventoryItem ii, boolean altState) { - if (ii instanceof PaperCard) { - return getImageKey((PaperCard)ii, altState); - } - if (ii instanceof TournamentPack) { - return ImageKeys.TOURNAMENTPACK_PREFIX + ((TournamentPack)ii).getEdition(); - } - if (ii instanceof BoosterPack) { - BoosterPack bp = (BoosterPack)ii; - int cntPics = StaticData.instance().getEditions().get(bp.getEdition()).getCntBoosterPictures(); - String suffix = (1 >= cntPics) ? "" : ("_" + bp.getArtIndex()); - return ImageKeys.BOOSTER_PREFIX + bp.getEdition() + suffix; - } - if (ii instanceof FatPack) { - return ImageKeys.FATPACK_PREFIX + ((FatPack)ii).getEdition(); - } - if (ii instanceof BoosterBox) { - return ImageKeys.BOOSTERBOX_PREFIX + ((BoosterBox)ii).getEdition(); - } - if (ii instanceof PreconDeck) { - return ImageKeys.PRECON_PREFIX + ((PreconDeck)ii).getImageFilename(); - } - if (ii instanceof PaperToken) { - return ImageKeys.TOKEN_PREFIX + ((PaperToken)ii).getImageFilename(); - } - return null; - } - - public static String getTokenKey(String tokenName) { - return ImageKeys.TOKEN_PREFIX + tokenName; - } -} diff --git a/forge-gui-desktop/src/main/java/forge/ImageLoader.java b/forge-gui-desktop/src/main/java/forge/ImageLoader.java index 15d59d8ea26..c4a5198d168 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageLoader.java +++ b/forge-gui-desktop/src/main/java/forge/ImageLoader.java @@ -2,12 +2,7 @@ package forge; import com.google.common.cache.CacheLoader; -import forge.assets.ImageUtil; import forge.error.BugReporter; -import forge.properties.ForgeConstants; - -import org.apache.commons.lang3.StringUtils; - import javax.imageio.ImageIO; import java.awt.image.BufferedImage; @@ -15,89 +10,17 @@ import java.io.File; import java.io.IOException; final class ImageLoader extends CacheLoader { - // image file extensions for various formats in order of likelihood - // the last, empty, string is for keys that come in with an extension already in place - private static final String[] _FILE_EXTENSIONS = { ".jpg", ".png", "" }; - @Override public BufferedImage load(String key) { - if (StringUtils.isEmpty(key)) { - return null; - } - - final String path; - final String filename; - if (key.startsWith(ImageKeys.TOKEN_PREFIX)) { - filename = key.substring(ImageKeys.TOKEN_PREFIX.length()); - path = ForgeConstants.CACHE_TOKEN_PICS_DIR; - } else if (key.startsWith(ImageKeys.ICON_PREFIX)) { - filename = key.substring(ImageKeys.ICON_PREFIX.length()); - path = ForgeConstants.CACHE_ICON_PICS_DIR; - } else if (key.startsWith(ImageKeys.BOOSTER_PREFIX)) { - filename = key.substring(ImageKeys.BOOSTER_PREFIX.length()); - path = ForgeConstants.CACHE_BOOSTER_PICS_DIR; - } else if (key.startsWith(ImageKeys.FATPACK_PREFIX)) { - filename = key.substring(ImageKeys.FATPACK_PREFIX.length()); - path = ForgeConstants.CACHE_FATPACK_PICS_DIR; - } else if (key.startsWith(ImageKeys.BOOSTERBOX_PREFIX)) { - filename = key.substring(ImageKeys.BOOSTERBOX_PREFIX.length()); - path = ForgeConstants.CACHE_BOOSTERBOX_PICS_DIR; - } else if (key.startsWith(ImageKeys.PRECON_PREFIX)) { - filename = key.substring(ImageKeys.PRECON_PREFIX.length()); - path = ForgeConstants.CACHE_PRECON_PICS_DIR; - } else if (key.startsWith(ImageKeys.TOURNAMENTPACK_PREFIX)) { - filename = key.substring(ImageKeys.TOURNAMENTPACK_PREFIX.length()); - path = ForgeConstants.CACHE_TOURNAMENTPACK_PICS_DIR; - } else { - filename = key; - path = ForgeConstants.CACHE_CARD_PICS_DIR; - } - - BufferedImage ret = _findFile(key, path, filename); - - // some S00 cards are really part of 6ED - if (null == ret ) { - String s2kAlias = ImageUtil.getSetFolder("S00"); - if ( filename.startsWith(s2kAlias) ) { - ret = _findFile(key, path, filename.replace(s2kAlias, ImageUtil.getSetFolder("6ED"))); + File file = ImageKeys.getImageFile(key); + if (file != null) { + try { + return ImageIO.read(file); + } + catch (IOException ex) { + BugReporter.reportException(ex, "Could not read image file " + file.getAbsolutePath() + " "); } } - - // try without set prefix - String setlessFilename = null; - if (null == ret && filename.contains("/")) { - setlessFilename = filename.substring(filename.indexOf('/') + 1); - ret = _findFile(key, path, setlessFilename); - - // try lowering the art index to the minimum for regular cards - if (null == ret && setlessFilename.contains(".full")) { - ret = _findFile(key, path, setlessFilename.replaceAll("[0-9]*[.]full", "1.full")); - } - } - - if (null == ret) { - System.out.println("File not found, no image created: " + key); - } - - return ret; - } - - private static BufferedImage _findFile(String key, String path, String filename) { - for (String ext : _FILE_EXTENSIONS) { - File file = new File(path, filename + ext); - //System.out.println(String.format("Searching for %s at: %s", key, file.getAbsolutePath())); - if (file.exists()) { - //System.out.println(String.format("Found %s at: %s", key, file.getAbsolutePath())); - try { - return ImageIO.read(file); - } - catch (IOException ex) { - BugReporter.reportException(ex, "Could not read image file " + file.getAbsolutePath() + " "); - break; - } - } - } - return null; } } diff --git a/forge-gui-mobile/src/forge/assets/ImageLoader.java b/forge-gui-mobile/src/forge/assets/ImageLoader.java index 3c842ba98bc..0cfe984b853 100644 --- a/forge-gui-mobile/src/forge/assets/ImageLoader.java +++ b/forge-gui-mobile/src/forge/assets/ImageLoader.java @@ -1,133 +1,25 @@ package forge.assets; -import com.badlogic.gdx.Gdx; +import java.io.File; + import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Texture; import com.google.common.cache.CacheLoader; import forge.Forge; import forge.ImageKeys; -import forge.properties.ForgeConstants; - -import org.apache.commons.lang3.StringUtils; final class ImageLoader extends CacheLoader { - // image file extensions for various formats in order of likelihood - // the last, empty, string is for keys that come in with an extension already in place - private static final String[] _FILE_EXTENSIONS = { ".jpg", ".png", "" }; - @Override public Texture load(String key) { - if (StringUtils.isEmpty(key)) { - return null; - } - - final String path; - final String filename; - boolean isCard = false; - if (key.startsWith(ImageKeys.TOKEN_PREFIX)) { - filename = key.substring(ImageKeys.TOKEN_PREFIX.length()); - path = ForgeConstants.CACHE_TOKEN_PICS_DIR; - isCard = true; - } - else if (key.startsWith(ImageKeys.ICON_PREFIX)) { - filename = key.substring(ImageKeys.ICON_PREFIX.length()); - path = ForgeConstants.CACHE_ICON_PICS_DIR; - } - else if (key.startsWith(ImageKeys.BOOSTER_PREFIX)) { - filename = key.substring(ImageKeys.BOOSTER_PREFIX.length()); - path = ForgeConstants.CACHE_BOOSTER_PICS_DIR; - } - else if (key.startsWith(ImageKeys.FATPACK_PREFIX)) { - filename = key.substring(ImageKeys.FATPACK_PREFIX.length()); - path = ForgeConstants.CACHE_FATPACK_PICS_DIR; - } - else if (key.startsWith(ImageKeys.PRECON_PREFIX)) { - filename = key.substring(ImageKeys.PRECON_PREFIX.length()); - path = ForgeConstants.CACHE_PRECON_PICS_DIR; - } - else if (key.startsWith(ImageKeys.TOURNAMENTPACK_PREFIX)) { - filename = key.substring(ImageKeys.TOURNAMENTPACK_PREFIX.length()); - path = ForgeConstants.CACHE_TOURNAMENTPACK_PICS_DIR; - } - else { - filename = key; - path = ForgeConstants.CACHE_CARD_PICS_DIR; - isCard = true; - } - - Texture ret = findFile(key, path, filename); - if (ret != null) { return ret; } - - // some S00 cards are really part of 6ED - String s2kAlias = ImageUtil.getSetFolder("S00"); - if (filename.startsWith(s2kAlias)) { - ret = findFile(key, path, filename.replace(s2kAlias, ImageUtil.getSetFolder("6ED"))); - if (ret != null) { return ret; } - } - - // try without set prefix - String setCode; - String setlessFilename; - int idx = filename.indexOf('/'); - if (idx != -1) { - setCode = filename.substring(0, idx); - setlessFilename = filename.substring(idx + 1); - ret = findFile(key, path, setlessFilename); - if (ret != null) { return ret; } - - // try lowering the art index to the minimum for regular cards - if (setlessFilename.contains(".full")) { - ret = findFile(key, path, setlessFilename.replaceAll("[0-9]*[.]full", "1.full")); - if (ret != null) { return ret; } + File file = ImageKeys.getImageFile(key); + if (file != null) { + FileHandle fh = new FileHandle(file); + try { + return new Texture(fh); } - } - else { - setCode = null; - setlessFilename = filename; - } - - //TODO: Consider uncommenting this block - if (isCard) { //if image is for card, attempt to create image for it - if (setCode == null) {} //avoid warning, remove if below uncommented - /*int artIndex = 0; - String cardName = setlessFilename; - idx = cardName.indexOf('.'); - if (idx != -1) { - int dotIdx = idx; - //trim art index - while (idx > 0 && Character.isDigit(cardName.charAt(idx - 1))) { - idx--; - } - if (dotIdx > idx) { - artIndex = Integer.parseInt(cardName.substring(idx, dotIdx)); - } - cardName = cardName.substring(0, idx); - } - PaperCard pc = FModel.getMagicDb().getCommonCards().getCard(cardName, setCode, artIndex); - if (pc == null) { - pc = FModel.getMagicDb().getVariantCards().getCard(cardName, setCode, artIndex); - } - if (pc != null) { - ret = CardImageRenderer.createCardImage(Card.getCardForUi(pc)); - if (ret != null) { return ret; } - }*/ - } - return null; - } - - private static Texture findFile(String key, String path, String filename) { - path += filename; - for (String ext : _FILE_EXTENSIONS) { - FileHandle fh = Gdx.files.absolute(path + ext); - if (fh.exists()) { - try { - return new Texture(fh); - } - catch (Exception ex) { - Forge.log("Could not read image file " + fh.path() + "\n\nException:\n" + ex.toString()); - break; - } + catch (Exception ex) { + Forge.log("Could not read image file " + fh.path() + "\n\nException:\n" + ex.toString()); } } return null; diff --git a/forge-gui/src/main/java/forge/assets/ImageUtil.java b/forge-gui/src/main/java/forge/assets/ImageUtil.java index 87ad6c20744..164b182579e 100644 --- a/forge-gui/src/main/java/forge/assets/ImageUtil.java +++ b/forge-gui/src/main/java/forge/assets/ImageUtil.java @@ -24,8 +24,9 @@ public class ImageUtil { } PaperCard cp = StaticData.instance().getCommonCards().getCard(key); - if ( cp == null ) + if (cp == null) { cp = StaticData.instance().getVariantCards().getCard(key); + } return cp; } diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index 82183edf6b6..2a1221ad918 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -20,6 +20,7 @@ package forge.model; import forge.CardStorageReader; import forge.CardStorageReader.ProgressObserver; import forge.FThreads; +import forge.ImageKeys; import forge.StaticData; import forge.achievement.AchievementCollection; import forge.achievement.ConstructedAchievements; @@ -86,6 +87,11 @@ public class FModel { private static GameFormat.Collection formats; public static void initialize(final IProgressBar progressBar) { + ImageKeys.initializeDirs(ForgeConstants.CACHE_CARD_PICS_DIR, + ForgeConstants.CACHE_TOKEN_PICS_DIR, ForgeConstants.CACHE_ICON_PICS_DIR, + ForgeConstants.CACHE_BOOSTER_PICS_DIR, ForgeConstants.CACHE_FATPACK_PICS_DIR, + ForgeConstants.CACHE_BOOSTERBOX_PICS_DIR, ForgeConstants.CACHE_PRECON_PICS_DIR, + ForgeConstants.CACHE_TOURNAMENTPACK_PICS_DIR); // Instantiate preferences: quest and regular //Preferences are initialized first so that the splash screen can be translated.