Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master

This commit is contained in:
Agetian
2018-12-09 12:52:29 +03:00
16 changed files with 278 additions and 82 deletions

View 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();
}

View File

@@ -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();

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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."),

View 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());
}
}
}
}
}