/* JPC: An x86 PC Hardware Emulator for a pure Java Virtual Machine Release Version 2.4 A project from the Physics Dept, The University of Oxford Copyright (C) 2007-2010 The University of Oxford This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Details (including contact information) can be found at: jpc.sourceforge.net or the developer website sourceforge.net/projects/jpc/ Conceived and Developed by: Rhys Newman, Ian Preston, Chris Dennis End of licence header */ package org.jpc.emulator.pci.peripheral; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import org.jpc.j2se.PCMonitor; /** * * @author Ian Preston */ public final class DefaultVGACard extends VGACard { private int[] rawImageData; private int xmin, xmax, ymin, ymax, width, height; private BufferedImage buffer; PCMonitor monitor; public DefaultVGACard() { } public int getXMin() { return xmin; } public int getXMax() { return xmax; } public int getYMin() { return ymin; } public int getYMax() { return ymax; } protected int rgbToPixel(int red, int green, int blue) { return ((0xFF & red) << 16) | ((0xFF & green) << 8) | (0xFF & blue); } public void resizeDisplay(int width, int height) { if ((width == 0) || (height == 0)) return; this.width = width; this.height = height; buffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); buffer.setAccelerationPriority(1); DataBufferInt buf = (DataBufferInt) buffer.getRaster().getDataBuffer(); rawImageData = buf.getData(); monitor.resizeDisplay(width, height); } public void saveScreenshot() { File out = new File("Screenshot.png"); try { ImageIO.write(buffer, "png", out); } catch (IOException e) { e.printStackTrace(); } } public void setMonitor(PCMonitor mon) { this.monitor = mon; } public Dimension getDisplaySize() { return new Dimension(width, height); } public int[] getDisplayBuffer() { return rawImageData; } protected void dirtyDisplayRegion(int x, int y, int w, int h) { xmin = Math.min(x, xmin); xmax = Math.max(x + w, xmax); ymin = Math.min(y, ymin); ymax = Math.max(y + h, ymax); } public void paintPCMonitor(Graphics2D g, PCMonitor monitor) { Dimension s = monitor.getSize(); g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); g.drawImage(buffer, 0, 0, s.width, s.height, 0, 0, width, height, null); } public final void prepareUpdate() { xmin = width; xmax = 0; ymin = height; ymax = 0; } }