[mage.client] Foil cards support. For now have strange noise that is only with JInternalFrame, works for JFrame nicely so possibly will need to reimplement all dialogs.

For now every 5 card is a foil and the property is not attached to the card and may differ in various zone (need to change card entity).
This commit is contained in:
magenoxx 2011-01-05 13:14:39 +03:00
parent 7bea472fff
commit 3cf90f2875
19 changed files with 1424 additions and 1041 deletions

View file

@ -34,26 +34,6 @@
package mage.client; package mage.client;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.Preferences;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.JToolBar.Separator;
import com.sun.java.swing.Painter;
import mage.cards.decks.Deck; import mage.cards.decks.Deck;
import mage.client.cards.CardsStorage; import mage.client.cards.CardsStorage;
import mage.client.components.MageComponents; import mage.client.components.MageComponents;
@ -69,151 +49,168 @@ import mage.client.util.gui.ArrowBuilder;
import mage.components.ImagePanel; import mage.components.ImagePanel;
import mage.util.Logging; import mage.util.Logging;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.JToolBar.Separator;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.Preferences;
/** /**
*
* @author BetaSteward_at_googlemail.com * @author BetaSteward_at_googlemail.com
*/ */
public class MageFrame extends javax.swing.JFrame { public class MageFrame extends javax.swing.JFrame {
private final static Logger logger = Logging.getLogger(MageFrame.class.getName()); private final static Logger logger = Logging.getLogger(MageFrame.class.getName());
private static Session session; private static Session session;
private ConnectDialog connectDialog; private ConnectDialog connectDialog;
private static CombatDialog combat; private static CombatDialog combat;
private static PickNumberDialog pickNumber; private static PickNumberDialog pickNumber;
private static Preferences prefs = Preferences.userNodeForPackage(MageFrame.class); private static Preferences prefs = Preferences.userNodeForPackage(MageFrame.class);
private JLabel title; private JLabel title;
private Rectangle titleRectangle; private Rectangle titleRectangle;
/**
* @return the session
*/
public static Session getSession() {
return session;
}
public static JDesktopPane getDesktop() { /**
return desktopPane; * @return the session
} */
public static Session getSession() {
return session;
}
public static Preferences getPreferences() { public static JDesktopPane getDesktop() {
return prefs; return desktopPane;
} }
/** Creates new form MageFrame */ public static Preferences getPreferences() {
return prefs;
}
/**
* Creates new form MageFrame
*/
public MageFrame() { public MageFrame() {
setTitle("Mage, version 0.5.1"); setTitle("Mage, version 0.5.1");
EDTExceptionHandler.registerExceptionHandler();
addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e)
{
exitApp();
}
});
try { EDTExceptionHandler.registerExceptionHandler();
UIManager.put("desktop", new Color(0,0,0,0)); addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
exitApp();
}
});
try {
UIManager.put("desktop", new Color(0, 0, 0, 0));
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
//MageSynthStyleFactory f = new MageSynthStyleFactory(SynthLookAndFeel.getStyleFactory()); //MageSynthStyleFactory f = new MageSynthStyleFactory(SynthLookAndFeel.getStyleFactory());
//SynthLookAndFeel.setStyleFactory(f); //SynthLookAndFeel.setStyleFactory(f);
} catch (Exception ex) { } catch (Exception ex) {
logger.log(Level.SEVERE, null, ex); logger.log(Level.SEVERE, null, ex);
} }
Plugins.getInstance().loadPlugins(); Plugins.getInstance().loadPlugins();
initComponents(); initComponents();
setSize(1024,768); setSize(1024, 768);
this.setExtendedState(JFrame.MAXIMIZED_BOTH); this.setExtendedState(JFrame.MAXIMIZED_BOTH);
session = new Session(this); session = new Session(this);
connectDialog = new ConnectDialog(); connectDialog = new ConnectDialog();
combat = new CombatDialog(); combat = new CombatDialog();
pickNumber = new PickNumberDialog(); pickNumber = new PickNumberDialog();
desktopPane.add(connectDialog, JLayeredPane.POPUP_LAYER); desktopPane.add(connectDialog, JLayeredPane.POPUP_LAYER);
desktopPane.add(combat, JLayeredPane.POPUP_LAYER); desktopPane.add(combat, JLayeredPane.POPUP_LAYER);
combat.hideDialog(); combat.hideDialog();
desktopPane.add(pickNumber, JLayeredPane.POPUP_LAYER); desktopPane.add(pickNumber, JLayeredPane.POPUP_LAYER);
session.getUI().addComponent(MageComponents.DESKTOP_PANE, desktopPane); session.getUI().addComponent(MageComponents.DESKTOP_PANE, desktopPane);
ManaSymbols.loadImages(); ManaSymbols.loadImages();
addTooltipContainer(); addTooltipContainer();
setBackground(); setBackground();
addMageLabel(); addMageLabel();
setAppIcon(); setAppIcon();
desktopPane.add(ArrowBuilder.getArrowsPanel(), JLayeredPane.DRAG_LAYER); desktopPane.add(ArrowBuilder.getArrowsPanel(), JLayeredPane.DRAG_LAYER);
desktopPane.addComponentListener(new ComponentAdapter(){ desktopPane.addComponentListener(new ComponentAdapter() {
@Override @Override
public void componentResized(ComponentEvent e) { public void componentResized(ComponentEvent e) {
int width = ((JComponent)e.getSource()).getWidth(); int width = ((JComponent) e.getSource()).getWidth();
int height = ((JComponent)e.getSource()).getHeight(); int height = ((JComponent) e.getSource()).getHeight();
backgroundPane.setSize(width, height); backgroundPane.setSize(width, height);
JPanel arrowsPanel = ArrowBuilder.getArrowsPanelRef(); JPanel arrowsPanel = ArrowBuilder.getArrowsPanelRef();
if (arrowsPanel != null) arrowsPanel.setSize(width, height); if (arrowsPanel != null) arrowsPanel.setSize(width, height);
if (title != null) { if (title != null) {
//title.setBorder(BorderFactory.createLineBorder(Color.red)); //title.setBorder(BorderFactory.createLineBorder(Color.red));
title.setBounds((int)(width - titleRectangle.getWidth())/2, (int)(height - titleRectangle.getHeight())/2, titleRectangle.width, titleRectangle.height); title.setBounds((int) (width - titleRectangle.getWidth()) / 2, (int) (height - titleRectangle.getHeight()) / 2, titleRectangle.width, titleRectangle.height);
} }
} }
}); });
//TODO: move to plugin impl //TODO: move to plugin impl
if (Plugins.getInstance().isCardPluginLoaded()) { if (Plugins.getInstance().isCardPluginLoaded()) {
Separator separator = new javax.swing.JToolBar.Separator(); Separator separator = new javax.swing.JToolBar.Separator();
mageToolbar.add(separator); mageToolbar.add(separator);
JButton btnDownloadSymbols = new JButton("Symbols"); JButton btnDownloadSymbols = new JButton("Symbols");
btnDownloadSymbols.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); btnDownloadSymbols.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
btnDownloadSymbols.setFocusable(false); btnDownloadSymbols.setFocusable(false);
btnDownloadSymbols.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); btnDownloadSymbols.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
btnDownloadSymbols.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); btnDownloadSymbols.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
btnDownloadSymbols.addActionListener(new java.awt.event.ActionListener() { btnDownloadSymbols.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) { public void actionPerformed(java.awt.event.ActionEvent evt) {
btnSymbolsActionPerformed(evt); btnSymbolsActionPerformed(evt);
} }
}); });
mageToolbar.add(btnDownloadSymbols); mageToolbar.add(btnDownloadSymbols);
separator = new javax.swing.JToolBar.Separator(); separator = new javax.swing.JToolBar.Separator();
mageToolbar.add(separator); mageToolbar.add(separator);
JButton btnDownload = new JButton("Images"); JButton btnDownload = new JButton("Images");
btnDownload.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); btnDownload.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
btnDownload.setFocusable(false); btnDownload.setFocusable(false);
btnDownload.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); btnDownload.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
btnDownload.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); btnDownload.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
btnDownload.addActionListener(new java.awt.event.ActionListener() { btnDownload.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) { public void actionPerformed(java.awt.event.ActionEvent evt) {
btnImagesActionPerformed(evt); btnImagesActionPerformed(evt);
} }
}); });
mageToolbar.add(btnDownload); mageToolbar.add(btnDownload);
} }
if (Plugins.getInstance().isCounterPluginLoaded()) { if (Plugins.getInstance().isCounterPluginLoaded()) {
int i = Plugins.getInstance().getGamesPlayed(); int i = Plugins.getInstance().getGamesPlayed();
JLabel label = new JLabel(" Games played: " + String.valueOf(i)); JLabel label = new JLabel(" Games played: " + String.valueOf(i));
desktopPane.add(label, JLayeredPane.DEFAULT_LAYER + 1); desktopPane.add(label, JLayeredPane.DEFAULT_LAYER + 1);
label.setVisible(true); label.setVisible(true);
label.setForeground(Color.white); label.setForeground(Color.white);
label.setBounds(0, 0, 180, 30); label.setBounds(0, 0, 180, 30);
} }
session.getUI().addButton(MageComponents.TABLES_MENU_BUTTON, btnGames); session.getUI().addButton(MageComponents.TABLES_MENU_BUTTON, btnGames);
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
public void run() { public void run() {
if (autoConnect()) if (autoConnect())
enableButtons(); enableButtons();
else else
disableButtons(); disableButtons();
} }
}); });
} }
@ -222,7 +219,7 @@ public class MageFrame extends javax.swing.JFrame {
final JEditorPane cardInfoPane = (JEditorPane) Plugins.getInstance().getCardInfoPane(); final JEditorPane cardInfoPane = (JEditorPane) Plugins.getInstance().getCardInfoPane();
cardInfoPane.setSize(320, 201); cardInfoPane.setSize(320, 201);
cardInfoPane.setLocation(40, 40); cardInfoPane.setLocation(40, 40);
cardInfoPane.setBackground(new Color(0,0,0,0)); cardInfoPane.setBackground(new Color(0, 0, 0, 0));
MageRoundPane popupContainer = new MageRoundPane(); MageRoundPane popupContainer = new MageRoundPane();
popupContainer.setLayout(null); popupContainer.setLayout(null);
@ -257,96 +254,95 @@ public class MageFrame extends javax.swing.JFrame {
private void addMageLabel() { private void addMageLabel() {
String filename = "/label-mage.png"; String filename = "/label-mage.png";
try { try {
InputStream is = this.getClass().getResourceAsStream(filename); InputStream is = this.getClass().getResourceAsStream(filename);
float ratio = 1179.0f / 678.0f; float ratio = 1179.0f / 678.0f;
titleRectangle = new Rectangle(640, (int)(640 / ratio)); titleRectangle = new Rectangle(640, (int) (640 / ratio));
if (is != null) { if (is != null) {
BufferedImage image = ImageIO.read(is); BufferedImage image = ImageIO.read(is);
//ImageIcon resized = new ImageIcon(image.getScaledInstance(titleRectangle.width, titleRectangle.height, java.awt.Image.SCALE_SMOOTH)); //ImageIcon resized = new ImageIcon(image.getScaledInstance(titleRectangle.width, titleRectangle.height, java.awt.Image.SCALE_SMOOTH));
title = new JLabel(); title = new JLabel();
title.setIcon(new ImageIcon(image)); title.setIcon(new ImageIcon(image));
backgroundPane.setLayout(null); backgroundPane.setLayout(null);
backgroundPane.add(title); backgroundPane.add(title);
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
private void setAppIcon() { private void setAppIcon() {
String filename = "/icon-mage.png"; String filename = "/icon-mage.png";
try { try {
InputStream is = this.getClass().getResourceAsStream(filename); InputStream is = this.getClass().getResourceAsStream(filename);
if (is != null) { if (is != null) {
BufferedImage image = ImageIO.read(is); BufferedImage image = ImageIO.read(is);
setIconImage(image); setIconImage(image);
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
private void btnImagesActionPerformed(java.awt.event.ActionEvent evt) {
Plugins.getInstance().downloadImage(CardsStorage.getAllCards());
}
private void btnSymbolsActionPerformed(java.awt.event.ActionEvent evt) {
if (JOptionPane.showConfirmDialog(null, "Do you want to download mana symbols?") == JOptionPane.OK_OPTION) {
Plugins.getInstance().downloadSymbols();
}
}
public void showGame(UUID gameId, UUID playerId) { private void btnImagesActionPerformed(java.awt.event.ActionEvent evt) {
this.tablesPane.hideTables(); Plugins.getInstance().downloadImage(CardsStorage.getAllCards());
this.tablesPane.setVisible(false); }
this.gamePane.setVisible(true);
this.gamePane.showGame(gameId, playerId);
}
public void watchGame(UUID gameId) { private void btnSymbolsActionPerformed(java.awt.event.ActionEvent evt) {
this.tablesPane.hideTables(); if (JOptionPane.showConfirmDialog(null, "Do you want to download mana symbols?") == JOptionPane.OK_OPTION) {
this.tablesPane.setVisible(false); Plugins.getInstance().downloadSymbols();
this.gamePane.setVisible(true); }
this.gamePane.watchGame(gameId); }
}
public void replayGame() { public void showGame(UUID gameId, UUID playerId) {
this.tablesPane.hideTables(); this.tablesPane.hideTables();
this.tablesPane.setVisible(false); this.tablesPane.setVisible(false);
this.gamePane.setVisible(true); this.gamePane.setVisible(true);
this.gamePane.replayGame(); this.gamePane.showGame(gameId, playerId);
} }
public static boolean connect(String userName, String serverName, int port) { public void watchGame(UUID gameId) {
return session.connect(userName, serverName, port); this.tablesPane.hideTables();
} this.tablesPane.setVisible(false);
this.gamePane.setVisible(true);
this.gamePane.watchGame(gameId);
}
public boolean autoConnect() { public void replayGame() {
boolean autoConnect = Boolean.parseBoolean(prefs.get("autoConnect", "false")); this.tablesPane.hideTables();
if (autoConnect) { this.tablesPane.setVisible(false);
String userName = prefs.get("userName", ""); this.gamePane.setVisible(true);
String server = prefs.get("serverAddress", ""); this.gamePane.replayGame();
int port = Integer.parseInt(prefs.get("serverPort", "")); }
try {
setCursor(new Cursor(Cursor.WAIT_CURSOR));
if (MageFrame.connect(userName, server, port)) {
return true;
}
else {
JOptionPane.showMessageDialog(rootPane, "Unable to connect to server");
}
}
finally {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
}
return false;
}
/** This method is called from within the constructor to public static boolean connect(String userName, String serverName, int port) {
return session.connect(userName, serverName, port);
}
public boolean autoConnect() {
boolean autoConnect = Boolean.parseBoolean(prefs.get("autoConnect", "false"));
if (autoConnect) {
String userName = prefs.get("userName", "");
String server = prefs.get("serverAddress", "");
int port = Integer.parseInt(prefs.get("serverPort", ""));
try {
setCursor(new Cursor(Cursor.WAIT_CURSOR));
if (MageFrame.connect(userName, server, port)) {
return true;
} else {
JOptionPane.showMessageDialog(rootPane, "Unable to connect to server");
}
} finally {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
}
return false;
}
/**
* This method is called from within the constructor to
* initialize the form. * initialize the form.
* WARNING: Do NOT modify this code. The content of this method is * WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor. * always regenerated by the Form Editor.
@ -440,7 +436,7 @@ public class MageFrame extends javax.swing.JFrame {
}); });
mageToolbar.add(btnDeckEditor); mageToolbar.add(btnDeckEditor);
mageToolbar.add(jSeparator2); mageToolbar.add(jSeparator2);
btnPreferences.setText("Preferences"); btnPreferences.setText("Preferences");
btnPreferences.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); btnPreferences.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
btnPreferences.setFocusable(false); btnPreferences.setFocusable(false);
@ -486,122 +482,121 @@ public class MageFrame extends javax.swing.JFrame {
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout); getContentPane().setLayout(layout);
layout.setHorizontalGroup( layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 1144, Short.MAX_VALUE) .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 1144, Short.MAX_VALUE)
.addComponent(mageToolbar, javax.swing.GroupLayout.DEFAULT_SIZE, 1144, Short.MAX_VALUE) .addComponent(mageToolbar, javax.swing.GroupLayout.DEFAULT_SIZE, 1144, Short.MAX_VALUE)
); );
layout.setVerticalGroup( layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addComponent(mageToolbar, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(mageToolbar, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, 0) .addGap(0, 0, 0)
.addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 880, Short.MAX_VALUE)) .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 880, Short.MAX_VALUE))
); );
pack(); pack();
}// </editor-fold>//GEN-END:initComponents }// </editor-fold>//GEN-END:initComponents
private void btnDeckEditorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDeckEditorActionPerformed private void btnDeckEditorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDeckEditorActionPerformed
this.gamePane.setVisible(false); this.gamePane.setVisible(false);
this.tablesPane.setVisible(false); this.tablesPane.setVisible(false);
showDeckEditor(DeckEditorMode.Constructed, null, null); showDeckEditor(DeckEditorMode.Constructed, null, null);
}//GEN-LAST:event_btnDeckEditorActionPerformed }//GEN-LAST:event_btnDeckEditorActionPerformed
private void btnPreferencesActionPerformed(java.awt.event.ActionEvent evt) { private void btnPreferencesActionPerformed(java.awt.event.ActionEvent evt) {
PhasesDialog.main(new String[]{}); PhasesDialog.main(new String[]{});
} }
private void btnGamesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGamesActionPerformed
this.gamePane.setVisible(false);
this.deckEditorPane.setVisible(false);
this.tablesPane.setVisible(true);
this.tablesPane.showTables();
}//GEN-LAST:event_btnGamesActionPerformed
private void btnExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExitActionPerformed private void btnGamesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGamesActionPerformed
exitApp(); this.gamePane.setVisible(false);
}//GEN-LAST:event_btnExitActionPerformed this.deckEditorPane.setVisible(false);
this.tablesPane.setVisible(true);
this.tablesPane.showTables();
}//GEN-LAST:event_btnGamesActionPerformed
private void btnConnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnConnectActionPerformed private void btnExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExitActionPerformed
if (session.isConnected()) { exitApp();
if (JOptionPane.showConfirmDialog(this, "Are you sure you want to disconnect?", "Confirm disconnect", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { }//GEN-LAST:event_btnExitActionPerformed
session.disconnect();
}
}
else {
connectDialog.showDialog();
}
}//GEN-LAST:event_btnConnectActionPerformed
private void btnAboutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAboutActionPerformed private void btnConnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnConnectActionPerformed
AboutDialog aboutDialog = new AboutDialog(); if (session.isConnected()) {
desktopPane.add(aboutDialog); if (JOptionPane.showConfirmDialog(this, "Are you sure you want to disconnect?", "Confirm disconnect", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
aboutDialog.showDialog(); session.disconnect();
}//GEN-LAST:event_btnAboutActionPerformed }
} else {
connectDialog.showDialog();
}
}//GEN-LAST:event_btnConnectActionPerformed
public void exitApp() { private void btnAboutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAboutActionPerformed
session.disconnect(); AboutDialog aboutDialog = new AboutDialog();
Plugins.getInstance().shutdown(); desktopPane.add(aboutDialog);
dispose(); aboutDialog.showDialog();
System.exit(0); }//GEN-LAST:event_btnAboutActionPerformed
}
public void enableButtons() { public void exitApp() {
btnConnect.setEnabled(true); session.disconnect();
btnConnect.setText("Disconnect"); Plugins.getInstance().shutdown();
btnGames.setEnabled(true); dispose();
btnDeckEditor.setEnabled(true); System.exit(0);
} }
public void disableButtons() { public void enableButtons() {
btnConnect.setEnabled(true); btnConnect.setEnabled(true);
btnConnect.setText("Connect"); btnConnect.setText("Disconnect");
btnGames.setEnabled(false); btnGames.setEnabled(true);
btnDeckEditor.setEnabled(true); btnDeckEditor.setEnabled(true);
this.tablesPane.setVisible(false); }
this.gamePane.setVisible(false);
this.deckEditorPane.setVisible(false);
}
public void showDeckEditor(DeckEditorMode mode, Deck deck, UUID tableId) { public void disableButtons() {
this.deckEditorPane.setVisible(true); btnConnect.setEnabled(true);
this.deckEditorPane.show(mode, deck, tableId); btnConnect.setText("Connect");
} btnGames.setEnabled(false);
btnDeckEditor.setEnabled(true);
this.tablesPane.setVisible(false);
this.gamePane.setVisible(false);
this.deckEditorPane.setVisible(false);
}
public static CombatDialog getCombatDialog() { public void showDeckEditor(DeckEditorMode mode, Deck deck, UUID tableId) {
return combat; this.deckEditorPane.setVisible(true);
} this.deckEditorPane.show(mode, deck, tableId);
}
public static PickNumberDialog getPickNumberDialog() { public static CombatDialog getCombatDialog() {
return pickNumber; return combat;
} }
static void renderSplashFrame(Graphics2D g) { public static PickNumberDialog getPickNumberDialog() {
return pickNumber;
}
static void renderSplashFrame(Graphics2D g) {
g.setComposite(AlphaComposite.Clear); g.setComposite(AlphaComposite.Clear);
g.fillRect(120,140,200,40); g.fillRect(120, 140, 200, 40);
g.setPaintMode(); g.setPaintMode();
g.setColor(Color.white); g.setColor(Color.white);
g.drawString("Version 0.5.1", 560, 460); g.drawString("Version 0.5.1", 560, 460);
} }
/** /**
* @param args the command line arguments * @param args the command line arguments
*/ */
public static void main(String args[]) { public static void main(String args[]) {
final SplashScreen splash = SplashScreen.getSplashScreen(); final SplashScreen splash = SplashScreen.getSplashScreen();
if (splash != null) { if (splash != null) {
Graphics2D g = splash.createGraphics(); Graphics2D g = splash.createGraphics();
if (g != null) { if (g != null) {
renderSplashFrame(g); renderSplashFrame(g);
} }
splash.update(); splash.update();
} }
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) { public void uncaughtException(Thread t, Throwable e) {
logger.log(Level.SEVERE, null, e); logger.log(Level.SEVERE, null, e);
} }
}); });
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
public void run() { public void run() {
new MageFrame().setVisible(true); new MageFrame().setVisible(true);
@ -628,11 +623,11 @@ public class MageFrame extends javax.swing.JFrame {
private javax.swing.JToolBar mageToolbar; private javax.swing.JToolBar mageToolbar;
private mage.client.table.TablesPane tablesPane; private mage.client.table.TablesPane tablesPane;
// End of variables declaration//GEN-END:variables // End of variables declaration//GEN-END:variables
private static final long serialVersionUID = -9104885239063142218L; private static final long serialVersionUID = -9104885239063142218L;
private ImagePanel backgroundPane; private ImagePanel backgroundPane;
public void setStatusText(String status) { public void setStatusText(String status) {
this.lblStatus.setText(status); this.lblStatus.setText(status);
} }
} }

View file

@ -34,105 +34,199 @@
package mage.client.cards; package mage.client.cards;
import static mage.constants.Constants.CONTENT_MAX_XOFFSET; import mage.client.plugins.impl.Plugins;
import static mage.constants.Constants.FRAME_MAX_HEIGHT; import mage.client.util.gui.BufferedImageBuilder;
import static mage.constants.Constants.FRAME_MAX_WIDTH; import mage.filters.FilterFactory;
import static mage.constants.Constants.TEXT_MAX_HEIGHT; import mage.filters.impl.HueFilter;
import static mage.constants.Constants.TEXT_MAX_WIDTH; import mage.utils.ThreadUtils;
import static mage.constants.Constants.TEXT_MAX_YOFFSET; import org.jdesktop.swingx.JXPanel;
import java.awt.Dimension; import javax.imageio.ImageIO;
import java.awt.Graphics; import javax.swing.*;
import java.awt.Image; import javax.swing.text.BadLocationException;
import java.awt.Rectangle; import javax.swing.text.StyledDocument;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import javax.swing.text.BadLocationException; import static mage.constants.Constants.*;
import javax.swing.text.StyledDocument;
import mage.client.plugins.impl.Plugins;
import org.jdesktop.swingx.JXPanel;
/** /**
* Class for displaying big image of the card
* *
* @author BetaSteward_at_googlemail.com * @author BetaSteward_at_googlemail.com, nantuko
*/ */
public class BigCard extends javax.swing.JPanel { public class BigCard extends JComponent {
protected Image bigImage; protected Image bigImage;
protected UUID cardId; protected BufferedImage source;
protected JXPanel panel; protected volatile BufferedImage foil;
protected boolean initState; protected UUID cardId;
protected JXPanel panel;
protected boolean initState;
protected boolean foilState;
protected Thread foilThread;
protected float hue = 0.005f;
public BigCard() { static private final int DEFAULT_DELAY_PERIOD = 25;
public BigCard() {
initComponents(); initComponents();
if (!Plugins.getInstance().isCardPluginLoaded()) { if (!Plugins.getInstance().isCardPluginLoaded()) {
initBounds(); initBounds();
} }
setDoubleBuffered(true);
setOpaque(true);
} }
protected void initBounds() { protected void initBounds() {
initState = true; initState = true;
scrollPane.setBounds(20, 230, 210, 120); scrollPane.setBounds(20, 230, 210, 120);
scrollPane.setBounds(new Rectangle(CONTENT_MAX_XOFFSET, TEXT_MAX_YOFFSET, TEXT_MAX_WIDTH, TEXT_MAX_HEIGHT)); scrollPane.setBounds(new Rectangle(CONTENT_MAX_XOFFSET, TEXT_MAX_YOFFSET, TEXT_MAX_WIDTH, TEXT_MAX_HEIGHT));
} }
public void setCard(UUID cardId, Image image, List<String> strings) { public void setCard(UUID cardId, Image image, List<String> strings, boolean foil) {
if (this.cardId == null || !this.cardId.equals(cardId)) { if (this.cardId == null || !this.cardId.equals(cardId)) {
if (this.panel != null) remove(this.panel); if (this.panel != null) remove(this.panel);
this.cardId = cardId; this.cardId = cardId;
bigImage = image; bigImage = image;
this.repaint(); synchronized (this) {
drawText(strings); source = null;
} hue = 0.000f;
} }
drawText(strings);
setFoil(foil);
}
}
public UUID getCardId() { public UUID getCardId() {
return cardId; return cardId;
} }
private void drawText(java.util.List<String> strings) {
text.setText("");
StyledDocument doc = text.getStyledDocument();
try { private void drawText(java.util.List<String> strings) {
for (String line: strings) { text.setText("");
doc.insertString(doc.getLength(), line + "\n", doc.getStyle("regular")); StyledDocument doc = text.getStyledDocument();
}
} catch (BadLocationException ble) { }
text.setCaretPosition(0);
}
@Override try {
public void paintComponent(Graphics graphics) { for (String line : strings) {
if (bigImage != null) doc.insertString(doc.getLength(), line + "\n", doc.getStyle("regular"));
graphics.drawImage(bigImage, 0, 0, this); }
super.paintComponent(graphics); } catch (BadLocationException ble) {
} }
text.setCaretPosition(0);
}
@Override
public void paintComponent(Graphics graphics) {
if (foilState) {
if (source != null) {
synchronized (BigCard.class) {
if (source != null) {
graphics.drawImage(foil, 0, 0, this);
}
}
}
} else {
if (bigImage != null) {
graphics.drawImage(bigImage, 0, 0, this);
}
}
super.paintComponent(graphics);
}
public void hideTextComponent() { public void hideTextComponent() {
this.scrollPane.setVisible(false); this.scrollPane.setVisible(false);
} }
public void showTextComponent() { public void showTextComponent() {
if (!initState) {initBounds();} if (!initState) {
this.scrollPane.setVisible(true); initBounds();
}
this.scrollPane.setVisible(true);
}
public void setFoil(boolean foil) {
if (foil) {
if (foilThread == null) {
synchronized (this) {
if (foilThread == null) {
foilThread = getFoilThread();
foilThread.setDaemon(true);
foilThread.start();
}
}
}
if (foil != foilState) {
synchronized (this) {
if (foil != foilState) {
hue = 0.005f;
foilState = foil;
}
}
}
}
repaint();
}
private Thread getFoilThread() {
return new Thread(new Runnable() {
@Override
public void run() {
if (bigImage == null) {
return;
}
final HueFilter filter = FilterFactory.getHueFilter();
while (true) {
boolean prevState = foilState;
while (!foilState) {
ThreadUtils.sleep(10);
}
if (prevState == foilState) {
ThreadUtils.sleep(DEFAULT_DELAY_PERIOD);
}
hue += 0.005F;
if (hue >= 1.0D) {
hue = 0.000F;
}
filter.setHue(hue);
BufferedImage f = null;
synchronized (BigCard.this) {
if (source == null) {
source = BufferedImageBuilder.bufferImage(bigImage);
}
f = filter.filter(source, null);
}
synchronized (BigCard.class) {
foil = f;
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
BigCard.this.repaint();
}
});
}
}
});
} }
public void addJXPanel(UUID cardId, JXPanel jxPanel) { public void addJXPanel(UUID cardId, JXPanel jxPanel) {
bigImage = null; bigImage = null;
synchronized (this) { synchronized (this) {
if (this.panel != null) remove(this.panel); if (this.panel != null) remove(this.panel);
this.panel = jxPanel; this.panel = jxPanel;
add(jxPanel); add(jxPanel);
} }
this.repaint(); this.repaint();
} }
/** This method is called from within the constructor to
/**
* This method is called from within the constructor to
* initialize the form. * initialize the form.
* WARNING: Do NOT modify this code. The content of this method is * WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor. * always regenerated by the Form Editor.

View file

@ -135,12 +135,12 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
Style s = doc.addStyle("small", regular); Style s = doc.addStyle("small", regular);
StyleConstants.setFontSize(s, 9); StyleConstants.setFontSize(s, 9);
addMouseListener(this); //addMouseListener(this);
text.addMouseListener(this); //text.addMouseListener(this);
addFocusListener(this); //addFocusListener(this);
addMouseMotionListener(this); //addMouseMotionListener(this);
text.addMouseMotionListener(this); //text.addMouseMotionListener(this);
addComponentListener(this); //addComponentListener(this);
} }
public UUID getCardId() { public UUID getCardId() {
@ -347,7 +347,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
@Override @Override
public void mouseMoved(MouseEvent arg0) { public void mouseMoved(MouseEvent arg0) {
this.bigCard.showTextComponent(); this.bigCard.showTextComponent();
this.bigCard.setCard(card.getId(), image, getRules()); this.bigCard.setCard(card.getId(), image, getRules(), false);
} }
@Override @Override
@ -480,7 +480,16 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
return image; return image;
} }
@Override @Override
public void setFoil(boolean foil) {
}
@Override
public boolean isFoil() {
return false;
}
@Override
public PermanentView getOriginalPermanent() { public PermanentView getOriginalPermanent() {
return null; return null;
} }

View file

@ -26,11 +26,10 @@ public class ManaSymbols {
"BR", "G", "GU", "GW", "R", "RG", "RW", "S", "T", "U", "UB", "UR", "W", "WB", "WU", "X" /*, "Y", "Z", "slash"*/}; "BR", "G", "GU", "GW", "R", "RG", "RW", "S", "T", "U", "UB", "UR", "W", "WB", "WU", "X" /*, "Y", "Z", "slash"*/};
for (String symbol : symbols) { for (String symbol : symbols) {
File file = new File(Constants.RESOURCE_PATH_MANA_LARGE + "/" + symbol + ".jpg"); File file = new File(Constants.RESOURCE_PATH_MANA_LARGE + "/" + symbol + ".jpg");
BufferedImageBuilder builder = new BufferedImageBuilder();
Rectangle r = new Rectangle(11, 11); Rectangle r = new Rectangle(11, 11);
try { try {
Image image = UI.getImageIcon(file.getAbsolutePath()).getImage(); Image image = UI.getImageIcon(file.getAbsolutePath()).getImage();
BufferedImage resized = ImageResizeUtil.getResizedImage(builder.bufferImage(image, BufferedImage.TYPE_INT_ARGB), r); BufferedImage resized = ImageResizeUtil.getResizedImage(BufferedImageBuilder.bufferImage(image, BufferedImage.TYPE_INT_ARGB), r);
manaImages.put(symbol, resized); manaImages.put(symbol, resized);
} catch (Exception e) { } catch (Exception e) {
noManaSymbols = true; noManaSymbols = true;

View file

@ -37,6 +37,7 @@ package mage.client.deckeditor;
import mage.cards.Card; import mage.cards.Card;
import mage.cards.decks.Deck; import mage.cards.decks.Deck;
import mage.client.MageFrame; import mage.client.MageFrame;
import mage.client.deckeditor.collection.viewer.Huerotator2;
import mage.client.plugins.impl.Plugins; import mage.client.plugins.impl.Plugins;
import mage.client.util.Event; import mage.client.util.Event;
import mage.client.util.Listener; import mage.client.util.Listener;

View file

@ -184,14 +184,13 @@ public class MageActionCallback implements ActionCallback {
Image image = card.getImage(); Image image = card.getImage();
if (image != null && image instanceof BufferedImage) { if (image != null && image instanceof BufferedImage) {
image = ImageHelper.getResizedImage((BufferedImage) image, bigCard.getWidth(), bigCard.getHeight()); image = ImageHelper.getResizedImage((BufferedImage) image, bigCard.getWidth(), bigCard.getHeight());
bigCard.setCard(card.getOriginal().getId(), image, card.getOriginal().getRules()); bigCard.setCard(card.getOriginal().getId(), image, card.getOriginal().getRules(), card.isFoil());
bigCard.showTextComponent(); bigCard.showTextComponent();
if (card.getOriginal().isAbility()) { if (card.getOriginal().isAbility()) {
bigCard.showTextComponent(); bigCard.showTextComponent();
} else { } else {
bigCard.hideTextComponent(); bigCard.hideTextComponent();
} }
;
} else { } else {
JXPanel panel = GuiDisplayUtil.getDescription(card.getOriginal(), bigCard.getWidth(), bigCard.getHeight()); JXPanel panel = GuiDisplayUtil.getDescription(card.getOriginal(), bigCard.getWidth(), bigCard.getHeight());
panel.setVisible(true); panel.setVisible(true);

View file

@ -4,15 +4,27 @@ import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver; import java.awt.image.ImageObserver;
/**
* Utility class for creating BufferedImage object from Image instance.
*
* @author nantuko
*/
public class BufferedImageBuilder { public class BufferedImageBuilder {
private static final int DEFAULT_IMAGE_TYPE = BufferedImage.TYPE_INT_RGB; private static final int DEFAULT_IMAGE_TYPE = BufferedImage.TYPE_INT_RGB;
public BufferedImage bufferImage(Image image) { /**
* Hide constructor
*/
private BufferedImageBuilder() {
}
public static BufferedImage bufferImage(Image image) {
return bufferImage(image, DEFAULT_IMAGE_TYPE); return bufferImage(image, DEFAULT_IMAGE_TYPE);
} }
public BufferedImage bufferImage(Image image, int type) { public static BufferedImage bufferImage(Image image, int type) {
BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), type); BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
Graphics2D g = bufferedImage.createGraphics(); Graphics2D g = bufferedImage.createGraphics();
g.drawImage(image, null, null); g.drawImage(image, null, null);
@ -50,7 +62,6 @@ public class BufferedImageBuilder {
} }
class ImageLoadStatus { class ImageLoadStatus {
public boolean widthDone = false; public boolean widthDone = false;
public boolean heightDone = false; public boolean heightDone = false;
} }

View file

@ -19,4 +19,6 @@ public abstract class MageCard extends JPanel {
abstract public void setCardBounds(int x, int y, int width, int height); abstract public void setCardBounds(int x, int y, int width, int height);
abstract public void update(CardView card); abstract public void update(CardView card);
abstract public Image getImage(); abstract public Image getImage();
abstract public void setFoil(boolean foil);
abstract public boolean isFoil();
} }

View file

@ -0,0 +1,17 @@
package mage.filters;
import mage.filters.impl.HueFilter;
/**
* Creates filter instances.
*
* @author nantuko
*/
public class FilterFactory {
private static final HueFilter hueFilter = new HueFilter();
public static HueFilter getHueFilter() {
return hueFilter;
}
}

View file

@ -0,0 +1,68 @@
package mage.filters;
import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ColorModel;
/**
* Mage abstract class that implements single-input/single-output
* operations performed on {@link java.awt.image.BufferedImage}.
*
* @author nantuko
*/
public abstract class MageBufferedImageOp implements BufferedImageOp {
/**
* Creates compatible image for @param src image.
*/
public BufferedImage createCompatibleDestImage(BufferedImage src, ColorModel dest) {
if (dest == null) {
dest = src.getColorModel();
}
return new BufferedImage(dest, dest.createCompatibleWritableRaster(src.getWidth(), src.getHeight()), dest.isAlphaPremultiplied(), null);
}
public RenderingHints getRenderingHints() {
return null;
}
public Rectangle2D getBounds2D(BufferedImage src) {
return new Rectangle(0, 0, src.getWidth(), src.getHeight());
}
public Point2D getPoint2D(Point2D srcPt, Point2D destPt) {
if (destPt == null) {
destPt = new Point2D.Double();
}
destPt.setLocation(srcPt.getX(), srcPt.getY());
return destPt;
}
/**
* Gets ARGB pixels from image. Solves the performance
* issue of BufferedImage.getRGB method.
*/
public int[] getRGB(BufferedImage image, int x, int y, int width, int height, int[] pixels) {
int type = image.getType();
if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB) {
return (int[]) image.getRaster().getDataElements(x, y, width, height, pixels);
}
return image.getRGB(x, y, width, height, pixels, 0, width);
}
/**
* Sets ARGB pixels in image. Solves the performance
* issue of BufferedImage.setRGB method.
*/
public void setRGB(BufferedImage image, int x, int y, int width, int height, int[] pixels) {
int type = image.getType();
if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB) {
image.getRaster().setDataElements(x, y, width, height, pixels);
} else {
image.setRGB(x, y, width, height, pixels, 0, width);
}
}
}

View file

@ -0,0 +1,69 @@
/*
Copyright 2006 Jerry Huxtable
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package mage.filters;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
/**
* An abstract super class for filters that work with points.
* Takes into account image type to avoid performance issue with getRGB and setRGB methods of BufferedImage.
*
* @author nantuko
*/
public abstract class PointFilter extends MageBufferedImageOp {
protected boolean canFilterIndexColorModel = false;
public BufferedImage filter(BufferedImage src, BufferedImage dst) {
int width = src.getWidth();
int height = src.getHeight();
int type = src.getType();
WritableRaster srcRaster = src.getRaster();
if (dst == null) {
dst = createCompatibleDestImage(src, null);
}
WritableRaster dstRaster = dst.getRaster();
setDimensions(width, height);
int[] inPixels = new int[width];
for (int y = 0; y < height; y++) {
if (type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB) {
srcRaster.getDataElements(0, y, width, 1, inPixels);
for (int x = 0; x < width; x++) {
inPixels[x] = filterRGB(x, y, inPixels[x]);
}
dstRaster.setDataElements(0, y, width, 1, inPixels);
} else {
src.getRGB(0, y, width, 1, inPixels, 0, width);
for (int x = 0; x < width; x++) {
inPixels[x] = filterRGB(x, y, inPixels[x]);
}
dst.setRGB(0, y, width, 1, inPixels, 0, width);
}
}
return dst;
}
public void setDimensions(int width, int height) {
}
public abstract int filterRGB(int x, int y, int rgb);
}

View file

@ -0,0 +1,68 @@
/*
Copyright 2006 Jerry Huxtable
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package mage.filters.impl;
import mage.filters.PointFilter;
import java.awt.*;
/**
* Point filter that changes hue of the image.
*
* @author nantuko
*/
public class HueFilter extends PointFilter {
public float hue;
private float[] hsb = new float[3];
public HueFilter() {
this(0);
}
public HueFilter(float hue) {
this.hue = hue;
canFilterIndexColorModel = true;
}
public void setHue(float hue) {
this.hue = hue;
}
public float getHue() {
return hue;
}
public int filterRGB(int x, int y, int rgb) {
int a = rgb & 0xff000000;
int r = (rgb >> 16) & 0xff;
int g = (rgb >> 8) & 0xff;
int b = rgb & 0xff;
Color.RGBtoHSB(r, g, b, hsb);
hsb[0] += hue;
while (hsb[0] < 0) {
hsb[0] += Math.PI*2;
}
rgb = Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]);
return a | (rgb & 0xffffff);
}
public String toString() {
return "Change HUE filter";
}
}

View file

@ -27,11 +27,10 @@ public class ManaSymbols {
"BR", "G", "GU", "GW", "R", "RG", "RW", "S", "T", "U", "UB", "UR", "W", "WB", "WU", "X", "Y", "Z", "slash"}; "BR", "G", "GU", "GW", "R", "RG", "RW", "S", "T", "U", "UB", "UR", "W", "WB", "WU", "X", "Y", "Z", "slash"};
for (String symbol : symbols) { for (String symbol : symbols) {
File file = new File(Constants.RESOURCE_PATH_MANA_LARGE + "/" + symbol + ".jpg"); File file = new File(Constants.RESOURCE_PATH_MANA_LARGE + "/" + symbol + ".jpg");
BufferedImageBuilder builder = new BufferedImageBuilder();
Rectangle r = new Rectangle(11, 11); Rectangle r = new Rectangle(11, 11);
try { try {
Image image = UI.getImageIcon(file.getAbsolutePath()).getImage(); Image image = UI.getImageIcon(file.getAbsolutePath()).getImage();
BufferedImage resized = ImageCache.getResizedImage(builder.bufferImage(image, BufferedImage.TYPE_INT_ARGB), r); BufferedImage resized = ImageCache.getResizedImage(BufferedImageBuilder.bufferImage(image, BufferedImage.TYPE_INT_ARGB), r);
manaImages.put(symbol, resized); manaImages.put(symbol, resized);
} catch (Exception e) {} } catch (Exception e) {}
file = new File(Constants.RESOURCE_PATH_MANA_MEDIUM + "/" + symbol + ".jpg"); file = new File(Constants.RESOURCE_PATH_MANA_MEDIUM + "/" + symbol + ".jpg");

View file

@ -11,7 +11,7 @@ import javax.swing.JPanel;
public class ScaledImagePanel extends JPanel { public class ScaledImagePanel extends JPanel {
private static final long serialVersionUID = -1523279873208605664L; private static final long serialVersionUID = -1523279873208605664L;
public volatile Image srcImage; public volatile Image srcImage;
public volatile Image srcImageBlurred; //public volatile Image srcImageBlurred;
private ScalingType scalingType = ScalingType.bilinear; private ScalingType scalingType = ScalingType.bilinear;
private boolean scaleLarger; private boolean scaleLarger;
@ -23,9 +23,8 @@ public class ScaledImagePanel extends JPanel {
setOpaque(false); setOpaque(false);
} }
public void setImage (Image srcImage, Image srcImageBlurred) { public void setImage(Image srcImage) {
this.srcImage = srcImage; this.srcImage = srcImage;
this.srcImageBlurred = srcImageBlurred;
} }
public void clearImage () { public void clearImage () {
@ -168,9 +167,10 @@ public class ScaledImagePanel extends JPanel {
} }
private Image getSourceImage (ScalingInfo info) { private Image getSourceImage (ScalingInfo info) {
if (!blur || srcImageBlurred == null) return srcImage; return srcImage;
if (info.srcWidth / 2 < info.targetWidth || info.srcHeight / 2 < info.targetHeight) return srcImage; //if (!blur || srcImageBlurred == null) return srcImage;
return srcImageBlurred; //if (info.srcWidth / 2 < info.targetWidth || info.srcHeight / 2 < info.targetHeight) return srcImage;
//return srcImageBlurred;
} }
public Image getSrcImage() { public Image getSrcImage() {

View file

@ -6,12 +6,7 @@ import java.awt.Image;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.event.WindowAdapter; import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.util.ArrayList; import java.util.*;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JDialog; import javax.swing.JDialog;
@ -92,7 +87,8 @@ public class CardPluginImpl implements CardPlugin {
@Override @Override
public MagePermanent getMagePermanent(PermanentView permanent, CardDimensions dimension, UUID gameId, ActionCallback callback) { public MagePermanent getMagePermanent(PermanentView permanent, CardDimensions dimension, UUID gameId, ActionCallback callback) {
CardPanel cardPanel = new CardPanel(permanent, gameId, true, callback); boolean foil = (new Random()).nextInt(5) == 0;
CardPanel cardPanel = new CardPanel(permanent, gameId, true, callback, foil);
cardPanel.setShowCastingCost(true); cardPanel.setShowCastingCost(true);
cardPanel.setCardBounds(0, 0, dimension.frameWidth, dimension.frameHeight); cardPanel.setCardBounds(0, 0, dimension.frameWidth, dimension.frameHeight);
cardPanel.setShowCastingCost(true); cardPanel.setShowCastingCost(true);
@ -101,10 +97,12 @@ public class CardPluginImpl implements CardPlugin {
@Override @Override
public MagePermanent getMageCard(CardView permanent, CardDimensions dimension, UUID gameId, ActionCallback callback) { public MagePermanent getMageCard(CardView permanent, CardDimensions dimension, UUID gameId, ActionCallback callback) {
CardPanel cardPanel = new CardPanel(permanent, gameId, true, callback); boolean foil = (new Random()).nextInt(5) == 0;
CardPanel cardPanel = new CardPanel(permanent, gameId, true, callback, foil);
cardPanel.setShowCastingCost(true); cardPanel.setShowCastingCost(true);
cardPanel.setCardBounds(0, 0, dimension.frameWidth, dimension.frameHeight); cardPanel.setCardBounds(0, 0, dimension.frameWidth, dimension.frameHeight);
cardPanel.setShowCastingCost(true); cardPanel.setShowCastingCost(true);
return cardPanel; return cardPanel;
} }

View file

@ -5,15 +5,27 @@ import java.awt.Image;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver; import java.awt.image.ImageObserver;
/**
* Utility class for creating BufferedImage object from Image instance.
*
* @author nantuko
*/
public class BufferedImageBuilder { public class BufferedImageBuilder {
private static final int DEFAULT_IMAGE_TYPE = BufferedImage.TYPE_INT_RGB; private static final int DEFAULT_IMAGE_TYPE = BufferedImage.TYPE_INT_RGB;
public BufferedImage bufferImage(Image image) { /**
* Hide constructor
*/
private BufferedImageBuilder() {
}
public static BufferedImage bufferImage(Image image) {
return bufferImage(image, DEFAULT_IMAGE_TYPE); return bufferImage(image, DEFAULT_IMAGE_TYPE);
} }
public BufferedImage bufferImage(Image image, int type) { public static BufferedImage bufferImage(Image image, int type) {
BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), type); BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
Graphics2D g = bufferedImage.createGraphics(); Graphics2D g = bufferedImage.createGraphics();
g.drawImage(image, null, null); g.drawImage(image, null, null);

View file

@ -29,8 +29,7 @@ public class ImageManagerImpl implements ImageManager {
Image image = getImageFromResourceTransparent("/sickness.png", Color.WHITE, new Rectangle(296, 265)); Image image = getImageFromResourceTransparent("/sickness.png", Color.WHITE, new Rectangle(296, 265));
Toolkit tk = Toolkit.getDefaultToolkit(); Toolkit tk = Toolkit.getDefaultToolkit();
image = tk.createImage(new FilteredImageSource(image.getSource(), new CropImageFilter(0, 0, 200, 285))); image = tk.createImage(new FilteredImageSource(image.getSource(), new CropImageFilter(0, 0, 200, 285)));
BufferedImageBuilder builder = new BufferedImageBuilder(); imageSickness = BufferedImageBuilder.bufferImage(image, BufferedImage.TYPE_INT_ARGB);
imageSickness = builder.bufferImage(image, BufferedImage.TYPE_INT_ARGB);
} }
return imageSickness; return imageSickness;
} }