mirror of https://github.com/bsnes-emu/bsnes.git
81 lines
2.3 KiB
C++
81 lines
2.3 KiB
C++
Video video;
|
|
|
|
Video::Video() {
|
|
output = new uint32[224 * 224];
|
|
paletteLiteral = new uint32[1 << 12];
|
|
paletteStandard = new uint32[1 << 12];
|
|
paletteEmulation = new uint32[1 << 12];
|
|
}
|
|
|
|
auto Video::power() -> void {
|
|
memory::fill(output(), 224 * 224 * sizeof(uint32));
|
|
|
|
for(uint12 color : range(1 << 12)) {
|
|
paletteLiteral[color] = color;
|
|
|
|
uint b = color.bits(0, 3);
|
|
uint g = color.bits(4, 7);
|
|
uint r = color.bits(8,11);
|
|
|
|
uint R = image::normalize(r, 4, 16);
|
|
uint G = image::normalize(g, 4, 16);
|
|
uint B = image::normalize(b, 4, 16);
|
|
paletteStandard[color] = interface->videoColor(R, G, B);
|
|
|
|
//todo: this uses the Game Boy Advance color emulation algorithm
|
|
//need to determine proper color emulation for WonderSwan systems
|
|
R = (r * 26 + g * 4 + b * 2);
|
|
G = ( g * 24 + b * 8);
|
|
B = (r * 6 + g * 4 + b * 22);
|
|
R = image::normalize(min(480, R), 9, 16);
|
|
G = image::normalize(min(480, G), 9, 16);
|
|
B = image::normalize(min(480, B), 9, 16);
|
|
paletteEmulation[color] = interface->videoColor(R, G, B);
|
|
}
|
|
}
|
|
|
|
auto Video::refresh() -> void {
|
|
auto& palette = settings.colorEmulation ? paletteEmulation : paletteStandard;
|
|
|
|
if(system.orientation() == 0) {
|
|
for(uint y = 0; y < 224; y++) {
|
|
auto target = output() + y * 224;
|
|
if(y < 40 || y >= 184) {
|
|
memory::fill(target, 224 * sizeof(uint32));
|
|
continue;
|
|
}
|
|
auto source = ppu.output + (y - 40) * 224;
|
|
for(uint x = 0; x < 224; x++) {
|
|
auto color = palette[*source++];
|
|
if(settings.blurEmulation) {
|
|
auto a = color, b = *target;
|
|
*target++ = (a + b - ((a ^ b) & 0x01010101)) >> 1;
|
|
} else {
|
|
*target++ = color;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(system.orientation() == 1) {
|
|
for(uint y = 0; y < 224; y++) {
|
|
auto target = output() + y * 224;
|
|
memory::fill(target, 40 * sizeof(uint32));
|
|
memory::fill(target + 184, 40 * sizeof(uint32));
|
|
target += 40;
|
|
for(uint x = 0; x < 144; x++) {
|
|
auto source = ppu.output + x * 224 + (223 - y);
|
|
auto color = palette[*source];
|
|
if(settings.blurEmulation) {
|
|
auto a = color, b = *target;
|
|
*target++ = (a + b - ((a ^ b) & 0x01010101)) >> 1;
|
|
} else {
|
|
*target++ = color;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
interface->videoRefresh(output(), 224 * sizeof(uint32), 224, 224);
|
|
}
|