mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 02:38:02 +00:00
Merge branch 'newBranch' into 'master'
[Mobile] Refactor Border Generation See merge request core-developers/forge!3190
This commit is contained in:
@@ -19,6 +19,7 @@ package forge.assets;
|
||||
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.graphics.Pixmap;
|
||||
import com.badlogic.gdx.graphics.Pixmap.Format;
|
||||
import com.badlogic.gdx.graphics.Texture;
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
@@ -39,7 +40,9 @@ import forge.properties.ForgeConstants;
|
||||
import forge.util.ImageUtil;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@@ -77,6 +80,7 @@ public class ImageCache {
|
||||
public static final Texture defaultImage;
|
||||
public static FImage BlackBorder = FSkinImage.IMG_BORDER_BLACK;
|
||||
public static FImage WhiteBorder = FSkinImage.IMG_BORDER_WHITE;
|
||||
private static final Map<Texture, Boolean> Borders = new HashMap<>();
|
||||
|
||||
private static boolean imageLoaded, delayLoadRequested;
|
||||
public static void allowSingleLoad() {
|
||||
@@ -99,6 +103,7 @@ public class ImageCache {
|
||||
cache.invalidateAll();
|
||||
cache.cleanUp();
|
||||
missingIconKeys.clear();
|
||||
Borders.clear();
|
||||
}
|
||||
|
||||
public static void disposeTexture(){
|
||||
@@ -181,6 +186,8 @@ public class ImageCache {
|
||||
if (useDefaultIfNotFound) {
|
||||
image = defaultImage;
|
||||
cache.put(imageKey, defaultImage);
|
||||
if (Borders.get(image) == null)
|
||||
Borders.put(image, false); //black border
|
||||
}
|
||||
}
|
||||
return image;
|
||||
@@ -192,8 +199,8 @@ public class ImageCache {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
public static TextureRegion croppedBorderImage(Texture image, boolean fullborder) {
|
||||
if (!fullborder)
|
||||
public static TextureRegion croppedBorderImage(Texture image) {
|
||||
if (!image.toString().contains(".fullborder."))
|
||||
return new TextureRegion(image);
|
||||
float rscale = 0.96f;
|
||||
int rw = Math.round(image.getWidth()*rscale);
|
||||
@@ -202,25 +209,6 @@ public class ImageCache {
|
||||
int ry = Math.round((image.getHeight() - rh)/2f)-2;
|
||||
return new TextureRegion(image, rx, ry, rw, rh);
|
||||
}
|
||||
public static boolean isWhiteBordered(IPaperCard c) {
|
||||
if (c == null)
|
||||
return false;
|
||||
|
||||
CardEdition ed = FModel.getMagicDb().getEditions().get(c.getEdition());
|
||||
if (ed != null && ed.isWhiteBorder())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
public static boolean isWhiteBordered(CardView c) {
|
||||
if (c == null)
|
||||
return false;
|
||||
|
||||
CardView.CardStateView state = c.getCurrentState();
|
||||
CardEdition ed = FModel.getMagicDb().getEditions().get(state.getSetCode());
|
||||
if (ed != null && ed.isWhiteBorder() && state.getFoilIndex() == 0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
public static Color borderColor(IPaperCard c) {
|
||||
if (c == null)
|
||||
return Color.valueOf("#171717");
|
||||
@@ -271,17 +259,38 @@ public class ImageCache {
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
public static FImage getBorderImage(CardView c, boolean canshow) {
|
||||
public static FImage getBorder(Texture t) {
|
||||
if (Borders.get(t) == null)
|
||||
Borders.put(t, isCloserToWhite(getpixelColor(t)));
|
||||
return Borders.get(t) ? WhiteBorder : BlackBorder;
|
||||
}
|
||||
public static FImage getBorderImage(Texture t, boolean canshow) {
|
||||
if (!canshow)
|
||||
return BlackBorder;
|
||||
if (isWhiteBordered(c))
|
||||
return WhiteBorder;
|
||||
return BlackBorder;
|
||||
return getBorder(t);
|
||||
}
|
||||
public static FImage getBorderImage(IPaperCard c) {
|
||||
if (isWhiteBordered(c))
|
||||
return WhiteBorder;
|
||||
return BlackBorder;
|
||||
public static FImage getBorderImage(Texture t) {
|
||||
return getBorder(t);
|
||||
}
|
||||
public static String getpixelColor(Texture i) {
|
||||
if (!i.getTextureData().isPrepared()) {
|
||||
i.getTextureData().prepare(); //prepare texture
|
||||
}
|
||||
//get pixmap from texture data
|
||||
Pixmap pixmap = i.getTextureData().consumePixmap();
|
||||
//get pixel color from x,y texture coordinate based on the image fullborder or not
|
||||
Color color = new Color(pixmap.getPixel(croppedBorderImage(i).getRegionX()+1, croppedBorderImage(i).getRegionY()+1));
|
||||
pixmap.dispose();
|
||||
return color.toString();
|
||||
}
|
||||
public static boolean isCloserToWhite(String c){
|
||||
if (c == null || c == "")
|
||||
return false;
|
||||
int c_r = Integer.parseInt(c.substring(0,2),16);
|
||||
int c_g = Integer.parseInt(c.substring(2,4),16);
|
||||
int c_b = Integer.parseInt(c.substring(4,6),16);
|
||||
int brightness = ((c_r * 299) + (c_g * 587) + (c_b * 114)) / 1000;
|
||||
return brightness > 155;
|
||||
}
|
||||
public static Color getTint(CardView c) {
|
||||
if (c == null)
|
||||
|
||||
@@ -49,13 +49,12 @@ public class CardImage implements FImage {
|
||||
}
|
||||
else {
|
||||
if (Forge.enableUIMask) {
|
||||
boolean fullborder = image.toString().contains(".fullborder.");
|
||||
if (ImageCache.isExtendedArt(card))
|
||||
g.drawImage(image, x, y, w, h);
|
||||
else {
|
||||
float radius = (h - w)/8;
|
||||
g.drawfillBorder(3, ImageCache.borderColor(card), x, y, w, h, radius);
|
||||
g.drawImage(ImageCache.croppedBorderImage(image, fullborder), x+radius/2.2f, y+radius/2, w*0.96f, h*0.96f);
|
||||
g.drawImage(ImageCache.croppedBorderImage(image), x+radius/2.2f, y+radius/2, w*0.96f, h*0.96f);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -348,7 +348,6 @@ public class CardImageRenderer {
|
||||
if (image == ImageCache.defaultImage) { //support drawing card image manually if card image not found
|
||||
drawCardImage(g, card, altState, x, y, w, h, CardStackPosition.Top);
|
||||
} else {
|
||||
boolean fullborder = image.toString().contains(".fullborder.");
|
||||
float radius = (h - w)/8;
|
||||
float wh_Adj = ForgeConstants.isGdxPortLandscape && isCurrentCard ? 1.38f:1.0f;
|
||||
float new_w = w*wh_Adj;
|
||||
@@ -371,7 +370,7 @@ public class CardImageRenderer {
|
||||
g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, -90);
|
||||
else {
|
||||
g.drawRotatedImage(FSkin.getBorders().get(0), new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, -90);
|
||||
g.drawRotatedImage(ImageCache.croppedBorderImage(image, fullborder), new_x+radius/2-minusxy, new_y+radius/2-minusxy, new_w*croppedArea, new_h*croppedArea, (new_x+radius/2-minusxy) + (new_w*croppedArea) / 2, (new_y+radius/2-minusxy) + (new_h*croppedArea) / 2, -90);
|
||||
g.drawRotatedImage(ImageCache.croppedBorderImage(image), new_x+radius/2-minusxy, new_y+radius/2-minusxy, new_w*croppedArea, new_h*croppedArea, (new_x+radius/2-minusxy) + (new_w*croppedArea) / 2, (new_y+radius/2-minusxy) + (new_h*croppedArea) / 2, -90);
|
||||
}
|
||||
} else
|
||||
g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, -90);
|
||||
@@ -382,7 +381,7 @@ public class CardImageRenderer {
|
||||
g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, isAftermath ? 90 : -90);
|
||||
else {
|
||||
g.drawRotatedImage(FSkin.getBorders().get(ImageCache.getFSkinBorders(card)), new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, isAftermath ? 90 : -90);
|
||||
g.drawRotatedImage(ImageCache.croppedBorderImage(image, fullborder), new_x + radius / 2-minusxy, new_y + radius / 2-minusxy, new_w * croppedArea, new_h * croppedArea, (new_x + radius / 2-minusxy) + (new_w * croppedArea) / 2, (new_y + radius / 2-minusxy) + (new_h * croppedArea) / 2, isAftermath ? 90 : -90);
|
||||
g.drawRotatedImage(ImageCache.croppedBorderImage(image), new_x + radius / 2-minusxy, new_y + radius / 2-minusxy, new_w * croppedArea, new_h * croppedArea, (new_x + radius / 2-minusxy) + (new_w * croppedArea) / 2, (new_y + radius / 2-minusxy) + (new_h * croppedArea) / 2, isAftermath ? 90 : -90);
|
||||
}
|
||||
} else
|
||||
g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, isAftermath ? 90 : -90);
|
||||
@@ -391,8 +390,8 @@ public class CardImageRenderer {
|
||||
if (ImageCache.isExtendedArt(card))
|
||||
g.drawImage(image, x, y, w, h);
|
||||
else {
|
||||
g.drawImage(ImageCache.getBorderImage(card, canshow), x, y, w, h);
|
||||
g.drawImage(ImageCache.croppedBorderImage(image, fullborder), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea);
|
||||
g.drawImage(ImageCache.getBorderImage(image, canshow), x, y, w, h);
|
||||
g.drawImage(ImageCache.croppedBorderImage(image), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea);
|
||||
}
|
||||
} else {
|
||||
if (canshow)
|
||||
|
||||
@@ -459,13 +459,12 @@ public class CardRenderer {
|
||||
if (image == ImageCache.defaultImage) {
|
||||
CardImageRenderer.drawCardImage(g, CardView.getCardForUi(pc), false, x, y, w, h, pos);
|
||||
} else {
|
||||
boolean fullborder = image.toString().contains(".fullborder.");
|
||||
if (Forge.enableUIMask) {
|
||||
if (ImageCache.isExtendedArt(pc))
|
||||
g.drawImage(image, x, y, w, h);
|
||||
else {
|
||||
g.drawImage(ImageCache.getBorderImage(pc), x, y, w, h);
|
||||
g.drawImage(ImageCache.croppedBorderImage(image, fullborder), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea);
|
||||
g.drawImage(ImageCache.getBorderImage(image), x, y, w, h);
|
||||
g.drawImage(ImageCache.croppedBorderImage(image), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea);
|
||||
}
|
||||
} else
|
||||
g.drawImage(image, x, y, w, h);
|
||||
@@ -499,7 +498,6 @@ public class CardRenderer {
|
||||
if (image == ImageCache.defaultImage) {
|
||||
CardImageRenderer.drawCardImage(g, card, false, x, y, w, h, pos);
|
||||
} else {
|
||||
boolean fullborder = image.toString().contains(".fullborder.");
|
||||
if(FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_ROTATE_PLANE_OR_PHENOMENON)
|
||||
&& (card.getCurrentState().isPhenomenon() || card.getCurrentState().isPlane()) && rotate){
|
||||
if (Forge.enableUIMask) {
|
||||
@@ -507,7 +505,7 @@ public class CardRenderer {
|
||||
g.drawRotatedImage(image, x, y, w, h, x + w / 2, y + h / 2, -90);
|
||||
else {
|
||||
g.drawRotatedImage(FSkin.getBorders().get(0), x, y, w, h, x + w / 2, y + h / 2, -90);
|
||||
g.drawRotatedImage(ImageCache.croppedBorderImage(image, fullborder), x+radius/2.3f-minusxy, y+radius/2-minusxy, w*croppedArea, h*croppedArea, (x+radius/2.3f-minusxy) + (w*croppedArea) / 2, (y+radius/2-minusxy) + (h*croppedArea) / 2, -90);
|
||||
g.drawRotatedImage(ImageCache.croppedBorderImage(image), x+radius/2.3f-minusxy, y+radius/2-minusxy, w*croppedArea, h*croppedArea, (x+radius/2.3f-minusxy) + (w*croppedArea) / 2, (y+radius/2-minusxy) + (h*croppedArea) / 2, -90);
|
||||
}
|
||||
} else
|
||||
g.drawRotatedImage(image, x, y, w, h, x + w / 2, y + h / 2, -90);
|
||||
@@ -517,8 +515,8 @@ public class CardRenderer {
|
||||
g.drawImage(image, x, y, w, h);
|
||||
else {
|
||||
boolean t = (card.getCurrentState().getOriginalColors() != card.getCurrentState().getColors()) || card.getCurrentState().hasChangeColors();
|
||||
g.drawBorderImage(ImageCache.getBorderImage(card, canshow), ImageCache.getTint(card), x, y, w, h, t); //tint check for changed colors
|
||||
g.drawImage(ImageCache.croppedBorderImage(image, fullborder), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea);
|
||||
g.drawBorderImage(ImageCache.getBorderImage(image, canshow), ImageCache.getTint(card), x, y, w, h, t); //tint check for changed colors
|
||||
g.drawImage(ImageCache.croppedBorderImage(image), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea);
|
||||
}
|
||||
} else {
|
||||
if (canshow)
|
||||
|
||||
Reference in New Issue
Block a user