Fix so card avatar images draw reliably and at the correct aspect ratio

This commit is contained in:
drdev
2016-02-06 23:17:55 +00:00
parent 1e21568aa9
commit 7b25c61f35
4 changed files with 79 additions and 16 deletions

1
.gitattributes vendored
View File

@@ -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/ImageCache.java -text
forge-gui-mobile/src/forge/assets/ImageLoader.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/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/CardFaceSymbols.java -text
forge-gui-mobile/src/forge/card/CardImageRenderer.java -text forge-gui-mobile/src/forge/card/CardImageRenderer.java -text
forge-gui-mobile/src/forge/card/CardListPreview.java -text forge-gui-mobile/src/forge/card/CardListPreview.java -text

View File

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

View File

@@ -20,11 +20,10 @@ import forge.GuiBase;
import forge.LobbyPlayer; import forge.LobbyPlayer;
import forge.assets.FImage; import forge.assets.FImage;
import forge.assets.FSkin; import forge.assets.FSkin;
import forge.assets.FSkinImage;
import forge.assets.FSkinProp; import forge.assets.FSkinProp;
import forge.assets.FTextureRegionImage; import forge.assets.FTextureRegionImage;
import forge.assets.ImageCache; import forge.assets.ImageCache;
import forge.card.CardRenderer; import forge.card.CardAvatarImage;
import forge.card.GameEntityPicker; import forge.card.GameEntityPicker;
import forge.deck.CardPool; import forge.deck.CardPool;
import forge.deck.FSideboardDialog; import forge.deck.FSideboardDialog;
@@ -94,10 +93,7 @@ public class MatchController extends AbstractGuiGame {
avatar = new FTextureRegionImage(FSkin.getAvatars().get(p.getAvatarIndex())); avatar = new FTextureRegionImage(FSkin.getAvatars().get(p.getAvatarIndex()));
} }
else { //handle lobby players with art from cards else { //handle lobby players with art from cards
avatar = CardRenderer.getCardArt(p.getAvatarCardImageKey(), false, false); avatar = new CardAvatarImage(p.getAvatarCardImageKey());
if (avatar == null) { //use unknown avatar image if card image doesn't exist
avatar = FSkinImage.UNKNOWN;
}
} }
} }
return avatar; return avatar;

View File

@@ -16,6 +16,7 @@ import forge.assets.FSkinColor;
import forge.assets.FSkinFont; import forge.assets.FSkinFont;
import forge.assets.FSkinImage; import forge.assets.FSkinImage;
import forge.assets.FSkinTexture; import forge.assets.FSkinTexture;
import forge.card.CardAvatarImage;
import forge.card.CardDetailUtil; import forge.card.CardDetailUtil;
import forge.card.CardRenderer; import forge.card.CardRenderer;
import forge.card.CardZoom; import forge.card.CardZoom;
@@ -599,8 +600,8 @@ public class ConquestMultiverseScreen extends FScreen {
private void update() { private void update() {
event = model.getCurrentLocation().getEvent(); event = model.getCurrentLocation().getEvent();
playerAvatar.card = model.getSelectedCommander().getCard(); playerAvatar.setCard(model.getSelectedCommander().getCard());
opponentAvatar.card = event.getAvatarCard(); opponentAvatar.setCard(event.getAvatarCard());
} }
@Override @Override
@@ -655,21 +656,23 @@ public class ConquestMultiverseScreen extends FScreen {
private class AvatarDisplay extends FDisplayObject { private class AvatarDisplay extends FDisplayObject {
private final boolean forOpponent; private final boolean forOpponent;
private PaperCard card; private PaperCard card;
private CardAvatarImage image;
private AvatarDisplay(boolean forOpponent0) { private AvatarDisplay(boolean forOpponent0) {
forOpponent = forOpponent0; forOpponent = forOpponent0;
} }
public void setCard(PaperCard card0) {
if (card == card0) { return; }
card = card0;
image = new CardAvatarImage(card);
}
@Override @Override
public void draw(Graphics g) { public void draw(Graphics g) {
if (card == null) { return; } if (image != null) {
image.draw(g, 0, 0, getWidth(), getHeight());
FImage image = CardRenderer.getCardArt(card); }
if (image == null) { return; }
float w = getWidth();
float h = getHeight();
g.drawImage(image, 0, 0, w, h);
} }
@Override @Override