mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
Merge branch 'add-mobile-art-download' into 'master'
Add option to download missing card art on the fly See merge request core-developers/forge!1161
This commit is contained in:
41
forge-gui-mobile/src/forge/CachedCardImage.java
Normal file
41
forge-gui-mobile/src/forge/CachedCardImage.java
Normal file
@@ -0,0 +1,41 @@
|
||||
package forge;
|
||||
|
||||
import com.badlogic.gdx.graphics.Texture;
|
||||
import forge.assets.ImageCache;
|
||||
import forge.game.card.CardView;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.screens.match.MatchController;
|
||||
import forge.util.ImageFetcher;
|
||||
|
||||
public abstract class CachedCardImage implements ImageFetcher.Callback {
|
||||
protected final String key;
|
||||
static final ImageFetcher fetcher = GuiBase.getInterface().getImageFetcher();
|
||||
|
||||
public CachedCardImage(final CardView card) {
|
||||
key = card.getCurrentState().getImageKey(MatchController.instance.getLocalPlayers());
|
||||
fetch();
|
||||
}
|
||||
|
||||
public CachedCardImage(final InventoryItem ii) {
|
||||
key = ii.getImageKey(false);
|
||||
fetch();
|
||||
}
|
||||
|
||||
public CachedCardImage(String key) {
|
||||
this.key = key;
|
||||
fetch();
|
||||
}
|
||||
|
||||
public void fetch() {
|
||||
Texture image = ImageCache.getImage(key, false);
|
||||
if (image == null) {
|
||||
fetcher.fetchImage(key, this);
|
||||
}
|
||||
}
|
||||
|
||||
public Texture getImage() {
|
||||
return ImageCache.getImage(key, true);
|
||||
}
|
||||
|
||||
public abstract void onImageFetched();
|
||||
}
|
||||
@@ -37,14 +37,11 @@ import forge.sound.IAudioClip;
|
||||
import forge.sound.IAudioMusic;
|
||||
import forge.toolbox.FOptionPane;
|
||||
import forge.toolbox.GuiChoose;
|
||||
import forge.util.Callback;
|
||||
import forge.util.FileUtil;
|
||||
import forge.util.ThreadUtil;
|
||||
import forge.util.WaitCallback;
|
||||
import forge.util.WaitRunnable;
|
||||
import forge.util.*;
|
||||
|
||||
public class GuiMobile implements IGuiBase {
|
||||
private final String assetsDir;
|
||||
private ImageFetcher imageFetcher = new LibGDXImageFetcher();
|
||||
|
||||
public GuiMobile(final String assetsDir0) {
|
||||
assetsDir = assetsDir0;
|
||||
@@ -70,6 +67,11 @@ public class GuiMobile implements IGuiBase {
|
||||
return assetsDir;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageFetcher getImageFetcher() {
|
||||
return imageFetcher;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invokeInEdtNow(final Runnable proc) {
|
||||
proc.run();
|
||||
|
||||
@@ -24,11 +24,9 @@ import com.google.common.cache.CacheBuilder;
|
||||
import com.google.common.cache.LoadingCache;
|
||||
|
||||
import forge.ImageKeys;
|
||||
import forge.game.card.CardView;
|
||||
import forge.game.player.IHasIcon;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.properties.ForgeConstants;
|
||||
import forge.screens.match.MatchController;
|
||||
import forge.util.ImageUtil;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@@ -80,11 +78,6 @@ public class ImageCache {
|
||||
missingIconKeys.clear();
|
||||
}
|
||||
|
||||
public static Texture getImage(final CardView card) {
|
||||
final String key = card.getCurrentState().getImageKey(MatchController.instance.getLocalPlayers());
|
||||
return getImage(key, true);
|
||||
}
|
||||
|
||||
public static Texture getImage(InventoryItem ii) {
|
||||
return getImage(ii.getImageKey(false), true);
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
|
||||
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeFontParameter;
|
||||
import com.badlogic.gdx.graphics.glutils.PixmapTextureData;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import forge.CachedCardImage;
|
||||
import forge.FThreads;
|
||||
import forge.Graphics;
|
||||
import forge.StaticData;
|
||||
@@ -28,6 +29,7 @@ import forge.game.card.CardView.CardStateView;
|
||||
import forge.game.keyword.Keyword;
|
||||
import forge.game.card.CounterType;
|
||||
import forge.item.IPaperCard;
|
||||
import forge.item.InventoryItem;
|
||||
import forge.item.PaperCard;
|
||||
import forge.model.FModel;
|
||||
import forge.properties.ForgeConstants;
|
||||
@@ -51,6 +53,34 @@ public class CardRenderer {
|
||||
BehindVert
|
||||
}
|
||||
|
||||
// class that simplifies the callback logic of CachedCardImage
|
||||
static class RendererCachedCardImage extends CachedCardImage {
|
||||
boolean clearCardArtCache = false;
|
||||
|
||||
public RendererCachedCardImage(CardView card, boolean clearArtCache) {
|
||||
super(card);
|
||||
this.clearCardArtCache = clearArtCache;
|
||||
}
|
||||
|
||||
public RendererCachedCardImage(InventoryItem ii, boolean clearArtCache) {
|
||||
super(ii);
|
||||
this.clearCardArtCache = clearArtCache;
|
||||
}
|
||||
|
||||
public RendererCachedCardImage(String key, boolean clearArtCache) {
|
||||
super(key);
|
||||
this.clearCardArtCache = clearArtCache;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onImageFetched() {
|
||||
ImageCache.clear();
|
||||
if (clearCardArtCache) {
|
||||
cardArtCache.remove(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final FSkinFont NAME_FONT = FSkinFont.get(16);
|
||||
public static final float NAME_BOX_TINT = 0.2f;
|
||||
public static final float TEXT_BOX_TINT = 0.1f;
|
||||
@@ -124,7 +154,7 @@ public class CardRenderer {
|
||||
public static FImageComplex getCardArt(String imageKey, boolean isSplitCard, boolean isHorizontalCard, boolean isAftermathCard) {
|
||||
FImageComplex cardArt = cardArtCache.get(imageKey);
|
||||
if (cardArt == null) {
|
||||
Texture image = ImageCache.getImage(imageKey, true);
|
||||
Texture image = new RendererCachedCardImage(imageKey, true).getImage();
|
||||
if (image != null) {
|
||||
if (image == ImageCache.defaultImage) {
|
||||
cardArt = CardImageRenderer.forgeArt;
|
||||
@@ -186,7 +216,13 @@ public class CardRenderer {
|
||||
public static FImageComplex getAftermathSecondCardArt(String imageKey) {
|
||||
FImageComplex cardArt = cardArtCache.get("Aftermath_second_"+imageKey);
|
||||
if (cardArt == null) {
|
||||
Texture image = ImageCache.getImage(imageKey, true);
|
||||
Texture image = new CachedCardImage(imageKey) {
|
||||
@Override
|
||||
public void onImageFetched() {
|
||||
ImageCache.clear();
|
||||
cardArtCache.remove("Aftermath_second_" + imageKey);
|
||||
}
|
||||
}.getImage();
|
||||
if (image != null) {
|
||||
if (image == ImageCache.defaultImage) {
|
||||
cardArt = CardImageRenderer.forgeArt;
|
||||
@@ -347,7 +383,8 @@ public class CardRenderer {
|
||||
}
|
||||
|
||||
public static void drawCard(Graphics g, IPaperCard pc, float x, float y, float w, float h, CardStackPosition pos) {
|
||||
Texture image = ImageCache.getImage(pc);
|
||||
Texture image = new RendererCachedCardImage(pc, false).getImage();
|
||||
|
||||
if (image != null) {
|
||||
if (image == ImageCache.defaultImage) {
|
||||
CardImageRenderer.drawCardImage(g, CardView.getCardForUi(pc), false, x, y, w, h, pos);
|
||||
@@ -369,7 +406,8 @@ public class CardRenderer {
|
||||
}
|
||||
|
||||
public static void drawCard(Graphics g, CardView card, float x, float y, float w, float h, CardStackPosition pos, boolean rotate) {
|
||||
Texture image = ImageCache.getImage(card);
|
||||
Texture image = new RendererCachedCardImage(card, false).getImage();
|
||||
|
||||
if (image != null) {
|
||||
if (image == ImageCache.defaultImage) {
|
||||
CardImageRenderer.drawCardImage(g, card, false, x, y, w, h, pos);
|
||||
|
||||
@@ -204,6 +204,10 @@ public class SettingsPage extends TabPage<SettingsScreen> {
|
||||
"If turned on, Forge will load all historic format definitions, this may take slightly longer to load at startup."), 3);
|
||||
|
||||
//Graphic Options
|
||||
lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER,
|
||||
"Download missing card art",
|
||||
"Automatically download missing card art"),
|
||||
4);
|
||||
lstSettings.addItem(new BooleanSetting(FPref.UI_OVERLAY_FOIL_EFFECT,
|
||||
"Display Foil Overlay",
|
||||
"Displays foil cards with the visual foil overlay effect."),
|
||||
|
||||
62
forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java
Normal file
62
forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java
Normal file
@@ -0,0 +1,62 @@
|
||||
package forge.util;
|
||||
|
||||
import com.badlogic.gdx.files.FileHandle;
|
||||
import forge.Forge;
|
||||
import forge.GuiBase;
|
||||
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
|
||||
public class LibGDXImageFetcher extends ImageFetcher {
|
||||
@Override
|
||||
protected Runnable getDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) {
|
||||
return new LibGDXDownloadTask(downloadUrls, destPath, notifyObservers);
|
||||
}
|
||||
|
||||
private static class LibGDXDownloadTask implements Runnable {
|
||||
private final String[] downloadUrls;
|
||||
private final String destPath;
|
||||
private final Runnable notifyObservers;
|
||||
|
||||
LibGDXDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) {
|
||||
this.downloadUrls = downloadUrls;
|
||||
this.destPath = destPath;
|
||||
this.notifyObservers = notifyObservers;
|
||||
}
|
||||
|
||||
private void doFetch(String urlToDownload) throws IOException {
|
||||
URL url = new URL(urlToDownload);
|
||||
System.out.println("Attempting to fetch: " + url);
|
||||
java.net.URLConnection c = url.openConnection();
|
||||
c.setRequestProperty("User-Agent", "");
|
||||
|
||||
InputStream is = c.getInputStream();
|
||||
// First, save to a temporary file so that nothing tries to read
|
||||
// a partial download.
|
||||
FileHandle destFile = new FileHandle(destPath + ".tmp");
|
||||
System.out.println(destPath);
|
||||
destFile.parent().mkdirs();
|
||||
|
||||
// Conversion to JPEG will be handled differently depending on the platform
|
||||
Forge.getDeviceAdapter().convertToJPEG(is, new FileOutputStream(destFile.file()));
|
||||
destFile.moveTo(new FileHandle(destPath));
|
||||
|
||||
System.out.println("Saved image to " + destPath);
|
||||
GuiBase.getInterface().invokeInEdtLater(notifyObservers);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
for (String urlToDownload : downloadUrls) {
|
||||
try {
|
||||
doFetch(urlToDownload);
|
||||
break;
|
||||
} catch (IOException e) {
|
||||
System.out.println("Failed to download card [" + destPath + "] image: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user