package com.pixelutilitys.arcade.emulators.AEPgb;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.MemoryImageSource;
import java.applet.Applet;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import javax.imageio.ImageIO;
/**
* PgbDirectVideoOutput uses a java.awt.image.MemoryImageSource
* with the default RGBColorModel to provide video output.
*/
public class PgbDirectVideoOutput extends PgbVideoOutput {
Graphics graph;
MemoryImageSource screenMISrc;
Image screenMImg;
int[] screenMemory;
MemoryImageSource borderMISrc;
Image borderMImg;
int[] borderMemory;
public void setGraphics()
{
graph = getGraphics();
}
public PgbDirectVideoOutput(PgbVideo video, Applet a) {
super(video);
System.out.println("applet video!");
screenMemory = new int[160 * 144];
screenMISrc = new MemoryImageSource(160, 144, screenMemory, 0, 160);
screenMISrc.setAnimated(true);
screenMImg = a.createImage(screenMISrc);
}
public PgbDirectVideoOutput(PgbVideo video) {
super(video);
// color model
screenMemory = new int[160 * 144];
screenMISrc = new MemoryImageSource(160, 144, screenMemory, 0, 160);
screenMISrc.setAnimated(true);
screenMImg = createImage(screenMISrc);
borderMemory = new int[256 * 224];
borderMISrc = new MemoryImageSource(256, 224, borderMemory, 0, 256);
borderMISrc.setAnimated(true);
borderMImg = createImage(borderMISrc);
}
public void reset() {
}
public void hblank(int line) {
int i, offset;
offset = line * 160;
for(i = 0; i < 160; i++) {
screenMemory[offset + i] = video.getScreenColor(video.getScreenMemory(line * 160 + i));
}
}
public void vblank() {
screenMISrc.newPixels();
}
public void paint(Graphics g) {
update(g);
}
public void update(Graphics g) {
//TODO - update stuff in ere
if(PgbSettings.sgbborder) {
g.drawImage(screenMImg, 48 * PgbSettings.lcdsize, 40 * PgbSettings.lcdsize, 160 * PgbSettings.lcdsize, 144 * PgbSettings.lcdsize, this);
//g.drawImage(borderMImg, 0, 0, 256 * PgbSettings.lcdsize, 224 * PgbSettings.lcdsize, this);
// don't trust the border transparency
g.drawImage(borderMImg, 0, 0, 256 * PgbSettings.lcdsize, 40 * PgbSettings.lcdsize, 0, 0, 256, 40, this);
g.drawImage(borderMImg, 0, 40 * PgbSettings.lcdsize, 48 * PgbSettings.lcdsize, 184 * PgbSettings.lcdsize, 0, 40, 48, 184, this);
g.drawImage(borderMImg, 208 * PgbSettings.lcdsize, 40 * PgbSettings.lcdsize, 256 * PgbSettings.lcdsize, 184 * PgbSettings.lcdsize, 208, 40, 256, 184, this);
g.drawImage(borderMImg, 0, 184 * PgbSettings.lcdsize, 256 * PgbSettings.lcdsize, 224 * PgbSettings.lcdsize, 0, 184, 256, 224, this);
} else {
g.drawImage(screenMImg, 0, 0, 160 * PgbSettings.lcdsize, 144 * PgbSettings.lcdsize, this);
}
if(super.tempGraphics == null)
super.tempGraphics = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
super.tempGraphics.getGraphics().drawImage(screenMImg, 0, 0, 256, 256, this);
}
public void makeScreenshot() {
Date now = new Date();
long nowLong = now.getTime();
int width = screenMImg.getWidth(this);
int height = screenMImg.getHeight(this);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D biContext = bi.createGraphics();
biContext.drawImage(screenMImg, 0, 0, null);
try {
ImageIO.write(bi, "png", new File("AEPgb-" + nowLong+".png"));
} catch(IOException ex) {ex.printStackTrace();}
}
}