diff --git a/Painter/src/bz/bronze/painter/Context.java b/Painter/src/bz/bronze/painter/Context.java index b7efe9f..e1736c8 100644 --- a/Painter/src/bz/bronze/painter/Context.java +++ b/Painter/src/bz/bronze/painter/Context.java @@ -2,7 +2,9 @@ package bz.bronze.painter; import java.awt.Color; import java.awt.Graphics; - +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.awt.image.RenderedImage; import java.util.Random; public class Context { @@ -10,28 +12,38 @@ public class Context { static Random rng = new Random(); + static BufferedImage bufferedImage = new BufferedImage(Window.paintArea.getWidth(), Window.paintArea.getHeight(), BufferedImage.TYPE_INT_ARGB); + static RenderedImage renderedImage; + + static Graphics g = Window.paintArea.getGraphics(); + public static void drawBorders(Graphics g) - { - g.drawLine(0, 0, 0, Window.height + 10); + { + g.fillRect(0, 0, 3, Window.height + 10); - Log.print("hit"); - - //g.dispose(); + g.dispose(); } - public static void draw(Graphics g, int x, int y) + public static void draw(int x, int y) { int size = Window.sizeSlider.getValue(); + Color c = new Color(rng.nextInt(256), rng.nextInt(256), rng.nextInt(256), Window.opacitySlider.getValue()); g.setColor(c); g.fillOval(x - size / 2, y - size / 2, size, size); - g.dispose(); - - Log.print("[PAINTER] Drawn at, " + "X: " + x + " Y: " + y); - Log.print("[PAINTER] Color, " + "R: " + c.getRed() + " G: " + c.getGreen() + " B: " + c.getBlue()); - Log.print("[PAINTER] Opacity, " + Window.opacitySlider.getValue()); + renderedImage = bufferedImage; + + Log.print("[PAINTER] Drawn at " + "X: " + x + " Y: " + y); + Log.print("[PAINTER] Color " + "R: " + c.getRed() + " G: " + c.getGreen() + " B: " + c.getBlue()); + Log.print("[PAINTER] Opacity " + Window.opacitySlider.getValue()); + } + + public static void swapBuffers(Graphics g) + { + Graphics2D g2d = (Graphics2D) g; + g2d.drawImage(bufferedImage, null, 0, 0); } } \ No newline at end of file diff --git a/Painter/src/bz/bronze/painter/Mouse.java b/Painter/src/bz/bronze/painter/Input.java similarity index 67% rename from Painter/src/bz/bronze/painter/Mouse.java rename to Painter/src/bz/bronze/painter/Input.java index ba5cb8e..0b636e1 100644 --- a/Painter/src/bz/bronze/painter/Mouse.java +++ b/Painter/src/bz/bronze/painter/Input.java @@ -6,8 +6,8 @@ import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; -public class Mouse { - static boolean isDown; +public class Input { + static boolean mouseIsDown; public static void listen() { @@ -19,13 +19,12 @@ public class Mouse { @Override public void mousePressed(MouseEvent e) { - isDown = true; - + mouseIsDown = true; } @Override public void mouseReleased(MouseEvent e) { - isDown = false; + mouseIsDown = false; } @Override @@ -39,12 +38,22 @@ public class Mouse { }); Window.clearButton.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) { - Window.paintArea.repaint(); - } - }); + { + @Override + public void actionPerformed(ActionEvent e) { + Window.paintArea.repaint(); + Context.bufferedImage.flush(); + + Log.print("[PAINTER] Cleared!"); + } + }); + Window.saveButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) { + Save.saveImage(); + } + }); } public static int getMouseX() diff --git a/Painter/src/bz/bronze/painter/Painter.java b/Painter/src/bz/bronze/painter/Painter.java index e9f5214..508bcef 100644 --- a/Painter/src/bz/bronze/painter/Painter.java +++ b/Painter/src/bz/bronze/painter/Painter.java @@ -3,12 +3,11 @@ package bz.bronze.painter; public class Painter { private static String title = "Painter"; public static boolean isRunning; - public static void init() { Window w = new Window(title); - //Context.drawBorders(Window.paintArea.getGraphics()); + Context.drawBorders(Window.paintArea.getGraphics()); Tick refresh = new Tick(); Log.print("[INIT] Done!"); diff --git a/Painter/src/bz/bronze/painter/Save.java b/Painter/src/bz/bronze/painter/Save.java new file mode 100644 index 0000000..ae29367 --- /dev/null +++ b/Painter/src/bz/bronze/painter/Save.java @@ -0,0 +1,20 @@ +package bz.bronze.painter; + +import java.io.IOException; + +import javax.imageio.ImageIO; + +public class Save { + public static void saveImage() + { + Window.filePicker.showSaveDialog(Window.paintArea); + + try + { + ImageIO.write(Window.paintArea.getGraphics(), "png", Window.filePicker.getSelectedFile()); + Log.print("[INFO] Image Saved!"); + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/Painter/src/bz/bronze/painter/Tick.java b/Painter/src/bz/bronze/painter/Tick.java index a293419..9d9bd3c 100644 --- a/Painter/src/bz/bronze/painter/Tick.java +++ b/Painter/src/bz/bronze/painter/Tick.java @@ -1,24 +1,46 @@ package bz.bronze.painter; public class Tick implements Runnable { - public Thread refresh = new Thread(this); + public Thread tick = new Thread(this); + long taskTime = 0; + long sleepTime = 1000/60; public Tick() { - refresh.start(); + tick.start(); } public void run() { while(Painter.isRunning) { + taskTime = System.currentTimeMillis(); + Window.opacitySliderLabel.setText("Opacity: " + Window.opacitySlider.getValue()); Window.sizeSliderLabel.setText("Size: " + Window.sizeSlider.getValue()); - if(Mouse.isDown) + Context.drawBorders(Window.paintArea.getGraphics()); + + if(Input.mouseIsDown) { - Context.draw(Window.paintArea.getGraphics(), Window.paintArea.getMousePosition().x, Window.paintArea.getMousePosition().y); - //Window.paintArea.repaint(); + try + { + Context.draw(Window.paintArea.getMousePosition().x, Window.paintArea.getMousePosition().y); + } catch (Exception e) + { + Log.print("[ERROR] Mouse out of bounds!"); + } } + + Context.swapBuffers(Window.paintArea.getGraphics()); + + taskTime = System.currentTimeMillis()-taskTime; + if (sleepTime-taskTime > 0 ) { + try { + Thread.sleep(sleepTime-taskTime); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } } } } \ No newline at end of file diff --git a/Painter/src/bz/bronze/painter/Window.java b/Painter/src/bz/bronze/painter/Window.java index c8f2581..2d257b8 100644 --- a/Painter/src/bz/bronze/painter/Window.java +++ b/Painter/src/bz/bronze/painter/Window.java @@ -4,10 +4,12 @@ import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JButton; +import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; +import javax.swing.filechooser.FileNameExtensionFilter; public class Window { public static int width = 1280; @@ -24,6 +26,10 @@ public class Window { public static JSlider sizeSlider = new JSlider(); public static JButton clearButton = new JButton(); + public static JButton saveButton = new JButton(); + + public static JFileChooser filePicker = new JFileChooser(); + public static FileNameExtensionFilter filter = new FileNameExtensionFilter("Images", "png"); public Window(String windowName) { @@ -36,9 +42,16 @@ public class Window { sizeSlider.setValue(100); sizeSlider.setPreferredSize(new Dimension(100, 50)); + clearButton.setEnabled(false); + clearButton.setToolTipText("Clearing machine broke!"); clearButton.setText("Clear"); clearButton.setPreferredSize(new Dimension(100, 50)); + saveButton.setText("Save"); + saveButton.setPreferredSize(new Dimension(100, 50)); + + //filePicker.setFileFilter(filter); + window.setLayout(new BorderLayout()); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setSize(width, height); @@ -49,7 +62,8 @@ public class Window { toolbox.add(sizeSliderLabel); toolbox.add(sizeSlider); toolbox.add(clearButton); - toolbox.add(fpsLabel, BorderLayout.SOUTH); + toolbox.add(saveButton); + //toolbox.add(fpsLabel, BorderLayout.SOUTH); window.add(paintArea); window.add(toolbox, BorderLayout.WEST); @@ -60,7 +74,7 @@ public class Window { window.setResizable(false); window.setVisible(true); - Mouse.listen(); + Input.listen(); Log.print("[WINDOW] Created!"); }