package com.pixelutilitys.arcade.emulators.AEPgb;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.ColorModel;
import java.awt.image.IndexColorModel;
import java.awt.image.MemoryImageSource;
import java.awt.image.BufferedImage;
import java.awt.Graphics2D;
import javax.imageio.*;
import java.util.*;
import java.io.*;
/**
* PgbIndexedVideoOutput is a video output class that uses
* a java.awt.image.MemoryImageSource with an IndexColorModel
* to provide video output.
*
* The indexed nature allows it to use the memory from
* PgbVideo directly, but it is less accurate in some
* circumstances becasue it only changes palettes with
* vblank instead of every hblank.
*/
public final class PgbIndexedVideoOutput extends PgbVideoOutput {
Graphics graph;
MemoryImageSource mISrc;
Image mImg;
byte[] packedScreenPalette;
MemoryImageSource borderMISrc;
Image borderMImg;
ColorModel borderColorModel;
byte[] packedBorderPalette;
public void setGraphics()
{
graph = getGraphics();
}
public PgbIndexedVideoOutput(PgbVideo video) {
super(video);
// color model
packedScreenPalette = new byte[64 * 3];
mISrc = new MemoryImageSource(160, 144, new IndexColorModel(6, 64, packedScreenPalette, 0, false), video.getScreenMemory(), 0, 160);
mISrc.setAnimated(true);
mImg = createImage(mISrc);
packedBorderPalette = new byte[0x300];
borderColorModel = new IndexColorModel(8, 256, packedBorderPalette, 0, false);
//borderMISrc = new MemoryImageSource(256, 224, borderColorModel, borderPixels, 0, 256);
//borderMISrc.setAnimated(true);
//borderMImg = createImage(borderMISrc);
}
public void reset() {
}
public void hblank(int line) {
}
public void vblank() {
mISrc.newPixels(video.getScreenMemory(), getScreenColorModel(), 0, 160);
}
public void paint(Graphics g)
{
update(g);
}
public void makeScreenshot() {
Date now = new Date();
long nowLong = now.getTime();
int width = mImg.getWidth(this);
int height = mImg.getHeight(this);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D biContext = bi.createGraphics();
biContext.drawImage(mImg, 0, 0, null);
try {
ImageIO.write(bi, "png", new File("AEPgb-"+ nowLong+".png"));
} catch(IOException ex) {ex.printStackTrace();}
}
public void update(Graphics g) {
if(PgbSettings.sgbborder) {
g.drawImage(mImg, 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(mImg, 0, 0, 160 * PgbSettings.lcdsize, 144 * PgbSettings.lcdsize, this);
}
}
public ColorModel getScreenColorModel() {
if(PgbSettings.system == PgbSettings.SYS_GBC) {
for(byte i = 0; i < 64; i++) {
packedScreenPalette[i * 3 ] = video.getScreenRed(i);
packedScreenPalette[i * 3 + 1] = video.getScreenGreen(i);
packedScreenPalette[i * 3 + 2] = video.getScreenBlue(i);
}
return new IndexColorModel(6, 64, packedScreenPalette, 0, false);
}
// gb mono
for(byte i = 0; i < 12; i++) {
packedScreenPalette[i * 3 ] = video.getScreenRed(i);
packedScreenPalette[i * 3 + 1] = video.getScreenGreen(i);
packedScreenPalette[i * 3 + 2] = video.getScreenBlue(i);
}
return new IndexColorModel(4, 12, packedScreenPalette, 0, false);
}
}