WarpPI/desktop/src/main/java/it/cavallium/warppi/gui/graphicengine/cpu/SwingWindow.java

249 lines
8.1 KiB
Java
Raw Normal View History

package it.cavallium.warppi.gui.graphicengine.cpu;
2017-01-16 17:57:09 +01:00
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
2018-07-28 23:26:07 +02:00
import java.awt.Insets;
2017-01-16 17:57:09 +01:00
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
2018-07-28 23:26:07 +02:00
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
2017-01-16 17:57:09 +01:00
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import javax.swing.JFrame;
import javax.swing.JPanel;
2018-09-04 12:12:41 +02:00
import it.cavallium.warppi.Engine;
import it.cavallium.warppi.StaticVars;
import it.cavallium.warppi.Utils;
import it.cavallium.warppi.device.HardwareDevice;
import it.cavallium.warppi.device.Keyboard;
import it.cavallium.warppi.event.TouchEndEvent;
import it.cavallium.warppi.event.TouchMoveEvent;
import it.cavallium.warppi.event.TouchPoint;
import it.cavallium.warppi.event.TouchStartEvent;
import it.cavallium.warppi.flow.BehaviorSubject;
import it.cavallium.warppi.flow.Observable;
import it.cavallium.warppi.gui.graphicengine.RenderingLoop;
2018-07-28 23:26:07 +02:00
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
2017-01-16 17:57:09 +01:00
public class SwingWindow extends JFrame {
private static final long serialVersionUID = 2945898937634075491L;
public CustomCanvas c;
private RenderingLoop renderingLoop;
private final CPUEngine display;
2017-10-17 22:49:21 +02:00
private int mult = 1;
2018-08-29 00:07:45 +02:00
private BehaviorSubject<Integer[]> onResize;
private Observable<Integer[]> onResize$;
2017-01-16 17:57:09 +01:00
public SwingWindow(CPUEngine disp) {
display = disp;
2017-01-16 17:57:09 +01:00
c = new CustomCanvas();
c.setDoubleBuffered(false);
this.add(c);
// this.setExtendedState(Frame.MAXIMIZED_BOTH);
Toolkit.getDefaultToolkit().setDynamicLayout(false);
// Transparent 16 x 16 pixel cursor image.
final BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
mult = StaticVars.windowZoomFunction.apply(StaticVars.windowZoom.getLastValue()).intValue();
2018-09-02 12:45:51 +02:00
2018-09-11 01:12:54 +02:00
if (!StaticVars.debugOn) {
2017-01-16 17:57:09 +01:00
// Create a new blank cursor.
final Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(cursorImg, new Point(0, 0), "blank cursor");
2017-01-16 17:57:09 +01:00
// Set the blank cursor to the JFrame.
getContentPane().setCursor(blankCursor);
setResizable(false);
2017-01-16 17:57:09 +01:00
}
2018-03-01 09:43:10 +01:00
setTitle("WarpPI Calculator by Andrea Cavalli (@Cavallium)");
2018-08-29 00:07:45 +02:00
onResize = BehaviorSubject.create();
onResize$ = onResize.doOnNext((newSize) -> {
disp.r.size = new int[] { newSize[0], newSize[1] };
if (disp.r.size[0] <= 0) {
disp.r.size[0] = 1;
}
if (disp.r.size[1] <= 0) {
disp.r.size[1] = 1;
}
CPURenderer.canvas2d = new int[disp.r.size[0] * disp.r.size[1]];
disp.g = new BufferedImage(disp.r.size[0], disp.r.size[1], BufferedImage.TYPE_INT_RGB);
});
2018-09-02 12:45:51 +02:00
addComponentListener(new ComponentListener() {
2017-01-16 17:57:09 +01:00
@Override
public void componentHidden(ComponentEvent e) {
HardwareDevice.INSTANCE.getDisplayManager().engine.destroy();
2017-01-16 17:57:09 +01:00
}
@Override
public void componentMoved(ComponentEvent e) {}
@Override
public void componentResized(ComponentEvent e) {
2018-09-02 12:45:51 +02:00
onResize.onNext(new Integer[] { getWidth(), getHeight() });
2017-01-16 17:57:09 +01:00
}
@Override
public void componentShown(ComponentEvent e) {
2018-09-11 01:12:54 +02:00
if (StaticVars.debugOn) {
SwingWindow.this.centerWindow();
}
}
2017-01-16 17:57:09 +01:00
});
addKeyListener(new KeyListener() {
2017-01-16 17:57:09 +01:00
@Override
public void keyPressed(KeyEvent arg0) {
Keyboard.debugKeyCode = arg0.getKeyCode();
2017-01-16 17:57:09 +01:00
}
@Override
public void keyReleased(KeyEvent arg0) {
2018-04-01 01:01:57 +02:00
Keyboard.debugKeyCodeRelease = arg0.getKeyCode();
2017-01-16 17:57:09 +01:00
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
});
2018-07-28 23:26:07 +02:00
addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
final Insets wp = SwingWindow.this.getInsets();
TouchPoint p = new TouchPoint(0, e.getX() - wp.left, e.getY() - wp.top, 5, 5, 1, 0);
ObjectArrayList<TouchPoint> touches = new ObjectArrayList<>();
ObjectArrayList<TouchPoint> changedTouches = new ObjectArrayList<>();
touches.add(p);
changedTouches.add(p);
TouchMoveEvent tse = new TouchMoveEvent(changedTouches, touches);
HardwareDevice.INSTANCE.getInputManager().getTouchDevice().onTouchMove(tse);
}
2018-08-28 02:39:41 +02:00
2018-07-28 23:26:07 +02:00
@Override
2018-08-28 02:39:41 +02:00
public void mouseMoved(MouseEvent e) {}
2018-07-28 23:26:07 +02:00
});
addMouseListener(new MouseListener() {
2018-08-28 02:39:41 +02:00
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {
2018-07-28 23:26:07 +02:00
final Insets wp = SwingWindow.this.getInsets();
TouchPoint p = new TouchPoint(0, e.getX() - wp.left, e.getY() - wp.top, 5, 5, 1, 0);
ObjectArrayList<TouchPoint> touches = new ObjectArrayList<>();
ObjectArrayList<TouchPoint> changedTouches = new ObjectArrayList<>();
touches.add(p);
changedTouches.add(p);
TouchStartEvent tse = new TouchStartEvent(changedTouches, touches);
HardwareDevice.INSTANCE.getInputManager().getTouchDevice().onTouchStart(tse);
}
2018-08-28 02:39:41 +02:00
@Override
public void mouseReleased(MouseEvent e) {
2018-07-28 23:26:07 +02:00
final Insets wp = SwingWindow.this.getInsets();
TouchPoint p = new TouchPoint(0, e.getX() - wp.left, e.getY() - wp.top, 5, 5, 1, 0);
ObjectArrayList<TouchPoint> touches = new ObjectArrayList<>();
ObjectArrayList<TouchPoint> changedTouches = new ObjectArrayList<>();
changedTouches.add(p);
TouchEndEvent tse = new TouchEndEvent(changedTouches, touches);
HardwareDevice.INSTANCE.getInputManager().getTouchDevice().onTouchEnd(tse);
}
2018-08-28 02:39:41 +02:00
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
2018-07-28 23:26:07 +02:00
});
2018-08-29 00:07:45 +02:00
StaticVars.windowZoom$.subscribe((newZoomValue) -> {
if (newZoomValue != mult) {
mult = (int) newZoomValue.floatValue();
2018-09-02 12:45:51 +02:00
this.onResize.onNext(new Integer[] { getWidth(), getHeight() });
2018-09-04 12:12:41 +02:00
Engine.getPlatform().getConsoleUtils().out().println(3, "Engine", "CPU", "Zoom changed");
2018-08-29 00:07:45 +02:00
}
});
}
public Observable<Integer[]> onResize() {
return onResize$;
2017-01-16 17:57:09 +01:00
}
@Override
public void setSize(int width, int height) {
2018-05-12 21:18:29 +02:00
c.setSize(new Dimension(width * mult, height * mult));
c.setPreferredSize(new Dimension(width * mult, height * mult));
super.getContentPane().setSize(new Dimension(width * mult, height * mult));
super.getContentPane().setPreferredSize(new Dimension(width * mult, height * mult));
2017-01-16 17:57:09 +01:00
super.pack();
}
@Override
public Dimension getSize() {
2017-10-17 22:49:21 +02:00
return new Dimension(getWidth(), getHeight());
2017-01-16 17:57:09 +01:00
}
@Override
public int getWidth() {
2018-05-12 21:18:29 +02:00
return c.getWidth() / mult;
2017-01-16 17:57:09 +01:00
}
@Override
public int getHeight() {
2018-05-12 21:18:29 +02:00
return c.getHeight() / mult;
2017-01-16 17:57:09 +01:00
}
public void setRenderingLoop(RenderingLoop renderingLoop) {
this.renderingLoop = renderingLoop;
}
2017-01-16 17:57:09 +01:00
public void centerWindow() {
2018-05-12 21:18:29 +02:00
final Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
final int x = (int) ((dimension.getWidth() - super.getWidth()) / 2);
final int y = (int) ((dimension.getHeight() - super.getHeight()) / 2);
super.setLocation(x, y);
}
2018-05-12 21:18:29 +02:00
// private static ObjectArrayList<Double> mediaValori = new ObjectArrayList<Double>();
2017-01-16 17:57:09 +01:00
public class CustomCanvas extends JPanel {
2017-01-16 17:57:09 +01:00
/**
*
*/
private static final long serialVersionUID = 605243927485370885L;
@Override
public void paintComponent(Graphics g) {
// long time1 = System.nanoTime();
if (renderingLoop != null) {
renderingLoop.refresh();
final int[] a = ((DataBufferInt) display.g.getRaster().getDataBuffer()).getData();
CPURenderer.canvas2d = a;
2018-05-12 21:18:29 +02:00
g.clearRect(0, 0, display.r.size[0] * mult, display.r.size[1] * mult);
g.drawImage(display.g, 0, 0, display.r.size[0] * mult, display.r.size[1] * mult, null);
// long time2 = System.nanoTime();
// double timeDelta = ((double)(time2-time1))/1000000000d;
// double mediaAttuale = timeDelta;
// mediaValori.add(mediaAttuale);
// double somma = 0;
// for (Double val : mediaValori) {
// somma+=val;
// }
// System.out.println(somma/((double)mediaValori.size()));
}
2017-01-16 17:57:09 +01:00
}
}
}