From 7b25c61f356bfd23c2b22575524c25c50b17e674 Mon Sep 17 00:00:00 2001 From: drdev Date: Sat, 6 Feb 2016 23:17:55 +0000 Subject: [PATCH] Fix so card avatar images draw reliably and at the correct aspect ratio --- .gitattributes | 1 + .../src/forge/card/CardAvatarImage.java | 63 +++++++++++++++++++ .../forge/screens/match/MatchController.java | 8 +-- .../ConquestMultiverseScreen.java | 23 ++++--- 4 files changed, 79 insertions(+), 16 deletions(-) create mode 100644 forge-gui-mobile/src/forge/card/CardAvatarImage.java diff --git a/.gitattributes b/.gitattributes index 4f0b23872e1..69339729bbc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1236,6 +1236,7 @@ forge-gui-mobile/src/forge/assets/FTextureRegionImage.java -text forge-gui-mobile/src/forge/assets/ImageCache.java -text forge-gui-mobile/src/forge/assets/ImageLoader.java -text forge-gui-mobile/src/forge/assets/TextRenderer.java -text +forge-gui-mobile/src/forge/card/CardAvatarImage.java -text forge-gui-mobile/src/forge/card/CardFaceSymbols.java -text forge-gui-mobile/src/forge/card/CardImageRenderer.java -text forge-gui-mobile/src/forge/card/CardListPreview.java -text diff --git a/forge-gui-mobile/src/forge/card/CardAvatarImage.java b/forge-gui-mobile/src/forge/card/CardAvatarImage.java new file mode 100644 index 00000000000..98cbb185f08 --- /dev/null +++ b/forge-gui-mobile/src/forge/card/CardAvatarImage.java @@ -0,0 +1,63 @@ +package forge.card; + +import forge.Graphics; +import forge.assets.FImage; +import forge.item.PaperCard; + +public class CardAvatarImage implements FImage { + private final String imageKey; + private FImage image; + + public CardAvatarImage(PaperCard card0) { + this(card0.getImageKey(false)); + } + public CardAvatarImage(String imageKey0) { + imageKey = imageKey0; + } + + @Override + public float getWidth() { + if (image != null) { + return image.getHeight(); //image will be drawn at its height + } + return 0; + } + + @Override + public float getHeight() { + if (image != null) { + return image.getHeight(); + } + return 0; + } + + @Override + public void draw(Graphics g, float x, float y, float w, float h) { + if (image == null) { //attempt to retrieve card art if needed + image = CardRenderer.getCardArt(imageKey, false, false); + if (image == null) { + return; //can't draw anything if can't be loaded yet + } + } + + //draw scaled image into clipped region so it fills box while maintain aspect ratio + g.startClip(x, y, w, h); + + float aspectRatio = w / h; + float imageAspectRatio = image.getWidth() / image.getHeight(); + if (imageAspectRatio > aspectRatio) { + float w0 = w * imageAspectRatio / aspectRatio; + x -= (w0 - w) / 2; + w = w0; + } + else { + float h0 = h * aspectRatio / imageAspectRatio; + y -= (h0 - h) / 2; + h = h0; + } + + image.draw(g, x, y, w, h); + + g.endClip(); + } +} diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index e01fbc49e0f..23aa49a89f9 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -20,11 +20,10 @@ import forge.GuiBase; import forge.LobbyPlayer; import forge.assets.FImage; import forge.assets.FSkin; -import forge.assets.FSkinImage; import forge.assets.FSkinProp; import forge.assets.FTextureRegionImage; import forge.assets.ImageCache; -import forge.card.CardRenderer; +import forge.card.CardAvatarImage; import forge.card.GameEntityPicker; import forge.deck.CardPool; import forge.deck.FSideboardDialog; @@ -94,10 +93,7 @@ public class MatchController extends AbstractGuiGame { avatar = new FTextureRegionImage(FSkin.getAvatars().get(p.getAvatarIndex())); } else { //handle lobby players with art from cards - avatar = CardRenderer.getCardArt(p.getAvatarCardImageKey(), false, false); - if (avatar == null) { //use unknown avatar image if card image doesn't exist - avatar = FSkinImage.UNKNOWN; - } + avatar = new CardAvatarImage(p.getAvatarCardImageKey()); } } return avatar; diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMultiverseScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMultiverseScreen.java index ba1df880bb3..253eb5e456a 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMultiverseScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMultiverseScreen.java @@ -16,6 +16,7 @@ import forge.assets.FSkinColor; import forge.assets.FSkinFont; import forge.assets.FSkinImage; import forge.assets.FSkinTexture; +import forge.card.CardAvatarImage; import forge.card.CardDetailUtil; import forge.card.CardRenderer; import forge.card.CardZoom; @@ -599,8 +600,8 @@ public class ConquestMultiverseScreen extends FScreen { private void update() { event = model.getCurrentLocation().getEvent(); - playerAvatar.card = model.getSelectedCommander().getCard(); - opponentAvatar.card = event.getAvatarCard(); + playerAvatar.setCard(model.getSelectedCommander().getCard()); + opponentAvatar.setCard(event.getAvatarCard()); } @Override @@ -655,21 +656,23 @@ public class ConquestMultiverseScreen extends FScreen { private class AvatarDisplay extends FDisplayObject { private final boolean forOpponent; private PaperCard card; + private CardAvatarImage image; private AvatarDisplay(boolean forOpponent0) { forOpponent = forOpponent0; } + public void setCard(PaperCard card0) { + if (card == card0) { return; } + card = card0; + image = new CardAvatarImage(card); + } + @Override public void draw(Graphics g) { - if (card == null) { return; } - - FImage image = CardRenderer.getCardArt(card); - if (image == null) { return; } - - float w = getWidth(); - float h = getHeight(); - g.drawImage(image, 0, 0, w, h); + if (image != null) { + image.draw(g, 0, 0, getWidth(), getHeight()); + } } @Override