From 4609b0bb05890709642defcc2cad83ced3891b53 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Wed, 9 Oct 2019 06:36:34 +0800 Subject: [PATCH] Alternative/Faster Round Border --- forge-gui-mobile/src/forge/Graphics.java | 24 +++++++ .../src/forge/card/CardImage.java | 32 +++++++++- .../src/forge/card/CardImageRenderer.java | 1 + .../src/forge/card/CardRenderer.java | 62 ++++++++++++++++--- .../forge/screens/settings/SettingsPage.java | 4 +- 5 files changed, 111 insertions(+), 12 deletions(-) diff --git a/forge-gui-mobile/src/forge/Graphics.java b/forge-gui-mobile/src/forge/Graphics.java index fd314326040..f61d036266c 100644 --- a/forge-gui-mobile/src/forge/Graphics.java +++ b/forge-gui-mobile/src/forge/Graphics.java @@ -343,6 +343,30 @@ public class Graphics { batch.begin(); } + public void fillRoundRect(Color color, float x, float y, float w, float h, float radius) { + batch.end(); //must pause batch while rendering shapes + if (alphaComposite < 1) { + color = FSkinColor.alphaColor(color, color.a * alphaComposite); + } + if (color.a < 1) { //enable blending so alpha colored shapes work properly + Gdx.gl.glEnable(GL_BLEND); + } + startShape(ShapeType.Filled); + shapeRenderer.setColor(color); + shapeRenderer.circle(adjustX(x+radius), adjustY(y+radius, 0), radius); + shapeRenderer.circle(adjustX((x+w) - radius), adjustY(y+radius, 0), radius); + shapeRenderer.circle(adjustX(x+radius), adjustY((y+h) - radius, 0), radius); + shapeRenderer.circle(adjustX((x+w) - radius), adjustY((y+h) - radius, 0), radius); + + shapeRenderer.rect(adjustX(x), adjustY(y+radius, h-radius*2), w, h-radius*2); + shapeRenderer.rect(adjustX(x+radius), adjustY(y, h), w-radius*2, h); + endShape(); + if (color.a < 1) { + Gdx.gl.glDisable(GL_BLEND); + } + batch.begin(); + } + public void drawRect(float thickness, FSkinColor skinColor, float x, float y, float w, float h) { drawRect(thickness, skinColor.getColor(), x, y, w, h); } diff --git a/forge-gui-mobile/src/forge/card/CardImage.java b/forge-gui-mobile/src/forge/card/CardImage.java index 5bc7c0bbc9a..7ff5674baba 100644 --- a/forge-gui-mobile/src/forge/card/CardImage.java +++ b/forge-gui-mobile/src/forge/card/CardImage.java @@ -1,7 +1,9 @@ package forge.card; +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.TextureRegion; import forge.Graphics; import forge.assets.FImage; import forge.assets.ImageCache; @@ -22,6 +24,24 @@ public class CardImage implements FImage { private static boolean isPreferenceEnabled(ForgePreferences.FPref preferenceName) { return FModel.getPreferences().getPrefBoolean(preferenceName); } + public static TextureRegion croppedBorderImage(Texture image) { + float rscale = 0.96f; + int rw = Math.round(image.getWidth()*rscale); + int rh = Math.round(image.getHeight()*rscale); + int rx = Math.round((image.getWidth() - rw)/2); + int ry = Math.round((image.getHeight() - rh)/2); + TextureRegion rimage = new TextureRegion(image, rx, ry, rw, rh); + return rimage; + } + public static Color borderColor(PaperCard c) { + if (c == null) + return Color.valueOf("#1c1c1c"); + + CardEdition ed = FModel.getMagicDb().getEditions().get(c.getEdition()); + if (ed != null && ed.isWhiteBorder()) + return Color.valueOf("#fffffd"); + return Color.valueOf("#1c1c1c"); + } @Override public float getWidth() { @@ -38,9 +58,9 @@ public class CardImage implements FImage { @Override public void draw(Graphics g, float x, float y, float w, float h) { + boolean mask = isPreferenceEnabled(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING); if (image == null) { //attempt to retrieve card image if needed - boolean mask = isPreferenceEnabled(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING); - image = ImageCache.getImage(card, mask); + image = ImageCache.getImage(card); if (image == null) { if (mask) //render this if mask is still loading CardImageRenderer.drawCardImage(g, CardView.getCardForUi(card), false, x, y, w, h, CardStackPosition.Top); @@ -53,7 +73,13 @@ public class CardImage implements FImage { CardImageRenderer.drawCardImage(g, CardView.getCardForUi(card), false, x, y, w, h, CardStackPosition.Top); } else { - g.drawImage(image, x, y, w, h); + if (mask) { + float radius = (h - w)/8; + g.fillRoundRect(borderColor(card), x, y, w, h, radius); + g.drawImage(croppedBorderImage(image), x+radius/2.2f, y+radius/2, w*0.96f, h*0.96f); + } + else + g.drawImage(image, x, y, w, h); } } } diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index 83312fae841..4bf0126e43a 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -326,6 +326,7 @@ public class CardImageRenderer { public static void drawZoom(Graphics g, CardView card, GameView gameView, boolean altState, float x, float y, float w, float h, float dispW, float dispH, boolean isCurrentCard) { boolean mask = isPreferenceEnabled(ForgePreferences.FPref.UI_ENABLE_BORDER_MASKING); + //this one is currently using the mask, others are cropped and use generated borders from shaperenderer ... final Texture image = ImageCache.getImage(card.getState(altState).getImageKey(MatchController.instance.getLocalPlayers()), true, mask); if (image == null) { //draw details if can't draw zoom drawDetails(g, card, gameView, altState, x, y, w, h); diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 9de5629ea4a..0021ca697f1 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -391,16 +391,50 @@ public class CardRenderer { g.drawText(set, font, foreColor, x, y, w, h, false, Align.center, true); } + public static TextureRegion croppedBorderImage(Texture image) { + float rscale = 0.96f; + int rw = Math.round(image.getWidth()*rscale); + int rh = Math.round(image.getHeight()*rscale); + int rx = Math.round((image.getWidth() - rw)/2); + int ry = Math.round((image.getHeight() - rh)/2); + TextureRegion rimage = new TextureRegion(image, rx, ry, rw, rh); + return rimage; + } + public static Color borderColor(IPaperCard c) { + if (c == null) + return Color.valueOf("#1c1c1c"); + + CardEdition ed = FModel.getMagicDb().getEditions().get(c.getEdition()); + if (ed != null && ed.isWhiteBorder()) + return Color.valueOf("#fffffd"); + return Color.valueOf("#1c1c1c"); + } + public static Color borderColor(CardView c) { + if (c == null) + return Color.valueOf("#1c1c1c"); + + CardStateView state = c.getCurrentState(); + CardEdition ed = FModel.getMagicDb().getEditions().get(state.getSetCode()); + if (ed != null && ed.isWhiteBorder() && state.getFoilIndex() == 0) + return Color.valueOf("#fffffd"); + return Color.valueOf("#1c1c1c"); + } public static void drawCard(Graphics g, IPaperCard pc, float x, float y, float w, float h, CardStackPosition pos) { boolean mask = isPreferenceEnabled(FPref.UI_ENABLE_BORDER_MASKING); - Texture image = new RendererCachedCardImage(pc, false).getImage(mask); + Texture image = new RendererCachedCardImage(pc, false).getImage(); if (image != null) { if (image == ImageCache.defaultImage) { CardImageRenderer.drawCardImage(g, CardView.getCardForUi(pc), false, x, y, w, h, pos); } else { - g.drawImage(image, x, y, w, h); + if (mask) { + float radius = (h - w)/8; + g.fillRoundRect(borderColor(pc), x, y, w, h, radius); + g.drawImage(croppedBorderImage(image), x+radius/2.2f, y+radius/2, w*0.96f, h*0.96f); + } + else + g.drawImage(image, x, y, w, h); } if (pc.isFoil()) { //draw foil effect if needed final CardView card = CardView.getCardForUi(pc); @@ -420,7 +454,7 @@ public class CardRenderer { public static void drawCard(Graphics g, CardView card, float x, float y, float w, float h, CardStackPosition pos, boolean rotate) { boolean mask = isPreferenceEnabled(FPref.UI_ENABLE_BORDER_MASKING); - Texture image = new RendererCachedCardImage(card, false).getImage(mask); + Texture image = new RendererCachedCardImage(card, false).getImage(); if (image != null) { if (image == ImageCache.defaultImage) { @@ -428,10 +462,24 @@ public class CardRenderer { } else { if(FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_ROTATE_PLANE_OR_PHENOMENON) - && (card.getCurrentState().isPhenomenon() || card.getCurrentState().isPlane()) && rotate) - g.drawRotatedImage(image, x, y, w, h, x + w / 2, y + h / 2, -90); - else - g.drawImage(image, x, y, w, h); + && (card.getCurrentState().isPhenomenon() || card.getCurrentState().isPlane()) && rotate){ + if (mask) { + float radius = (h - w)/8; + g.fillRoundRect(borderColor(card), x, y, w, h, radius); + g.drawRotatedImage(croppedBorderImage(image), x+radius/2.2f, y+radius/2, w*0.96f, h*0.96f, (x+radius/2) + (w*0.96f) / 2, (y+radius/2) + (h*0.96f) / 2, -90); + } + else + g.drawRotatedImage(image, x, y, w, h, x + w / 2, y + h / 2, -90); + } + else { + if (mask) { + float radius = (h - w)/8; + g.fillRoundRect(borderColor(card), x, y, w, h, radius); + g.drawImage(croppedBorderImage(image), x+radius/2.2f, y+radius/2, w*0.96f, h*0.96f); + } + else + g.drawImage(image, x, y, w, h); + } } drawFoilEffect(g, card, x, y, w, h, false); } diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index 409ed8a81b2..5c672c12e1f 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -302,8 +302,8 @@ public class SettingsPage extends TabPage { localizer.getMessage("nlDisableCardEffect")), 4); lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_BORDER_MASKING, - "Experimental Round Border Mask", - "When enabled, the card corners are rounded (CPU/GPU Dependent atm)."), + "Enable Round Border Mask", + "When enabled, the card corners are rounded (Preferably Card with Full Borders)."), 4); lstSettings.addItem(new CustomSelectSetting(FPref.UI_CARD_COUNTER_DISPLAY_TYPE,