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/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

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.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;

View File

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