From 3cf90f287508124d16ace478197d210a9a1dafb1 Mon Sep 17 00:00:00 2001 From: magenoxx Date: Wed, 5 Jan 2011 13:14:39 +0300 Subject: [PATCH] [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). --- Mage.Client/plugins/mage-card-plugin.jar | Bin 305956 -> 299762 bytes .../src/main/java/mage/client/MageFrame.java | 625 ++++---- .../main/java/mage/client/cards/BigCard.java | 232 ++- .../src/main/java/mage/client/cards/Card.java | 25 +- .../client/components/arcane/ManaSymbols.java | 3 +- .../client/deckeditor/DeckEditorPanel.java | 1 + .../plugins/adapters/MageActionCallback.java | 3 +- .../client/util/gui/BufferedImageBuilder.java | 17 +- Mage.Common/src/mage/cards/MageCard.java | 2 + .../src/mage/filters/FilterFactory.java | 17 + .../src/mage/filters/MageBufferedImageOp.java | 68 + Mage.Common/src/mage/filters/PointFilter.java | 69 + .../src/mage/filters/impl/HueFilter.java | 68 + .../java/org/mage/card/arcane/CardPanel.java | 1287 +++++++++-------- .../org/mage/card/arcane/ManaSymbols.java | 3 +- .../mage/card/arcane/ScaledImagePanel.java | 12 +- .../org/mage/plugins/card/CardPluginImpl.java | 14 +- .../card/utils/BufferedImageBuilder.java | 16 +- .../card/utils/impl/ImageManagerImpl.java | 3 +- 19 files changed, 1424 insertions(+), 1041 deletions(-) create mode 100644 Mage.Common/src/mage/filters/FilterFactory.java create mode 100644 Mage.Common/src/mage/filters/MageBufferedImageOp.java create mode 100644 Mage.Common/src/mage/filters/PointFilter.java create mode 100644 Mage.Common/src/mage/filters/impl/HueFilter.java diff --git a/Mage.Client/plugins/mage-card-plugin.jar b/Mage.Client/plugins/mage-card-plugin.jar index 9c662a1e057e93a177e217f7d05b299984921ed4..6e2643fe0f74223a5b3032a2c5348d96bc8c4246 100644 GIT binary patch delta 73012 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%0A<3N=afS)yFmEP_kM7jDGB!=cz32Q+J3I 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 YhUQ5M+{?K{Dv<{Fm87x+?7!0g0byCk8~^|S delta 78554 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 diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 91c5bb73ed5..bf4a607f9bf 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -34,26 +34,6 @@ 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.client.cards.CardsStorage; import mage.client.components.MageComponents; @@ -69,151 +49,168 @@ import mage.client.util.gui.ArrowBuilder; import mage.components.ImagePanel; 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 */ 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 ConnectDialog connectDialog; - private static CombatDialog combat; - private static PickNumberDialog pickNumber; - private static Preferences prefs = Preferences.userNodeForPackage(MageFrame.class); - private JLabel title; - private Rectangle titleRectangle; - - /** - * @return the session - */ - public static Session getSession() { - return session; - } + private static Session session; + private ConnectDialog connectDialog; + private static CombatDialog combat; + private static PickNumberDialog pickNumber; + private static Preferences prefs = Preferences.userNodeForPackage(MageFrame.class); + private JLabel title; + private Rectangle titleRectangle; - public static JDesktopPane getDesktop() { - return desktopPane; - } + /** + * @return the session + */ + public static Session getSession() { + return session; + } - public static Preferences getPreferences() { - return prefs; - } + public static JDesktopPane getDesktop() { + return desktopPane; + } - /** Creates new form MageFrame */ + public static Preferences getPreferences() { + return prefs; + } + + /** + * Creates new form MageFrame + */ public MageFrame() { - setTitle("Mage, version 0.5.1"); - - EDTExceptionHandler.registerExceptionHandler(); - addWindowListener(new WindowAdapter() - { - @Override - public void windowClosing(WindowEvent e) - { - exitApp(); - } - }); + setTitle("Mage, version 0.5.1"); - try { - UIManager.put("desktop", new Color(0,0,0,0)); + EDTExceptionHandler.registerExceptionHandler(); + 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"); - //MageSynthStyleFactory f = new MageSynthStyleFactory(SynthLookAndFeel.getStyleFactory()); - //SynthLookAndFeel.setStyleFactory(f); - } catch (Exception ex) { - logger.log(Level.SEVERE, null, ex); - } + //MageSynthStyleFactory f = new MageSynthStyleFactory(SynthLookAndFeel.getStyleFactory()); + //SynthLookAndFeel.setStyleFactory(f); + } catch (Exception ex) { + logger.log(Level.SEVERE, null, ex); + } - Plugins.getInstance().loadPlugins(); + Plugins.getInstance().loadPlugins(); - initComponents(); - setSize(1024,768); - this.setExtendedState(JFrame.MAXIMIZED_BOTH); + initComponents(); + setSize(1024, 768); + this.setExtendedState(JFrame.MAXIMIZED_BOTH); - session = new Session(this); - connectDialog = new ConnectDialog(); - combat = new CombatDialog(); - pickNumber = new PickNumberDialog(); - desktopPane.add(connectDialog, JLayeredPane.POPUP_LAYER); - desktopPane.add(combat, JLayeredPane.POPUP_LAYER); - combat.hideDialog(); - desktopPane.add(pickNumber, JLayeredPane.POPUP_LAYER); - session.getUI().addComponent(MageComponents.DESKTOP_PANE, desktopPane); + session = new Session(this); + connectDialog = new ConnectDialog(); + combat = new CombatDialog(); + pickNumber = new PickNumberDialog(); + desktopPane.add(connectDialog, JLayeredPane.POPUP_LAYER); + desktopPane.add(combat, JLayeredPane.POPUP_LAYER); + combat.hideDialog(); + desktopPane.add(pickNumber, JLayeredPane.POPUP_LAYER); + session.getUI().addComponent(MageComponents.DESKTOP_PANE, desktopPane); ManaSymbols.loadImages(); addTooltipContainer(); setBackground(); - addMageLabel(); - setAppIcon(); + addMageLabel(); + setAppIcon(); - desktopPane.add(ArrowBuilder.getArrowsPanel(), JLayeredPane.DRAG_LAYER); - - desktopPane.addComponentListener(new ComponentAdapter(){ - @Override - public void componentResized(ComponentEvent e) { - int width = ((JComponent)e.getSource()).getWidth(); - int height = ((JComponent)e.getSource()).getHeight(); - backgroundPane.setSize(width, height); - JPanel arrowsPanel = ArrowBuilder.getArrowsPanelRef(); - if (arrowsPanel != null) arrowsPanel.setSize(width, height); - if (title != null) { - //title.setBorder(BorderFactory.createLineBorder(Color.red)); - title.setBounds((int)(width - titleRectangle.getWidth())/2, (int)(height - titleRectangle.getHeight())/2, titleRectangle.width, titleRectangle.height); - } - } + desktopPane.add(ArrowBuilder.getArrowsPanel(), JLayeredPane.DRAG_LAYER); + + desktopPane.addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + int width = ((JComponent) e.getSource()).getWidth(); + int height = ((JComponent) e.getSource()).getHeight(); + backgroundPane.setSize(width, height); + JPanel arrowsPanel = ArrowBuilder.getArrowsPanelRef(); + if (arrowsPanel != null) arrowsPanel.setSize(width, height); + if (title != null) { + //title.setBorder(BorderFactory.createLineBorder(Color.red)); + title.setBounds((int) (width - titleRectangle.getWidth()) / 2, (int) (height - titleRectangle.getHeight()) / 2, titleRectangle.width, titleRectangle.height); + } + } }); - - //TODO: move to plugin impl - if (Plugins.getInstance().isCardPluginLoaded()) { - Separator separator = new javax.swing.JToolBar.Separator(); - mageToolbar.add(separator); - - JButton btnDownloadSymbols = new JButton("Symbols"); - btnDownloadSymbols.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); - btnDownloadSymbols.setFocusable(false); - btnDownloadSymbols.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnDownloadSymbols.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnDownloadSymbols.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btnSymbolsActionPerformed(evt); - } - }); - mageToolbar.add(btnDownloadSymbols); - - separator = new javax.swing.JToolBar.Separator(); - mageToolbar.add(separator); - - JButton btnDownload = new JButton("Images"); - btnDownload.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); - btnDownload.setFocusable(false); - btnDownload.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - btnDownload.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); - btnDownload.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btnImagesActionPerformed(evt); - } - }); - mageToolbar.add(btnDownload); - } - - if (Plugins.getInstance().isCounterPluginLoaded()) { - int i = Plugins.getInstance().getGamesPlayed(); - JLabel label = new JLabel(" Games played: " + String.valueOf(i)); - desktopPane.add(label, JLayeredPane.DEFAULT_LAYER + 1); - label.setVisible(true); - label.setForeground(Color.white); - label.setBounds(0, 0, 180, 30); - } - - session.getUI().addButton(MageComponents.TABLES_MENU_BUTTON, btnGames); - - SwingUtilities.invokeLater(new Runnable() { + + //TODO: move to plugin impl + if (Plugins.getInstance().isCardPluginLoaded()) { + Separator separator = new javax.swing.JToolBar.Separator(); + mageToolbar.add(separator); + + JButton btnDownloadSymbols = new JButton("Symbols"); + btnDownloadSymbols.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); + btnDownloadSymbols.setFocusable(false); + btnDownloadSymbols.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnDownloadSymbols.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnDownloadSymbols.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnSymbolsActionPerformed(evt); + } + }); + mageToolbar.add(btnDownloadSymbols); + + separator = new javax.swing.JToolBar.Separator(); + mageToolbar.add(separator); + + JButton btnDownload = new JButton("Images"); + btnDownload.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); + btnDownload.setFocusable(false); + btnDownload.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + btnDownload.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + btnDownload.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnImagesActionPerformed(evt); + } + }); + mageToolbar.add(btnDownload); + } + + if (Plugins.getInstance().isCounterPluginLoaded()) { + int i = Plugins.getInstance().getGamesPlayed(); + JLabel label = new JLabel(" Games played: " + String.valueOf(i)); + desktopPane.add(label, JLayeredPane.DEFAULT_LAYER + 1); + label.setVisible(true); + label.setForeground(Color.white); + label.setBounds(0, 0, 180, 30); + } + + session.getUI().addButton(MageComponents.TABLES_MENU_BUTTON, btnGames); + + SwingUtilities.invokeLater(new Runnable() { public void run() { - if (autoConnect()) - enableButtons(); - else - disableButtons(); + if (autoConnect()) + enableButtons(); + else + disableButtons(); } }); } @@ -222,7 +219,7 @@ public class MageFrame extends javax.swing.JFrame { final JEditorPane cardInfoPane = (JEditorPane) Plugins.getInstance().getCardInfoPane(); cardInfoPane.setSize(320, 201); cardInfoPane.setLocation(40, 40); - cardInfoPane.setBackground(new Color(0,0,0,0)); + cardInfoPane.setBackground(new Color(0, 0, 0, 0)); MageRoundPane popupContainer = new MageRoundPane(); popupContainer.setLayout(null); @@ -257,96 +254,95 @@ public class MageFrame extends javax.swing.JFrame { private void addMageLabel() { String filename = "/label-mage.png"; - try { - InputStream is = this.getClass().getResourceAsStream(filename); + try { + InputStream is = this.getClass().getResourceAsStream(filename); - float ratio = 1179.0f / 678.0f; - titleRectangle = new Rectangle(640, (int)(640 / ratio)); - if (is != null) { - BufferedImage image = ImageIO.read(is); - //ImageIcon resized = new ImageIcon(image.getScaledInstance(titleRectangle.width, titleRectangle.height, java.awt.Image.SCALE_SMOOTH)); - title = new JLabel(); - title.setIcon(new ImageIcon(image)); - backgroundPane.setLayout(null); - backgroundPane.add(title); - } - } catch (IOException e) { - e.printStackTrace(); - } + float ratio = 1179.0f / 678.0f; + titleRectangle = new Rectangle(640, (int) (640 / ratio)); + if (is != null) { + BufferedImage image = ImageIO.read(is); + //ImageIcon resized = new ImageIcon(image.getScaledInstance(titleRectangle.width, titleRectangle.height, java.awt.Image.SCALE_SMOOTH)); + title = new JLabel(); + title.setIcon(new ImageIcon(image)); + backgroundPane.setLayout(null); + backgroundPane.add(title); + } + } catch (IOException e) { + e.printStackTrace(); + } } private void setAppIcon() { String filename = "/icon-mage.png"; - try { - InputStream is = this.getClass().getResourceAsStream(filename); + try { + InputStream is = this.getClass().getResourceAsStream(filename); - if (is != null) { - BufferedImage image = ImageIO.read(is); - setIconImage(image); - } - } catch (IOException e) { - e.printStackTrace(); - } + if (is != null) { + BufferedImage image = ImageIO.read(is); + setIconImage(image); + } + } catch (IOException e) { + 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) { - this.tablesPane.hideTables(); - this.tablesPane.setVisible(false); - this.gamePane.setVisible(true); - this.gamePane.showGame(gameId, playerId); - } + private void btnImagesActionPerformed(java.awt.event.ActionEvent evt) { + Plugins.getInstance().downloadImage(CardsStorage.getAllCards()); + } - public void watchGame(UUID gameId) { - this.tablesPane.hideTables(); - this.tablesPane.setVisible(false); - this.gamePane.setVisible(true); - this.gamePane.watchGame(gameId); - } + 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 replayGame() { - this.tablesPane.hideTables(); - this.tablesPane.setVisible(false); - this.gamePane.setVisible(true); - this.gamePane.replayGame(); - } + public void showGame(UUID gameId, UUID playerId) { + this.tablesPane.hideTables(); + this.tablesPane.setVisible(false); + this.gamePane.setVisible(true); + this.gamePane.showGame(gameId, playerId); + } - public static boolean connect(String userName, String serverName, int port) { - return session.connect(userName, serverName, port); - } + public void watchGame(UUID gameId) { + this.tablesPane.hideTables(); + this.tablesPane.setVisible(false); + this.gamePane.setVisible(true); + this.gamePane.watchGame(gameId); + } - 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; - } + public void replayGame() { + this.tablesPane.hideTables(); + this.tablesPane.setVisible(false); + this.gamePane.setVisible(true); + this.gamePane.replayGame(); + } - /** 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. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. @@ -440,7 +436,7 @@ public class MageFrame extends javax.swing.JFrame { }); mageToolbar.add(btnDeckEditor); mageToolbar.add(jSeparator2); - + btnPreferences.setText("Preferences"); btnPreferences.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); btnPreferences.setFocusable(false); @@ -486,122 +482,121 @@ public class MageFrame extends javax.swing.JFrame { javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 1144, Short.MAX_VALUE) - .addComponent(mageToolbar, javax.swing.GroupLayout.DEFAULT_SIZE, 1144, Short.MAX_VALUE) + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 1144, Short.MAX_VALUE) + .addComponent(mageToolbar, javax.swing.GroupLayout.DEFAULT_SIZE, 1144, Short.MAX_VALUE) ); layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addComponent(mageToolbar, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, 0) - .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 880, Short.MAX_VALUE)) + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(mageToolbar, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0) + .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 880, Short.MAX_VALUE)) ); pack(); }// //GEN-END:initComponents - private void btnDeckEditorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDeckEditorActionPerformed - this.gamePane.setVisible(false); - this.tablesPane.setVisible(false); - showDeckEditor(DeckEditorMode.Constructed, null, null); - }//GEN-LAST:event_btnDeckEditorActionPerformed + private void btnDeckEditorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDeckEditorActionPerformed + this.gamePane.setVisible(false); + this.tablesPane.setVisible(false); + showDeckEditor(DeckEditorMode.Constructed, null, null); + }//GEN-LAST:event_btnDeckEditorActionPerformed - private void btnPreferencesActionPerformed(java.awt.event.ActionEvent evt) { + private void btnPreferencesActionPerformed(java.awt.event.ActionEvent evt) { 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 - exitApp(); - }//GEN-LAST:event_btnExitActionPerformed + 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 btnConnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnConnectActionPerformed - if (session.isConnected()) { - if (JOptionPane.showConfirmDialog(this, "Are you sure you want to disconnect?", "Confirm disconnect", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - session.disconnect(); - } - } - else { - connectDialog.showDialog(); - } - }//GEN-LAST:event_btnConnectActionPerformed + private void btnExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExitActionPerformed + exitApp(); + }//GEN-LAST:event_btnExitActionPerformed - private void btnAboutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAboutActionPerformed - AboutDialog aboutDialog = new AboutDialog(); - desktopPane.add(aboutDialog); - aboutDialog.showDialog(); - }//GEN-LAST:event_btnAboutActionPerformed + private void btnConnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnConnectActionPerformed + if (session.isConnected()) { + if (JOptionPane.showConfirmDialog(this, "Are you sure you want to disconnect?", "Confirm disconnect", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { + session.disconnect(); + } + } else { + connectDialog.showDialog(); + } + }//GEN-LAST:event_btnConnectActionPerformed - public void exitApp() { - session.disconnect(); - Plugins.getInstance().shutdown(); - dispose(); - System.exit(0); - } + private void btnAboutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAboutActionPerformed + AboutDialog aboutDialog = new AboutDialog(); + desktopPane.add(aboutDialog); + aboutDialog.showDialog(); + }//GEN-LAST:event_btnAboutActionPerformed - public void enableButtons() { - btnConnect.setEnabled(true); - btnConnect.setText("Disconnect"); - btnGames.setEnabled(true); - btnDeckEditor.setEnabled(true); - } + public void exitApp() { + session.disconnect(); + Plugins.getInstance().shutdown(); + dispose(); + System.exit(0); + } - public void disableButtons() { - btnConnect.setEnabled(true); - btnConnect.setText("Connect"); - btnGames.setEnabled(false); - btnDeckEditor.setEnabled(true); - this.tablesPane.setVisible(false); - this.gamePane.setVisible(false); - this.deckEditorPane.setVisible(false); - } + public void enableButtons() { + btnConnect.setEnabled(true); + btnConnect.setText("Disconnect"); + btnGames.setEnabled(true); + btnDeckEditor.setEnabled(true); + } - public void showDeckEditor(DeckEditorMode mode, Deck deck, UUID tableId) { - this.deckEditorPane.setVisible(true); - this.deckEditorPane.show(mode, deck, tableId); - } + public void disableButtons() { + btnConnect.setEnabled(true); + 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() { - return combat; - } + public void showDeckEditor(DeckEditorMode mode, Deck deck, UUID tableId) { + this.deckEditorPane.setVisible(true); + this.deckEditorPane.show(mode, deck, tableId); + } - public static PickNumberDialog getPickNumberDialog() { - return pickNumber; - } + public static CombatDialog getCombatDialog() { + return combat; + } - static void renderSplashFrame(Graphics2D g) { + public static PickNumberDialog getPickNumberDialog() { + return pickNumber; + } + + static void renderSplashFrame(Graphics2D g) { g.setComposite(AlphaComposite.Clear); - g.fillRect(120,140,200,40); + g.fillRect(120, 140, 200, 40); g.setPaintMode(); g.setColor(Color.white); 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[]) { - final SplashScreen splash = SplashScreen.getSplashScreen(); - if (splash != null) { - Graphics2D g = splash.createGraphics(); - if (g != null) { - renderSplashFrame(g); - } - splash.update(); - } - - Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { - public void uncaughtException(Thread t, Throwable e) { - logger.log(Level.SEVERE, null, e); - } - }); + final SplashScreen splash = SplashScreen.getSplashScreen(); + if (splash != null) { + Graphics2D g = splash.createGraphics(); + if (g != null) { + renderSplashFrame(g); + } + splash.update(); + } + + Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { + public void uncaughtException(Thread t, Throwable e) { + logger.log(Level.SEVERE, null, e); + } + }); SwingUtilities.invokeLater(new Runnable() { public void run() { new MageFrame().setVisible(true); @@ -628,11 +623,11 @@ public class MageFrame extends javax.swing.JFrame { private javax.swing.JToolBar mageToolbar; private mage.client.table.TablesPane tablesPane; // End of variables declaration//GEN-END:variables - - private static final long serialVersionUID = -9104885239063142218L; + + private static final long serialVersionUID = -9104885239063142218L; private ImagePanel backgroundPane; - public void setStatusText(String status) { - this.lblStatus.setText(status); - } + public void setStatusText(String status) { + this.lblStatus.setText(status); + } } diff --git a/Mage.Client/src/main/java/mage/client/cards/BigCard.java b/Mage.Client/src/main/java/mage/client/cards/BigCard.java index 6d13f4a0b16..a574ce87527 100644 --- a/Mage.Client/src/main/java/mage/client/cards/BigCard.java +++ b/Mage.Client/src/main/java/mage/client/cards/BigCard.java @@ -34,105 +34,199 @@ package mage.client.cards; -import static mage.constants.Constants.CONTENT_MAX_XOFFSET; -import static mage.constants.Constants.FRAME_MAX_HEIGHT; -import static mage.constants.Constants.FRAME_MAX_WIDTH; -import static mage.constants.Constants.TEXT_MAX_HEIGHT; -import static mage.constants.Constants.TEXT_MAX_WIDTH; -import static mage.constants.Constants.TEXT_MAX_YOFFSET; +import mage.client.plugins.impl.Plugins; +import mage.client.util.gui.BufferedImageBuilder; +import mage.filters.FilterFactory; +import mage.filters.impl.HueFilter; +import mage.utils.ThreadUtils; +import org.jdesktop.swingx.JXPanel; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Image; -import java.awt.Rectangle; +import javax.imageio.ImageIO; +import javax.swing.*; +import javax.swing.text.BadLocationException; +import javax.swing.text.StyledDocument; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; import java.util.List; import java.util.UUID; -import javax.swing.text.BadLocationException; -import javax.swing.text.StyledDocument; - -import mage.client.plugins.impl.Plugins; - -import org.jdesktop.swingx.JXPanel; +import static mage.constants.Constants.*; /** + * 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 UUID cardId; - protected JXPanel panel; - protected boolean initState; + protected Image bigImage; + protected BufferedImage source; + protected volatile BufferedImage foil; + 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(); if (!Plugins.getInstance().isCardPluginLoaded()) { - initBounds(); + initBounds(); } + setDoubleBuffered(true); + setOpaque(true); } - - protected void initBounds() { - initState = true; + + protected void initBounds() { + initState = true; scrollPane.setBounds(20, 230, 210, 120); scrollPane.setBounds(new Rectangle(CONTENT_MAX_XOFFSET, TEXT_MAX_YOFFSET, TEXT_MAX_WIDTH, TEXT_MAX_HEIGHT)); - } - - public void setCard(UUID cardId, Image image, List strings) { - if (this.cardId == null || !this.cardId.equals(cardId)) { - if (this.panel != null) remove(this.panel); - this.cardId = cardId; - bigImage = image; - this.repaint(); - drawText(strings); - } - } + } + + public void setCard(UUID cardId, Image image, List strings, boolean foil) { + if (this.cardId == null || !this.cardId.equals(cardId)) { + if (this.panel != null) remove(this.panel); + this.cardId = cardId; + bigImage = image; + synchronized (this) { + source = null; + hue = 0.000f; + } + drawText(strings); + setFoil(foil); + } + } public UUID getCardId() { - return cardId; - } - - private void drawText(java.util.List strings) { - text.setText(""); - StyledDocument doc = text.getStyledDocument(); + return cardId; + } - try { - for (String line: strings) { - doc.insertString(doc.getLength(), line + "\n", doc.getStyle("regular")); - } - } catch (BadLocationException ble) { } - text.setCaretPosition(0); - } + private void drawText(java.util.List strings) { + text.setText(""); + StyledDocument doc = text.getStyledDocument(); - @Override - public void paintComponent(Graphics graphics) { - if (bigImage != null) - graphics.drawImage(bigImage, 0, 0, this); - super.paintComponent(graphics); - } + try { + for (String line : strings) { + doc.insertString(doc.getLength(), line + "\n", doc.getStyle("regular")); + } + } 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() { - this.scrollPane.setVisible(false); + this.scrollPane.setVisible(false); } public void showTextComponent() { - if (!initState) {initBounds();} - this.scrollPane.setVisible(true); + if (!initState) { + 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) { - bigImage = null; - synchronized (this) { - if (this.panel != null) remove(this.panel); - this.panel = jxPanel; - add(jxPanel); - } - this.repaint(); + bigImage = null; + synchronized (this) { + if (this.panel != null) remove(this.panel); + this.panel = jxPanel; + add(jxPanel); + } + this.repaint(); } - - /** This method is called from within the constructor to + + /** + * This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. diff --git a/Mage.Client/src/main/java/mage/client/cards/Card.java b/Mage.Client/src/main/java/mage/client/cards/Card.java index fd2772068a7..7e080ed16ca 100644 --- a/Mage.Client/src/main/java/mage/client/cards/Card.java +++ b/Mage.Client/src/main/java/mage/client/cards/Card.java @@ -135,12 +135,12 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis Style s = doc.addStyle("small", regular); StyleConstants.setFontSize(s, 9); - addMouseListener(this); - text.addMouseListener(this); - addFocusListener(this); - addMouseMotionListener(this); - text.addMouseMotionListener(this); - addComponentListener(this); + //addMouseListener(this); + //text.addMouseListener(this); + //addFocusListener(this); + //addMouseMotionListener(this); + //text.addMouseMotionListener(this); + //addComponentListener(this); } public UUID getCardId() { @@ -347,7 +347,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis @Override public void mouseMoved(MouseEvent arg0) { this.bigCard.showTextComponent(); - this.bigCard.setCard(card.getId(), image, getRules()); + this.bigCard.setCard(card.getId(), image, getRules(), false); } @Override @@ -480,7 +480,16 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis return image; } - @Override + @Override + public void setFoil(boolean foil) { + } + + @Override + public boolean isFoil() { + return false; + } + + @Override public PermanentView getOriginalPermanent() { return null; } diff --git a/Mage.Client/src/main/java/mage/client/components/arcane/ManaSymbols.java b/Mage.Client/src/main/java/mage/client/components/arcane/ManaSymbols.java index 80dff70037a..9526ad1e2d6 100644 --- a/Mage.Client/src/main/java/mage/client/components/arcane/ManaSymbols.java +++ b/Mage.Client/src/main/java/mage/client/components/arcane/ManaSymbols.java @@ -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"*/}; for (String symbol : symbols) { File file = new File(Constants.RESOURCE_PATH_MANA_LARGE + "/" + symbol + ".jpg"); - BufferedImageBuilder builder = new BufferedImageBuilder(); Rectangle r = new Rectangle(11, 11); try { 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); } catch (Exception e) { noManaSymbols = true; diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java index dc571f9ef3b..6c5c9720f05 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java @@ -37,6 +37,7 @@ package mage.client.deckeditor; import mage.cards.Card; import mage.cards.decks.Deck; import mage.client.MageFrame; +import mage.client.deckeditor.collection.viewer.Huerotator2; import mage.client.plugins.impl.Plugins; import mage.client.util.Event; import mage.client.util.Listener; diff --git a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java index d1cabb2ffdb..3562a458246 100644 --- a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java +++ b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java @@ -184,14 +184,13 @@ public class MageActionCallback implements ActionCallback { Image image = card.getImage(); if (image != null && image instanceof BufferedImage) { 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(); if (card.getOriginal().isAbility()) { bigCard.showTextComponent(); } else { bigCard.hideTextComponent(); } - ; } else { JXPanel panel = GuiDisplayUtil.getDescription(card.getOriginal(), bigCard.getWidth(), bigCard.getHeight()); panel.setVisible(true); diff --git a/Mage.Client/src/main/java/mage/client/util/gui/BufferedImageBuilder.java b/Mage.Client/src/main/java/mage/client/util/gui/BufferedImageBuilder.java index f10dea97ac7..cea78531bab 100644 --- a/Mage.Client/src/main/java/mage/client/util/gui/BufferedImageBuilder.java +++ b/Mage.Client/src/main/java/mage/client/util/gui/BufferedImageBuilder.java @@ -4,15 +4,27 @@ import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; +/** + * Utility class for creating BufferedImage object from Image instance. + * + * @author nantuko + */ public class BufferedImageBuilder { 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); } - 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); Graphics2D g = bufferedImage.createGraphics(); g.drawImage(image, null, null); @@ -50,7 +62,6 @@ public class BufferedImageBuilder { } class ImageLoadStatus { - public boolean widthDone = false; public boolean heightDone = false; } diff --git a/Mage.Common/src/mage/cards/MageCard.java b/Mage.Common/src/mage/cards/MageCard.java index 5b941213605..674697b73ed 100644 --- a/Mage.Common/src/mage/cards/MageCard.java +++ b/Mage.Common/src/mage/cards/MageCard.java @@ -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 update(CardView card); abstract public Image getImage(); + abstract public void setFoil(boolean foil); + abstract public boolean isFoil(); } diff --git a/Mage.Common/src/mage/filters/FilterFactory.java b/Mage.Common/src/mage/filters/FilterFactory.java new file mode 100644 index 00000000000..64153ce6284 --- /dev/null +++ b/Mage.Common/src/mage/filters/FilterFactory.java @@ -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; + } +} diff --git a/Mage.Common/src/mage/filters/MageBufferedImageOp.java b/Mage.Common/src/mage/filters/MageBufferedImageOp.java new file mode 100644 index 00000000000..08c587cd5b1 --- /dev/null +++ b/Mage.Common/src/mage/filters/MageBufferedImageOp.java @@ -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); + } + } +} diff --git a/Mage.Common/src/mage/filters/PointFilter.java b/Mage.Common/src/mage/filters/PointFilter.java new file mode 100644 index 00000000000..f1aeb8f3a1e --- /dev/null +++ b/Mage.Common/src/mage/filters/PointFilter.java @@ -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); +} diff --git a/Mage.Common/src/mage/filters/impl/HueFilter.java b/Mage.Common/src/mage/filters/impl/HueFilter.java new file mode 100644 index 00000000000..2057ea0301a --- /dev/null +++ b/Mage.Common/src/mage/filters/impl/HueFilter.java @@ -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"; + } +} + diff --git a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/CardPanel.java b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/CardPanel.java index aeed5363340..3c9d4bd0ee5 100644 --- a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/CardPanel.java +++ b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/CardPanel.java @@ -1,15 +1,27 @@ package org.mage.card.arcane; -import java.awt.AlphaComposite; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.RenderingHints; +import mage.Constants.CardType; +import mage.cards.MagePermanent; +import mage.cards.TextPopup; +import mage.cards.action.ActionCallback; +import mage.cards.action.TransferData; +import mage.components.ImagePanel; +import mage.filters.FilterFactory; +import mage.filters.impl.HueFilter; +import mage.utils.CardUtil; +import mage.view.AbilityView; +import mage.view.CardView; +import mage.view.PermanentView; +import mage.view.StackAbilityView; +import org.apache.log4j.Logger; +import org.mage.card.arcane.ScaledImagePanel.MultipassType; +import org.mage.card.arcane.ScaledImagePanel.ScalingType; +import org.mage.plugins.card.images.ImageCache; +import org.mage.plugins.card.utils.BufferedImageBuilder; +import org.mage.plugins.card.utils.impl.ImageManagerImpl; + +import javax.swing.*; +import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; @@ -18,402 +30,431 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; -import javax.swing.BorderFactory; -import javax.swing.JRootPane; -import javax.swing.SwingUtilities; - -import mage.Constants.CardType; -import mage.cards.MagePermanent; -import mage.cards.TextPopup; -import mage.cards.action.ActionCallback; -import mage.cards.action.TransferData; -import mage.components.ImagePanel; -import mage.utils.CardUtil; -import mage.view.AbilityView; -import mage.view.CardView; -import mage.view.PermanentView; -import mage.view.StackAbilityView; - -import org.apache.log4j.Logger; -import org.mage.card.arcane.ScaledImagePanel.MultipassType; -import org.mage.card.arcane.ScaledImagePanel.ScalingType; -import org.mage.plugins.card.images.ImageCache; -import org.mage.plugins.card.utils.impl.ImageManagerImpl; - - -@SuppressWarnings({"unchecked","rawtypes"}) +/** + * Main class for drawing Mage card object. + * + * @author arcane, nantuko + */ +@SuppressWarnings({"unchecked", "rawtypes"}) public class CardPanel extends MagePermanent implements MouseListener, MouseMotionListener { - private static final long serialVersionUID = -3272134219262184410L; - - private static final Logger log = Logger.getLogger(CardPanel.class); - - static public final double TAPPED_ANGLE = Math.PI / 2; - static public final float ASPECT_RATIO = 3.5f / 2.5f; - static public final int POPUP_X_GAP = 1; // prevent popup window from blinking - //static public final float ASPECT_RATIO = 1.0f; + private static final long serialVersionUID = -3272134219262184410L; - static public CardPanel dragAnimationPanel; + private static final Logger log = Logger.getLogger(CardPanel.class); - public static final Rectangle CARD_SIZE_FULL = new Rectangle(101, 149); - - static private final float ROUNDED_CORNER_SIZE = 0.1f; - //static private final float SELECTED_BORDER_SIZE = 0.01f; - static private final float BLACK_BORDER_SIZE = 0.03f; - static private final int TEXT_GLOW_SIZE = 6; - static private final float TEXT_GLOW_INTENSITY = 3f; - static private final float rotCenterToTopCorner = 1.0295630140987000315797369464196f; - static private final float rotCenterToBottomCorner = 0.7071067811865475244008443621048f; + static public final double TAPPED_ANGLE = Math.PI / 2; + static public final float ASPECT_RATIO = 3.5f / 2.5f; + static public final int POPUP_X_GAP = 1; // prevent popup window from blinking + //static public final float ASPECT_RATIO = 1.0f; - public CardView gameCard; - //public List attachedPanels = new ArrayList(); + static public CardPanel dragAnimationPanel; + + public static final Rectangle CARD_SIZE_FULL = new Rectangle(101, 149); + + static private final float ROUNDED_CORNER_SIZE = 0.1f; + //static private final float SELECTED_BORDER_SIZE = 0.01f; + static private final float BLACK_BORDER_SIZE = 0.03f; + static private final int TEXT_GLOW_SIZE = 6; + static private final float TEXT_GLOW_INTENSITY = 3f; + static private final float rotCenterToTopCorner = 1.0295630140987000315797369464196f; + static private final float rotCenterToBottomCorner = 0.7071067811865475244008443621048f; + + static private final int DEFAULT_DELAY_PERIOD = 300; + + public CardView gameCard; + //public List attachedPanels = new ArrayList(); private List links = new ArrayList(); - public double tappedAngle = 0; - public ScaledImagePanel imagePanel; - public ImagePanel overlayPanel; + public double tappedAngle = 0; + public ScaledImagePanel imagePanel; + public ImagePanel overlayPanel; - private GlowText titleText; - private GlowText ptText; - private List imageLoadListeners = new ArrayList(2); - private boolean displayEnabled = true; - private boolean isAnimationPanel; - private int cardXOffset, cardYOffset, cardWidth, cardHeight; + private GlowText titleText; + private GlowText ptText; + private boolean displayEnabled = true; + private boolean isAnimationPanel; + private int cardXOffset, cardYOffset, cardWidth, cardHeight; - private boolean isSelected; - private boolean showCastingCost; - private boolean hasImage = false; - private float alpha = 1.0f; - - private ActionCallback callback; - - protected boolean popupShowing; - protected TextPopup popupText = new TextPopup(); - protected UUID gameId; - private TransferData data = new TransferData(); - - private boolean isPermanent; - private boolean hasSickness; - - public CardPanel(CardView newGameCard, UUID gameId, boolean loadImage, ActionCallback callback) { - this.gameCard = newGameCard; - this.callback = callback; - this.gameId = gameId; - this.isPermanent = this.gameCard instanceof PermanentView; - - if (isPermanent) { - this.hasSickness = ((PermanentView) this.gameCard).hasSummoningSickness(); - } - - //for container debug (don't remove) - //setBorder(BorderFactory.createLineBorder(Color.green)); + private boolean isSelected; + private boolean showCastingCost; + private boolean hasImage = false; + private float alpha = 1.0f; - setBackground(Color.black); - setOpaque(false); - - addMouseListener(this); - addMouseMotionListener(this); - - titleText = new GlowText(); - setText(gameCard); - titleText.setFont(getFont().deriveFont(Font.BOLD, 13f)); - titleText.setForeground(Color.white); - titleText.setGlow(Color.black, TEXT_GLOW_SIZE, TEXT_GLOW_INTENSITY); - titleText.setWrap(true); - add(titleText); + private ActionCallback callback; - ptText = new GlowText(); - if (CardUtil.isCreature(gameCard)) { - ptText.setText(gameCard.getPower() + "/" + gameCard.getToughness()); - } else if (CardUtil.isPlaneswalker(gameCard)) { - ptText.setText(gameCard.getLoyalty()); - } - ptText.setFont(getFont().deriveFont(Font.BOLD, 13f)); - ptText.setForeground(Color.white); - ptText.setGlow(Color.black, TEXT_GLOW_SIZE, TEXT_GLOW_INTENSITY); - add(ptText); - - BufferedImage sickness = ImageManagerImpl.getInstance().getSicknessImage(); - overlayPanel = new ImagePanel(sickness, ImagePanel.SCALED); - overlayPanel.setOpaque(false); - add(overlayPanel); + protected boolean popupShowing; + protected TextPopup popupText = new TextPopup(); + protected UUID gameId; + private TransferData data = new TransferData(); - imagePanel = new ScaledImagePanel(); - imagePanel.setBorder(BorderFactory.createLineBorder(Color.white)); - add(imagePanel); - imagePanel.setScaleLarger(true); - imagePanel.setScalingType(ScalingType.nearestNeighbor); - imagePanel.setScalingBlur(true); - imagePanel.setScalingMultiPassType(MultipassType.none); - - String cardType = getType(newGameCard); - popupText.setText(getText(cardType, newGameCard)); - - if (!loadImage) return; - - Util.threadPool.submit(new Runnable() { - public void run () { - try { - tappedAngle = isTapped() ? CardPanel.TAPPED_ANGLE : 0; - BufferedImage srcImage = ImageCache.getImageOriginal(gameCard); - srcImage = ImageCache.getNormalSizeImage(srcImage); - if (srcImage != null) { - hasImage = true; - setText(gameCard); - setImage(srcImage, srcImage); - } else { - log.warn("image wasn't found, card=" + gameCard.getName() + ", set=" + gameCard.getExpansionSetCode() + ", cid=" + gameCard.getCardNumber()); - } - } catch (Exception e) { - e.printStackTrace(); - } catch (Error err) { - err.printStackTrace(); - } - } - }); - } - - private void setText(CardView card) { - if (hasImage) { - titleText.setText(""); - } else { - titleText.setText(card.getName()); - } - } + private boolean isPermanent; + private boolean hasSickness; + private boolean isFoil; - private void setImage (Image srcImage, Image srcImageBlurred) { - synchronized (imagePanel) { - imagePanel.setImage(srcImage, srcImageBlurred); - repaint(); - for (CardPanel cardPanel : imageLoadListeners) { - cardPanel.setImage(srcImage, srcImageBlurred); - cardPanel.repaint(); - } - imageLoadListeners.clear(); - } - layout(); - } + public CardPanel(CardView newGameCard, UUID gameId, boolean loadImage, ActionCallback callback, final boolean foil) { + this.gameCard = newGameCard; + this.callback = callback; + this.gameId = gameId; + this.isPermanent = this.gameCard instanceof PermanentView; - public void setImage (final CardPanel panel) { - synchronized (panel.imagePanel) { - if (panel.imagePanel.hasImage()) - setImage(panel.imagePanel.srcImage, panel.imagePanel.srcImageBlurred); - else - panel.imageLoadListeners.add(this); - } - } + if (isPermanent) { + this.hasSickness = ((PermanentView) this.gameCard).hasSummoningSickness(); + } - public void setScalingType (ScalingType scalingType) { - imagePanel.setScalingType(scalingType); - } + //for container debug (don't remove) + //setBorder(BorderFactory.createLineBorder(Color.green)); - public void setDisplayEnabled (boolean displayEnabled) { - this.displayEnabled = displayEnabled; - } + setBackground(Color.black); + setOpaque(false); - public boolean isDisplayEnabled () { - return displayEnabled; - } + addMouseListener(this); + addMouseMotionListener(this); - public void setAnimationPanel (boolean isAnimationPanel) { - this.isAnimationPanel = isAnimationPanel; - } + titleText = new GlowText(); + setText(gameCard); + titleText.setFont(getFont().deriveFont(Font.BOLD, 13f)); + titleText.setForeground(Color.white); + titleText.setGlow(Color.black, TEXT_GLOW_SIZE, TEXT_GLOW_INTENSITY); + titleText.setWrap(true); + add(titleText); - public void setSelected (boolean isSelected) { - this.isSelected = isSelected; - repaint(); - } - - public void setAttacking (boolean isAttacking) { - //TODO:uncomment - //this.gameCard.setAttacking(isAttacking); - repaint(); - } - - public boolean getSelected() { - return this.isSelected; - } - - public void setShowCastingCost (boolean showCastingCost) { - this.showCastingCost = showCastingCost; - } + ptText = new GlowText(); + if (CardUtil.isCreature(gameCard)) { + ptText.setText(gameCard.getPower() + "/" + gameCard.getToughness()); + } else if (CardUtil.isPlaneswalker(gameCard)) { + ptText.setText(gameCard.getLoyalty()); + } + ptText.setFont(getFont().deriveFont(Font.BOLD, 13f)); + ptText.setForeground(Color.white); + ptText.setGlow(Color.black, TEXT_GLOW_SIZE, TEXT_GLOW_INTENSITY); + add(ptText); - public void paint (Graphics g) { - if (!displayEnabled) return; - if (!isValid()) super.validate(); - Graphics2D g2d = (Graphics2D)g; - if (tappedAngle > 0) { - g2d = (Graphics2D)g2d.create(); - float edgeOffset = cardWidth / 2f; - g2d.rotate(tappedAngle, cardXOffset + edgeOffset, cardYOffset + cardHeight - edgeOffset); - } - super.paint(g2d); - } + BufferedImage sickness = ImageManagerImpl.getInstance().getSicknessImage(); + overlayPanel = new ImagePanel(sickness, ImagePanel.SCALED); + overlayPanel.setOpaque(false); + add(overlayPanel); - protected void paintComponent (Graphics g) { - Graphics2D g2d = (Graphics2D)g; - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - - if (alpha != 1.0f) { - AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha); - g2d.setComposite(composite); - } - - //TODO:uncomment - if (!hasImage /*&& gameCard.getTableID() > 0*/) { - g2d.setColor(new Color(30,200,200,120)); - } else { - g2d.setColor(new Color(0,0,0,200)); - } - - //for debug repainting - //g2d.setColor(new Color(MyRandom.random.nextInt(255),MyRandom.random.nextInt(255),MyRandom.random.nextInt(255),150)); - int cornerSize = Math.max(4, Math.round(cardWidth * ROUNDED_CORNER_SIZE)); - g2d.fillRoundRect(cardXOffset, cardYOffset, cardWidth, cardHeight, cornerSize, cornerSize); - if (isSelected) { - //g2d.setColor(new Color(0,250,0,200)); - g2d.setColor(new Color(200,120,40,200)); - g2d.fillRoundRect(cardXOffset+1, cardYOffset+1, cardWidth-2, cardHeight-2, cornerSize, cornerSize); - } - - //TODO:uncomment - /* - if (gameCard.isAttacking()) { - g2d.setColor(new Color(200,10,10,200)); - g2d.fillRoundRect(cardXOffset+1, cardYOffset+1, cardWidth-2, cardHeight-2, cornerSize, cornerSize); - }*/ - - /*if (isSelected) { - g2d.setColor(Color.green); - int offset = gameCard.isTapped() ? 1 : 0; - for (int i = 1, n = Math.max(1, Math.round(cardWidth * SELECTED_BORDER_SIZE)); i <= n; i++) - g2d.drawRoundRect(cardXOffset - i, cardYOffset - i + offset, cardWidth + i * 2 - 1, cardHeight + i * 2 - 1, - cornerSize, cornerSize); - }*/ - - - //for debugging - // REMOVEME - /* - Point component = getLocation(); - - int cx = getCardX() + component.x; - int cy = getCardY() + component.y; - int cw = getCardWidth(); - int ch = getCardHeight(); - - g2d.setColor(Color.white); - g2d.drawRect(getCardX() - component.x, getCardY() - component.y, cw, ch); - */ - } + imagePanel = new ScaledImagePanel(); + imagePanel.setBorder(BorderFactory.createLineBorder(Color.white)); + add(imagePanel); + imagePanel.setScaleLarger(true); + imagePanel.setScalingType(ScalingType.nearestNeighbor); + imagePanel.setScalingBlur(true); + imagePanel.setScalingMultiPassType(MultipassType.none); - protected void paintChildren (Graphics g) { - super.paintChildren(g); + String cardType = getType(newGameCard); + popupText.setText(getText(cardType, newGameCard)); - if (showCastingCost && !isAnimationPanel && cardWidth < 200 && cardWidth > 60) { - String manaCost = ManaSymbols.getStringManaCost(gameCard.getManaCost()); - int width = ManaSymbols.getWidth(manaCost); - if (hasImage) { + if (!loadImage) return; + + Util.threadPool.submit(new Runnable() { + public void run() { + try { + tappedAngle = isTapped() ? CardPanel.TAPPED_ANGLE : 0; + BufferedImage srcImage = ImageCache.getImageOriginal(gameCard); + srcImage = ImageCache.getNormalSizeImage(srcImage); + if (srcImage != null) { + hasImage = true; + setText(gameCard); + setImage(srcImage); + setFoil(foil); + } else { + //log.warn("image wasn't found, card=" + gameCard.getName() + ", set=" + gameCard.getExpansionSetCode() + ", cid=" + gameCard.getCardNumber()); + } + } catch (Exception e) { + e.printStackTrace(); + } catch (Error err) { + err.printStackTrace(); + } + } + }); + } + + private void setText(CardView card) { + if (hasImage) { + titleText.setText(""); + } else { + titleText.setText(card.getName()); + } + } + + private void setImage(Image srcImage) { + synchronized (imagePanel) { + imagePanel.setImage(srcImage); + repaint(); + } + layout(); + } + + public void setImage(final CardPanel panel) { + synchronized (panel.imagePanel) { + if (panel.imagePanel.hasImage()) { + setImage(panel.imagePanel.srcImage); + } + } + } + + public boolean isFoil() { + return this.isFoil; + } + + public void setFoil(boolean foil) { + this.isFoil = foil; + if (foil) { + /*BufferedImage source = BufferedImageBuilder.bufferImage(imagePanel.getSrcImage()); + HueFilter filter = FilterFactory.getHueFilter(); + filter.setHue(0.1sf); + BufferedImage dest = filter.filter(source, null); + imagePanel.setImage(dest); + imagePanel.repaint();*/ + + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + if (imagePanel.getSrcImage() == null) { + return; + } + BufferedImage source = BufferedImageBuilder.bufferImage(imagePanel.getSrcImage()); + HueFilter filter = FilterFactory.getHueFilter(); + float hue = 0.005f; + while (true) { + try { + Thread.sleep(DEFAULT_DELAY_PERIOD); + } catch (InterruptedException e) { + } + hue += 0.015F; + if (hue >= 1.0D) { + hue = 0.005F; + } + filter.setHue(hue); + final BufferedImage dest = filter.filter(source, null); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + imagePanel.setImage(dest); + imagePanel.repaint(); + } + }); + } + } + }); + thread.setDaemon(false); + thread.start(); + + } + } + + public void setScalingType(ScalingType scalingType) { + imagePanel.setScalingType(scalingType); + } + + public void setDisplayEnabled(boolean displayEnabled) { + this.displayEnabled = displayEnabled; + } + + public boolean isDisplayEnabled() { + return displayEnabled; + } + + public void setAnimationPanel(boolean isAnimationPanel) { + this.isAnimationPanel = isAnimationPanel; + } + + public void setSelected(boolean isSelected) { + this.isSelected = isSelected; + repaint(); + } + + public void setAttacking(boolean isAttacking) { + //TODO:uncomment + //this.gameCard.setAttacking(isAttacking); + repaint(); + } + + public boolean getSelected() { + return this.isSelected; + } + + public void setShowCastingCost(boolean showCastingCost) { + this.showCastingCost = showCastingCost; + } + + public void paint(Graphics g) { + if (!displayEnabled) return; + if (!isValid()) super.validate(); + Graphics2D g2d = (Graphics2D) g; + if (tappedAngle > 0) { + g2d = (Graphics2D) g2d.create(); + float edgeOffset = cardWidth / 2f; + g2d.rotate(tappedAngle, cardXOffset + edgeOffset, cardYOffset + cardHeight - edgeOffset); + } + super.paint(g2d); + } + + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + if (alpha != 1.0f) { + AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha); + g2d.setComposite(composite); + } + + //TODO:uncomment + if (!hasImage /*&& gameCard.getTableID() > 0*/) { + g2d.setColor(new Color(30, 200, 200, 120)); + } else { + g2d.setColor(new Color(0, 0, 0, 200)); + } + + //for debug repainting + //g2d.setColor(new Color(MyRandom.random.nextInt(255),MyRandom.random.nextInt(255),MyRandom.random.nextInt(255),150)); + int cornerSize = Math.max(4, Math.round(cardWidth * ROUNDED_CORNER_SIZE)); + g2d.fillRoundRect(cardXOffset, cardYOffset, cardWidth, cardHeight, cornerSize, cornerSize); + if (isSelected) { + //g2d.setColor(new Color(0,250,0,200)); + g2d.setColor(new Color(200, 120, 40, 200)); + g2d.fillRoundRect(cardXOffset + 1, cardYOffset + 1, cardWidth - 2, cardHeight - 2, cornerSize, cornerSize); + } + + //TODO:uncomment + /* + if (gameCard.isAttacking()) { + g2d.setColor(new Color(200,10,10,200)); + g2d.fillRoundRect(cardXOffset+1, cardYOffset+1, cardWidth-2, cardHeight-2, cornerSize, cornerSize); + }*/ + + /*if (isSelected) { + g2d.setColor(Color.green); + int offset = gameCard.isTapped() ? 1 : 0; + for (int i = 1, n = Math.max(1, Math.round(cardWidth * SELECTED_BORDER_SIZE)); i <= n; i++) + g2d.drawRoundRect(cardXOffset - i, cardYOffset - i + offset, cardWidth + i * 2 - 1, cardHeight + i * 2 - 1, + cornerSize, cornerSize); + }*/ + + + //for debugging + // REMOVEME + /* + Point component = getLocation(); + + int cx = getCardX() + component.x; + int cy = getCardY() + component.y; + int cw = getCardWidth(); + int ch = getCardHeight(); + + g2d.setColor(Color.white); + g2d.drawRect(getCardX() - component.x, getCardY() - component.y, cw, ch); + */ + } + + protected void paintChildren(Graphics g) { + super.paintChildren(g); + + if (showCastingCost && !isAnimationPanel && cardWidth < 200 && cardWidth > 60) { + String manaCost = ManaSymbols.getStringManaCost(gameCard.getManaCost()); + int width = ManaSymbols.getWidth(manaCost); + if (hasImage) { ManaSymbols.draw(g, manaCost, cardXOffset + cardWidth - width - 5, cardYOffset + 5); - } else { + } else { ManaSymbols.draw(g, manaCost, cardXOffset + 8, cardHeight - 9); - } - } - } + } + } + } - public void layout() { - int borderSize = Math.round(cardWidth * BLACK_BORDER_SIZE); - imagePanel.setLocation(cardXOffset + borderSize, cardYOffset + borderSize); - imagePanel.setSize(cardWidth - borderSize * 2, cardHeight - borderSize * 2); - - if (hasSickness && CardUtil.isCreature(gameCard) && isPermanent) { - overlayPanel.setLocation(cardXOffset + borderSize, cardYOffset + borderSize); - overlayPanel.setSize(cardWidth - borderSize * 2, cardHeight - borderSize * 2); - } else { - overlayPanel.setVisible(false); - } - - int fontHeight = Math.round(cardHeight * (27f / 680)); - boolean showText = (!isAnimationPanel && fontHeight < 12); - titleText.setVisible(showText); - ptText.setVisible(showText); + public void layout() { + int borderSize = Math.round(cardWidth * BLACK_BORDER_SIZE); + imagePanel.setLocation(cardXOffset + borderSize, cardYOffset + borderSize); + imagePanel.setSize(cardWidth - borderSize * 2, cardHeight - borderSize * 2); - int titleX = Math.round(cardWidth * (20f / 480)); - int titleY = Math.round(cardHeight * (9f / 680)); - titleText.setBounds(cardXOffset + titleX, cardYOffset + titleY, cardWidth - titleX, cardHeight); + if (hasSickness && CardUtil.isCreature(gameCard) && isPermanent) { + overlayPanel.setLocation(cardXOffset + borderSize, cardYOffset + borderSize); + overlayPanel.setSize(cardWidth - borderSize * 2, cardHeight - borderSize * 2); + } else { + overlayPanel.setVisible(false); + } - Dimension ptSize = ptText.getPreferredSize(); - ptText.setSize(ptSize.width, ptSize.height); - int ptX = Math.round(cardWidth * (420f / 480)) - ptSize.width / 2; - int ptY = Math.round(cardHeight * (675f / 680)) - ptSize.height; - - int offsetX = Math.round((CARD_SIZE_FULL.width - cardWidth) / 10.0f); - - ptText.setLocation(cardXOffset + ptX - TEXT_GLOW_SIZE / 2 - offsetX, cardYOffset + ptY - TEXT_GLOW_SIZE / 2); + int fontHeight = Math.round(cardHeight * (27f / 680)); + boolean showText = (!isAnimationPanel && fontHeight < 12); + titleText.setVisible(showText); + ptText.setVisible(showText); - if (isAnimationPanel || cardWidth < 200) - imagePanel.setScalingType(ScalingType.nearestNeighbor); - else - imagePanel.setScalingType(ScalingType.bilinear); - } + int titleX = Math.round(cardWidth * (20f / 480)); + int titleY = Math.round(cardHeight * (9f / 680)); + titleText.setBounds(cardXOffset + titleX, cardYOffset + titleY, cardWidth - titleX, cardHeight); - public String toString () { - return gameCard.toString(); - } + Dimension ptSize = ptText.getPreferredSize(); + ptText.setSize(ptSize.width, ptSize.height); + int ptX = Math.round(cardWidth * (420f / 480)) - ptSize.width / 2; + int ptY = Math.round(cardHeight * (675f / 680)) - ptSize.height; - @Override - public void setCardBounds (int x, int y, int width, int height) { - cardWidth = width; - cardHeight = height; - int rotCenterX = Math.round(width / 2f); - int rotCenterY = height - rotCenterX; - int rotCenterToTopCorner = Math.round(width * CardPanel.rotCenterToTopCorner); - int rotCenterToBottomCorner = Math.round(width * CardPanel.rotCenterToBottomCorner); - int xOffset = rotCenterX - rotCenterToBottomCorner; - int yOffset = rotCenterY - rotCenterToTopCorner; - cardXOffset = -xOffset; - cardYOffset = -yOffset; - width = -xOffset + rotCenterX + rotCenterToTopCorner; - height = -yOffset + rotCenterY + rotCenterToBottomCorner; - setBounds(x + xOffset, y + yOffset, width, height); - } + int offsetX = Math.round((CARD_SIZE_FULL.width - cardWidth) / 10.0f); - public void repaint () { - Rectangle b = getBounds(); - JRootPane rootPane = SwingUtilities.getRootPane(this); - if (rootPane == null) return; - Point p = SwingUtilities.convertPoint(getParent(), b.x, b.y, rootPane); - rootPane.repaint(p.x, p.y, b.width, b.height); - } + ptText.setLocation(cardXOffset + ptX - TEXT_GLOW_SIZE / 2 - offsetX, cardYOffset + ptY - TEXT_GLOW_SIZE / 2); - public int getCardX () { - return getX() + cardXOffset; - } + if (isAnimationPanel || cardWidth < 200) + imagePanel.setScalingType(ScalingType.nearestNeighbor); + else + imagePanel.setScalingType(ScalingType.bilinear); + } - public int getCardY () { - return getY() + cardYOffset; - } + public String toString() { + return gameCard.toString(); + } - public int getCardWidth () { - return cardWidth; - } + @Override + public void setCardBounds(int x, int y, int width, int height) { + cardWidth = width; + cardHeight = height; + int rotCenterX = Math.round(width / 2f); + int rotCenterY = height - rotCenterX; + int rotCenterToTopCorner = Math.round(width * CardPanel.rotCenterToTopCorner); + int rotCenterToBottomCorner = Math.round(width * CardPanel.rotCenterToBottomCorner); + int xOffset = rotCenterX - rotCenterToBottomCorner; + int yOffset = rotCenterY - rotCenterToTopCorner; + cardXOffset = -xOffset; + cardYOffset = -yOffset; + width = -xOffset + rotCenterX + rotCenterToTopCorner; + height = -yOffset + rotCenterY + rotCenterToBottomCorner; + setBounds(x + xOffset, y + yOffset, width, height); + } - public int getCardHeight () { - return cardHeight; - } + public void repaint() { + Rectangle b = getBounds(); + JRootPane rootPane = SwingUtilities.getRootPane(this); + if (rootPane == null) return; + Point p = SwingUtilities.convertPoint(getParent(), b.x, b.y, rootPane); + rootPane.repaint(p.x, p.y, b.width, b.height); + } - public Point getCardLocation () { - Point p = getLocation(); - p.x += cardXOffset; - p.y += cardYOffset; - return p; - } + public int getCardX() { + return getX() + cardXOffset; + } - public CardView getCard() { - return this.gameCard; - } - - @Override - public void setAlpha(float alpha) { - this.alpha = alpha; + public int getCardY() { + return getY() + cardYOffset; + } + + public int getCardWidth() { + return cardWidth; + } + + public int getCardHeight() { + return cardHeight; + } + + public Point getCardLocation() { + Point p = getLocation(); + p.x += cardXOffset; + p.y += cardYOffset; + return p; + } + + public CardView getCard() { + return this.gameCard; + } + + @Override + public void setAlpha(float alpha) { + this.alpha = alpha; if (alpha == 0) { this.ptText.setVisible(false); this.titleText.setVisible(false); @@ -421,272 +462,274 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti this.ptText.setVisible(true); this.titleText.setVisible(true); } - } - - public float getAlpha() { - return alpha; - } - - public int getCardXOffset() { - return cardXOffset; - } - - public int getCardYOffset() { - return cardYOffset; - } - - public void updateImage() { - if (!hasImage) { - Util.threadPool.submit(new Runnable() { - public void run () { - //TODO: BufferedImage srcImage = ImageCache.getImageOriginal(gameCard); - //BufferedImage srcImage = null; - //tappedAngle = isTapped() ? CardPanel.TAPPED_ANGLE : 0; - /*if (srcImage != null) { - hasImage = true; - setText(gameCard); - setImage(srcImage, srcImage); - }*/ - } - }); - } - } - - @Override - public List getLinks() { - return links; - } - - @Override - public boolean isTapped() { - if (isPermanent) { - return ((PermanentView)gameCard).isTapped(); - } - return false; - } - - @Override - public void onBeginAnimation() { - } - - @Override - public void onEndAnimation() { - } - - @Override - public void update(CardView card) { - if (isPermanent) { - if (isTapped() != ((PermanentView)card).isTapped()) { - Animation.tapCardToggle(this, this); - } - } - if (CardUtil.isCreature(card) && CardUtil.isPlaneswalker(card)) { - ptText.setText(card.getPower() + "/" + card.getToughness() + " (" + card.getLoyalty() + ")"); - } else if (CardUtil.isCreature(card)) { - ptText.setText(card.getPower() + "/" + card.getToughness()); - } else if (CardUtil.isPlaneswalker(card)) { - ptText.setText(card.getLoyalty()); - } else { - ptText.setText(""); - } - setText(card); - this.gameCard = card; - - String cardType = getType(card); - popupText.setText(getText(cardType, card)); - - if (hasSickness && CardUtil.isCreature(gameCard) && isPermanent) { - overlayPanel.setVisible(true); - } else { - overlayPanel.setVisible(false); - } - - repaint(); - } - - @Override - public boolean contains(int x, int y) { - if (containsThis(x, y, true)) return true; - - /* - * if (attachedCount > 0) { for (MWCardImpl card : - * mwAttachedCards.keySet()) { if (card.contains(x, y)) return true; } } - */ - - return false; - } - - public boolean containsThis(int x, int y, boolean root) { - //log.info("x="+x+", y="+y); - Point component = getLocation(); - - //int dy = component.y; - //if (root) dy = 0; - - int cx = getCardX() - component.x; - int cy = getCardY() - component.y; - int cw = getCardWidth(); - int ch = getCardHeight(); - if (isTapped()) { - cy = ch - cw + cx /*+ attachedDy*attachedCount*/; - ch = cw; - cw = getCardHeight(); - } - //int dx = drawIcons ? 19 : 0; - //int dx = 0; - - if (x >= cx && x <= cx + cw && y >= cy && y <= cy + ch) { - //log.info("!cx="+cx+", cy="+cy+", dx="+cw +", ch="+ch); - //log.info(getOriginal().getId()); - return true; - } else { - //log.info("cx="+cx+", cy="+cy+", dx="+cw +", ch="+ch); - } - return false; } - - @Override - public CardView getOriginal() { - return this.gameCard; - } - @Override - public Image getImage() { - return ImageCache.getImageOriginal(gameCard); - } + public float getAlpha() { + return alpha; + } - @Override - public void mouseClicked(MouseEvent e) { - } + public int getCardXOffset() { + return cardXOffset; + } - @Override - public void mouseEntered(MouseEvent e) { - if (!popupShowing) { - synchronized (this) { - if (!popupShowing) { - popupShowing = true; - callback.mouseEntered(e, getTransferDataForMouseEntered()); - } - } - } - } - - @Override - public void mouseDragged(MouseEvent e) {} + public int getCardYOffset() { + return cardYOffset; + } - @Override - public void mouseMoved(MouseEvent e) { - data.component = this; - callback.mouseMoved(e, data); - } + public void updateImage() { + if (!hasImage) { + throw new IllegalStateException("Not implemented"); + //TODO: + /*Util.threadPool.submit(new Runnable() { + public void run () { + //BufferedImage srcImage = ImageCache.getImageOriginal(gameCard); + //BufferedImage srcImage = null; + //tappedAngle = isTapped() ? CardPanel.TAPPED_ANGLE : 0; + if (srcImage != null) { + hasImage = true; + setText(gameCard); + setImage(srcImage, srcImage); + } + } + });*/ + } + } - @Override - public void mouseExited(MouseEvent e) { - if(getMousePosition(true) != null) return; - if (popupShowing) { - synchronized (this) { - if (popupShowing) { - popupShowing = false; - data.component = this; - data.card = this.gameCard; - data.popupText = popupText; - callback.mouseExited(e, data); - } - } - } - } + @Override + public List getLinks() { + return links; + } - @Override - public void mousePressed(MouseEvent e) { - data.component = this; - data.card = this.gameCard; - data.gameId = this.gameId; - callback.mousePressed(e, data); - } + @Override + public boolean isTapped() { + if (isPermanent) { + return ((PermanentView) gameCard).isTapped(); + } + return false; + } - @Override - public void mouseReleased(MouseEvent e) {} + @Override + public void onBeginAnimation() { + } - /** - * Prepares data to be sent to action callback on client side. - * - * @return - */ - private TransferData getTransferDataForMouseEntered() { - data.component = this; - data.card = this.gameCard; - data.popupText = popupText; - data.popupOffsetX = isTapped() ? cardHeight + cardXOffset + POPUP_X_GAP : cardWidth + cardXOffset + POPUP_X_GAP; - data.popupOffsetY = 40; - data.locationOnScreen = this.getLocationOnScreen(); - return data; - } - - protected String getType(CardView card) { - StringBuilder sbType = new StringBuilder(); + @Override + public void onEndAnimation() { + } - for (String superType: card.getSuperTypes()) { - sbType.append(superType).append(" "); - } + @Override + public void update(CardView card) { + if (isPermanent) { + if (isTapped() != ((PermanentView) card).isTapped()) { + Animation.tapCardToggle(this, this); + } + } + if (CardUtil.isCreature(card) && CardUtil.isPlaneswalker(card)) { + ptText.setText(card.getPower() + "/" + card.getToughness() + " (" + card.getLoyalty() + ")"); + } else if (CardUtil.isCreature(card)) { + ptText.setText(card.getPower() + "/" + card.getToughness()); + } else if (CardUtil.isPlaneswalker(card)) { + ptText.setText(card.getLoyalty()); + } else { + ptText.setText(""); + } + setText(card); + this.gameCard = card; - for (mage.Constants.CardType cardType: card.getCardTypes()) { - sbType.append(cardType.toString()).append(" "); - } + String cardType = getType(card); + popupText.setText(getText(cardType, card)); - if (card.getSubTypes().size() > 0) { - sbType.append("- "); - for (String subType: card.getSubTypes()) { - sbType.append(subType).append(" "); - } - } + if (hasSickness && CardUtil.isCreature(gameCard) && isPermanent) { + overlayPanel.setVisible(true); + } else { + overlayPanel.setVisible(false); + } - return sbType.toString(); - } - - protected String getText(String cardType, CardView card) { - StringBuilder sb = new StringBuilder(); - if (card instanceof StackAbilityView || card instanceof AbilityView) { - for (String rule: card.getRules()) { - sb.append("\n").append(rule); - } - } - else { - sb.append(card.getName()); - if (card.getManaCost().size() > 0) { - sb.append("\n").append(card.getManaCost()); - } - sb.append("\n").append(cardType); - if (card.getColor().hasColor()) { - sb.append("\n").append(card.getColor().toString()); - } - if (card.getCardTypes().contains(CardType.CREATURE)) { - sb.append("\n").append(card.getPower()).append("/").append(card.getToughness()); - } - else if (card.getCardTypes().contains(CardType.PLANESWALKER)) { - sb.append("\n").append(card.getLoyalty()); - } - for (String rule: card.getRules()) { - sb.append("\n").append(rule); - } - if (card.getExpansionSetCode() != null && card.getExpansionSetCode().length() > 0) { - sb.append("\n").append(card.getCardNumber()).append(" - "); - //sb.append(Sets.getInstance().get(card.getExpansionSetCode()).getName()).append(" - "); - sb.append(card.getExpansionSetCode()).append(" - "); - sb.append(card.getRarity().toString()); - } - } + repaint(); + } + + @Override + public boolean contains(int x, int y) { + if (containsThis(x, y, true)) return true; + + /* + * if (attachedCount > 0) { for (MWCardImpl card : + * mwAttachedCards.keySet()) { if (card.contains(x, y)) return true; } } + */ + + return false; + } + + public boolean containsThis(int x, int y, boolean root) { + //log.info("x="+x+", y="+y); + Point component = getLocation(); + + //int dy = component.y; + //if (root) dy = 0; + + int cx = getCardX() - component.x; + int cy = getCardY() - component.y; + int cw = getCardWidth(); + int ch = getCardHeight(); + if (isTapped()) { + cy = ch - cw + cx /*+ attachedDy*attachedCount*/; + ch = cw; + cw = getCardHeight(); + } + //int dx = drawIcons ? 19 : 0; + //int dx = 0; + + if (x >= cx && x <= cx + cw && y >= cy && y <= cy + ch) { + //log.info("!cx="+cx+", cy="+cy+", dx="+cw +", ch="+ch); + //log.info(getOriginal().getId()); + return true; + } else { + //log.info("cx="+cx+", cy="+cy+", dx="+cw +", ch="+ch); + } + return false; + } + + @Override + public CardView getOriginal() { + return this.gameCard; + } + + @Override + public Image getImage() { + return ImageCache.getImageOriginal(gameCard); + } + + @Override + public void mouseClicked(MouseEvent e) { + } + + @Override + public void mouseEntered(MouseEvent e) { + if (!popupShowing) { + synchronized (this) { + if (!popupShowing) { + popupShowing = true; + callback.mouseEntered(e, getTransferDataForMouseEntered()); + } + } + } + } + + @Override + public void mouseDragged(MouseEvent e) { + } + + @Override + public void mouseMoved(MouseEvent e) { + data.component = this; + callback.mouseMoved(e, data); + } + + @Override + public void mouseExited(MouseEvent e) { + if (getMousePosition(true) != null) return; + if (popupShowing) { + synchronized (this) { + if (popupShowing) { + popupShowing = false; + data.component = this; + data.card = this.gameCard; + data.popupText = popupText; + callback.mouseExited(e, data); + } + } + } + } + + @Override + public void mousePressed(MouseEvent e) { + data.component = this; + data.card = this.gameCard; + data.gameId = this.gameId; + callback.mousePressed(e, data); + } + + @Override + public void mouseReleased(MouseEvent e) { + } + + /** + * Prepares data to be sent to action callback on client side. + * + * @return + */ + private TransferData getTransferDataForMouseEntered() { + data.component = this; + data.card = this.gameCard; + data.popupText = popupText; + data.popupOffsetX = isTapped() ? cardHeight + cardXOffset + POPUP_X_GAP : cardWidth + cardXOffset + POPUP_X_GAP; + data.popupOffsetY = 40; + data.locationOnScreen = this.getLocationOnScreen(); + return data; + } + + protected String getType(CardView card) { + StringBuilder sbType = new StringBuilder(); + + for (String superType : card.getSuperTypes()) { + sbType.append(superType).append(" "); + } + + for (mage.Constants.CardType cardType : card.getCardTypes()) { + sbType.append(cardType.toString()).append(" "); + } + + if (card.getSubTypes().size() > 0) { + sbType.append("- "); + for (String subType : card.getSubTypes()) { + sbType.append(subType).append(" "); + } + } + + return sbType.toString(); + } + + protected String getText(String cardType, CardView card) { + StringBuilder sb = new StringBuilder(); + if (card instanceof StackAbilityView || card instanceof AbilityView) { + for (String rule : card.getRules()) { + sb.append("\n").append(rule); + } + } else { + sb.append(card.getName()); + if (card.getManaCost().size() > 0) { + sb.append("\n").append(card.getManaCost()); + } + sb.append("\n").append(cardType); + if (card.getColor().hasColor()) { + sb.append("\n").append(card.getColor().toString()); + } + if (card.getCardTypes().contains(CardType.CREATURE)) { + sb.append("\n").append(card.getPower()).append("/").append(card.getToughness()); + } else if (card.getCardTypes().contains(CardType.PLANESWALKER)) { + sb.append("\n").append(card.getLoyalty()); + } + for (String rule : card.getRules()) { + sb.append("\n").append(rule); + } + if (card.getExpansionSetCode() != null && card.getExpansionSetCode().length() > 0) { + sb.append("\n").append(card.getCardNumber()).append(" - "); + //sb.append(Sets.getInstance().get(card.getExpansionSetCode()).getName()).append(" - "); + sb.append(card.getExpansionSetCode()).append(" - "); + sb.append(card.getRarity().toString()); + } + } // sb.append("\n").append(card.getId()); - return sb.toString(); - } + return sb.toString(); + } - @Override - public void update(PermanentView card) { - update((CardView)card); - this.hasSickness = card.hasSummoningSickness(); - } + @Override + public void update(PermanentView card) { + update((CardView) card); + this.hasSickness = card.hasSummoningSickness(); + } - @Override - public PermanentView getOriginalPermanent() { - throw new IllegalStateException("Is not permanent."); - } + @Override + public PermanentView getOriginalPermanent() { + throw new IllegalStateException("Is not permanent."); + } } diff --git a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/ManaSymbols.java b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/ManaSymbols.java index 9ca2ca45bfe..fea218b638c 100644 --- a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/ManaSymbols.java +++ b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/ManaSymbols.java @@ -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"}; for (String symbol : symbols) { File file = new File(Constants.RESOURCE_PATH_MANA_LARGE + "/" + symbol + ".jpg"); - BufferedImageBuilder builder = new BufferedImageBuilder(); Rectangle r = new Rectangle(11, 11); try { 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); } catch (Exception e) {} file = new File(Constants.RESOURCE_PATH_MANA_MEDIUM + "/" + symbol + ".jpg"); diff --git a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/ScaledImagePanel.java b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/ScaledImagePanel.java index 7f7656c7e34..0e6093141f0 100644 --- a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/ScaledImagePanel.java +++ b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/card/arcane/ScaledImagePanel.java @@ -11,7 +11,7 @@ import javax.swing.JPanel; public class ScaledImagePanel extends JPanel { private static final long serialVersionUID = -1523279873208605664L; public volatile Image srcImage; - public volatile Image srcImageBlurred; + //public volatile Image srcImageBlurred; private ScalingType scalingType = ScalingType.bilinear; private boolean scaleLarger; @@ -23,9 +23,8 @@ public class ScaledImagePanel extends JPanel { setOpaque(false); } - public void setImage (Image srcImage, Image srcImageBlurred) { + public void setImage(Image srcImage) { this.srcImage = srcImage; - this.srcImageBlurred = srcImageBlurred; } public void clearImage () { @@ -168,9 +167,10 @@ public class ScaledImagePanel extends JPanel { } private Image getSourceImage (ScalingInfo info) { - if (!blur || srcImageBlurred == null) return srcImage; - if (info.srcWidth / 2 < info.targetWidth || info.srcHeight / 2 < info.targetHeight) return srcImage; - return srcImageBlurred; + return srcImage; + //if (!blur || srcImageBlurred == null) return srcImage; + //if (info.srcWidth / 2 < info.targetWidth || info.srcHeight / 2 < info.targetHeight) return srcImage; + //return srcImageBlurred; } public Image getSrcImage() { diff --git a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/CardPluginImpl.java b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/CardPluginImpl.java index 9fec2f9d2cb..e1cf3a8e6b6 100644 --- a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/CardPluginImpl.java +++ b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/CardPluginImpl.java @@ -6,12 +6,7 @@ import java.awt.Image; import java.awt.Rectangle; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; import javax.swing.JComponent; import javax.swing.JDialog; @@ -92,7 +87,8 @@ public class CardPluginImpl implements CardPlugin { @Override 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.setCardBounds(0, 0, dimension.frameWidth, dimension.frameHeight); cardPanel.setShowCastingCost(true); @@ -101,10 +97,12 @@ public class CardPluginImpl implements CardPlugin { @Override 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.setCardBounds(0, 0, dimension.frameWidth, dimension.frameHeight); cardPanel.setShowCastingCost(true); + return cardPanel; } diff --git a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/utils/BufferedImageBuilder.java b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/utils/BufferedImageBuilder.java index cc0890cdc56..bf254d57683 100644 --- a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/utils/BufferedImageBuilder.java +++ b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/utils/BufferedImageBuilder.java @@ -5,15 +5,27 @@ import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; +/** + * Utility class for creating BufferedImage object from Image instance. + * + * @author nantuko + */ public class BufferedImageBuilder { 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); } - 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); Graphics2D g = bufferedImage.createGraphics(); g.drawImage(image, null, null); diff --git a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java index 4c8bff76203..ba668684683 100644 --- a/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java +++ b/Mage.Plugins/Mage.Card.Plugin/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java @@ -29,8 +29,7 @@ public class ImageManagerImpl implements ImageManager { Image image = getImageFromResourceTransparent("/sickness.png", Color.WHITE, new Rectangle(296, 265)); Toolkit tk = Toolkit.getDefaultToolkit(); image = tk.createImage(new FilteredImageSource(image.getSource(), new CropImageFilter(0, 0, 200, 285))); - BufferedImageBuilder builder = new BufferedImageBuilder(); - imageSickness = builder.bufferImage(image, BufferedImage.TYPE_INT_ARGB); + imageSickness = BufferedImageBuilder.bufferImage(image, BufferedImage.TYPE_INT_ARGB); } return imageSickness; }