mirror of https://github.com/bsnes-emu/bsnes.git
133 lines
3.3 KiB
C++
133 lines
3.3 KiB
C++
|
//2xSaI / Super 2xSaI / Super Eagle filter
|
||
|
//authors: kode54 and Kreed
|
||
|
//license: GPL
|
||
|
|
||
|
#include "2xsai.hpp"
|
||
|
#include "implementation.cpp"
|
||
|
|
||
|
//=====
|
||
|
//2xSaI
|
||
|
//=====
|
||
|
|
||
|
void _2xSaIFilter::size(unsigned &outwidth, unsigned &outheight, unsigned width, unsigned height) {
|
||
|
outwidth = width;
|
||
|
outheight = height;
|
||
|
|
||
|
if(width <= 256 && height <= 240) {
|
||
|
outwidth *= 2;
|
||
|
outheight *= 2;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void _2xSaIFilter::render(
|
||
|
uint32_t *output, unsigned outpitch,
|
||
|
const uint16_t *input, unsigned pitch, unsigned width, unsigned height
|
||
|
) {
|
||
|
if(width > 256 || height > 240) {
|
||
|
filter_direct.render(output, outpitch, input, pitch, width, height);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
for(unsigned y = 0; y < height; y++) {
|
||
|
const uint16_t *line_in = (const uint16_t *) (((const uint8_t*)input) + pitch * y);
|
||
|
uint32_t *line_out = temp + y * 256;
|
||
|
for(unsigned x = 0; x < width; x++) {
|
||
|
line_out[x] = colortable[line_in[x]];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_2xSaI32( (unsigned char *) temp, 1024, 0, (unsigned char *) output, outpitch, width, height );
|
||
|
}
|
||
|
|
||
|
_2xSaIFilter::_2xSaIFilter() {
|
||
|
temp = new uint32_t[256*240];
|
||
|
}
|
||
|
|
||
|
_2xSaIFilter::~_2xSaIFilter() {
|
||
|
delete[] temp;
|
||
|
}
|
||
|
|
||
|
//===========
|
||
|
//Super 2xSaI
|
||
|
//===========
|
||
|
|
||
|
void Super2xSaIFilter::size(unsigned &outwidth, unsigned &outheight, unsigned width, unsigned height) {
|
||
|
outwidth = width;
|
||
|
outheight = height;
|
||
|
|
||
|
if(width <= 256 && height <= 240) {
|
||
|
outwidth *= 2;
|
||
|
outheight *= 2;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Super2xSaIFilter::render(
|
||
|
uint32_t *output, unsigned outpitch,
|
||
|
const uint16_t *input, unsigned pitch, unsigned width, unsigned height
|
||
|
) {
|
||
|
if(width > 256 || height > 240) {
|
||
|
filter_direct.render(output, outpitch, input, pitch, width, height);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
for(unsigned y = 0; y < height; y++) {
|
||
|
const uint16_t *line_in = (const uint16_t *) (((const uint8_t*)input) + pitch * y);
|
||
|
uint32_t *line_out = temp + y * 256;
|
||
|
for(unsigned x = 0; x < width; x++) {
|
||
|
line_out[x] = colortable[line_in[x]];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Super2xSaI32( (unsigned char *) temp, 1024, 0, (unsigned char *) output, outpitch, width, height );
|
||
|
}
|
||
|
|
||
|
Super2xSaIFilter::Super2xSaIFilter() {
|
||
|
temp = new uint32_t[256*240];
|
||
|
}
|
||
|
|
||
|
Super2xSaIFilter::~Super2xSaIFilter() {
|
||
|
delete[] temp;
|
||
|
}
|
||
|
|
||
|
//===========
|
||
|
//Super Eagle
|
||
|
//===========
|
||
|
|
||
|
void SuperEagleFilter::size(unsigned &outwidth, unsigned &outheight, unsigned width, unsigned height) {
|
||
|
outwidth = width;
|
||
|
outheight = height;
|
||
|
|
||
|
if(width <= 256 && height <= 240) {
|
||
|
outwidth *= 2;
|
||
|
outheight *= 2;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void SuperEagleFilter::render(
|
||
|
uint32_t *output, unsigned outpitch,
|
||
|
const uint16_t *input, unsigned pitch, unsigned width, unsigned height
|
||
|
) {
|
||
|
if(width > 256 || height > 240) {
|
||
|
filter_direct.render(output, outpitch, input, pitch, width, height);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
for(unsigned y = 0; y < height; y++) {
|
||
|
const uint16_t *line_in = (const uint16_t *) (((const uint8_t*)input) + pitch * y);
|
||
|
uint32_t *line_out = temp + y * 256;
|
||
|
for(unsigned x = 0; x < width; x++) {
|
||
|
line_out[x] = colortable[line_in[x]];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
SuperEagle32( (unsigned char *) temp, 1024, 0, (unsigned char *) output, outpitch, width, height );
|
||
|
}
|
||
|
|
||
|
SuperEagleFilter::SuperEagleFilter() {
|
||
|
temp = new uint32_t[256*240];
|
||
|
}
|
||
|
|
||
|
SuperEagleFilter::~SuperEagleFilter() {
|
||
|
delete[] temp;
|
||
|
}
|