diff --git a/.gitattributes b/.gitattributes index 95644f288d1..ef3d17f35e0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1132,6 +1132,7 @@ forge-gui-mobile/src/forge/animation/GifDecoder.java -text forge-gui-mobile/src/forge/assets/AssetsDownloader.java -text forge-gui-mobile/src/forge/assets/BitmapFontWriter.java -text forge-gui-mobile/src/forge/assets/FBufferedImage.java -text +forge-gui-mobile/src/forge/assets/FDelayLoadImage.java -text forge-gui-mobile/src/forge/assets/FImage.java -text forge-gui-mobile/src/forge/assets/FImageComplex.java -text forge-gui-mobile/src/forge/assets/FSkin.java -text diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index 435dd77bac9..cff7a480d2a 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -13,6 +13,7 @@ import com.badlogic.gdx.Application.ApplicationType; import com.badlogic.gdx.graphics.Texture; import com.google.common.base.Function; +import forge.assets.FDelayLoadImage; import forge.assets.FSkin; import forge.assets.FSkinProp; import forge.assets.FTextureImage; @@ -106,7 +107,12 @@ public class GuiMobile implements IGuiBase { @Override public ISkinImage getUnskinnedIcon(String path) { - return new FTextureImage(new Texture(Gdx.files.absolute(path))); + if (FThreads.isGuiThread(this)) { + return new FTextureImage(new Texture(Gdx.files.absolute(path))); + } + + //use a delay load image to avoid an error if called from background thread + return new FDelayLoadImage(path); } @Override diff --git a/forge-gui-mobile/src/forge/assets/FDelayLoadImage.java b/forge-gui-mobile/src/forge/assets/FDelayLoadImage.java new file mode 100644 index 00000000000..e62efffbfd0 --- /dev/null +++ b/forge-gui-mobile/src/forge/assets/FDelayLoadImage.java @@ -0,0 +1,49 @@ +package forge.assets; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Texture; + +import forge.Graphics; + +//Special wrapper for a texture to be loaded later when it's needed +public class FDelayLoadImage extends FImageComplex { + private final String filename; + private Texture texture; + + public FDelayLoadImage(String filename0) { + filename = filename0; + } + + @Override + public float getWidth() { + return getTexture().getWidth(); + } + + @Override + public float getHeight() { + return getTexture().getHeight(); + } + + @Override + public Texture getTexture() { + if (texture == null) { + texture = new Texture(Gdx.files.absolute(filename)); + } + return texture; + } + + @Override + public int getRegionX() { + return 0; + } + + @Override + public int getRegionY() { + return 0; + } + + @Override + public void draw(Graphics g, float x, float y, float w, float h) { + g.drawImage(getTexture(), x, y, w, h); + } +} diff --git a/forge-gui/src/main/java/forge/achievement/Achievement.java b/forge-gui/src/main/java/forge/achievement/Achievement.java index b050f35abae..f5b47659595 100644 --- a/forge-gui/src/main/java/forge/achievement/Achievement.java +++ b/forge-gui/src/main/java/forge/achievement/Achievement.java @@ -2,7 +2,6 @@ package forge.achievement; import org.w3c.dom.Element; -import forge.FThreads; import forge.GuiBase; import forge.assets.FSkinProp; import forge.assets.ISkinImage; @@ -81,7 +80,7 @@ public abstract class Achievement { return customImage; } - public void updateCustomImage() { + private void updateCustomImage() { int suffix; if (earnedGold()) { suffix = 3; @@ -155,12 +154,7 @@ public abstract class Achievement { } } if (type != null) { - FThreads.invokeInEdtNowOrLater(GuiBase.getInterface(), new Runnable() { - @Override - public void run() { - updateCustomImage(); - } - }); + updateCustomImage(); if (sharedDesc != null) { desc = sharedDesc + " " + desc; } @@ -181,6 +175,7 @@ public abstract class Achievement { public void loadFromXml(Element el) { best = getIntAttribute(el, "best"); current = getIntAttribute(el, "current"); + updateCustomImage(); } private int getIntAttribute(Element el, String name) { diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index 9c0bd0874fd..76a68646a2a 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -20,9 +20,7 @@ package forge.model; import forge.CardStorageReader; import forge.CardStorageReader.ProgressObserver; import forge.FThreads; -import forge.GuiBase; import forge.StaticData; -import forge.achievement.Achievement; import forge.achievement.AchievementCollection; import forge.achievement.ConstructedAchievements; import forge.achievement.DraftAchievements; @@ -176,20 +174,6 @@ public class FModel { achievements.put(GameType.Sealed, new SealedAchievements()); achievements.put(GameType.Quest, new QuestAchievements()); - //as long as custom achievement pics directory exists, queue up load for those images - if (FileUtil.doesFileExist(ForgeConstants.CACHE_ACHIEVEMENT_PICS_DIR)) { - FThreads.invokeInEdtLater(GuiBase.getInterface(), new Runnable() { - @Override - public void run() { - for (AchievementCollection achievementCol : achievements.values()) { - for (Achievement achievement : achievementCol) { - achievement.updateCustomImage(); - } - } - } - }); - } - //preload AI profiles AiProfileUtil.loadAllProfiles(ForgeConstants.AI_PROFILE_DIR); }