Attempting to simplify the color depth equations.

OSD drawing is not cooperating
This commit is contained in:
Arthur Moore 2015-03-12 07:59:38 -04:00
parent e8b8ee7bc2
commit 95c3f53c41
1 changed files with 18 additions and 67 deletions

View File

@ -992,7 +992,6 @@ DrawingPanel::DrawingPanel(int _width, int _height) :
iFilter->setHeight(height);
std::cerr << "width: " << width << " Height: " << height << std::endl;
#define out_16 (systemColorDepth == 16)
systemColorDepth = 32;
// Intialize color tables
@ -1133,18 +1132,11 @@ void DrawingPanel::DrawArea(u8 **data)
//The number of bytes per pixel, as determined by the systemColorDepth
int bytes_per_pixel = systemColorDepth/8;
int outrb = systemColorDepth == 24 ? 0 : 4;
int outstride = width * bytes_per_pixel * scale + outrb;
//Unfortunately, the filter keeps the border on the scaled output, but DOES NOT scale it
int horiz_bytes_out = (width)* bytes_per_pixel * scale+bytes_per_pixel;
if(!pixbuf2) {
int allocstride = outstride, alloch = height;
// gb may write borders, so allocate enough for them
if(width == GameArea::GBWidth && height == GameArea::GBHeight) {
allocstride = GameArea::SGBWidth * bytes_per_pixel * scale + outrb;
alloch = GameArea::SGBHeight;
}
pixbuf2 = (u8 *)calloc(allocstride, (alloch + 2) * scale);
pixbuf2 = (u8 *)calloc(horiz_bytes_out, (height + 2) * scale);
}
if(!myFilter->exists()) {
todraw = *data;
@ -1228,7 +1220,8 @@ void DrawingPanel::DrawArea(u8 **data)
if(1) {
GameArea *panel = wxGetApp().frame->GetPanel();
if(panel->osdstat.size())
drawText(todraw + outstride * (systemColorDepth != 24), outstride,
drawText(todraw+bytes_per_pixel* (systemColorDepth != 24)
, horiz_bytes_out,
10, 20, panel->osdstat.utf8_str(), gopts.osd_transparent);
if(!gopts.no_osd_status && !panel->osdtext.empty()) {
if(systemGetClock() - panel->osdtime < OSD_TIME) {
@ -1240,16 +1233,16 @@ void DrawingPanel::DrawArea(u8 **data)
while(nlines > 1) {
char lchar = ptr[linelen];
ptr[linelen] = 0;
drawText(todraw + outstride * (systemColorDepth != 24),
outstride, 10, cury, ptr,
drawText(todraw+bytes_per_pixel* (systemColorDepth != 24),
horiz_bytes_out, 10, cury, ptr,
gopts.osd_transparent);
cury += 10;
nlines--;
ptr += linelen;
*ptr = lchar;
}
drawText(todraw + outstride * (systemColorDepth != 24),
outstride, 10, cury, ptr,
drawText(todraw+bytes_per_pixel* (systemColorDepth != 24),
horiz_bytes_out, 10, cury, ptr,
gopts.osd_transparent);
} else
panel->osdtext.clear();
@ -1383,8 +1376,7 @@ BasicDrawingPanel::BasicDrawingPanel(wxWindow *parent, int _width, int _height)
: wxPanel(parent, wxID_ANY, wxPoint(0, 0), parent->GetSize(),
wxFULL_REPAINT_ON_RESIZE), DrawingPanel(_width, _height)
{
// wxImage is 24-bit RGB, so 24-bit is preferred. Filters require
// 16 or 32, though
// wxImage is 24-bit RGB, so 24-bit is preferred. Filters require 32, though
if(!myFilter->exists() && !iFilter->exists())
{
// changing from 32 to 24 does not require regenerating color tables
@ -1399,22 +1391,9 @@ void BasicDrawingPanel::DrawArea(wxWindowDC &dc)
// never scaled, no borders, no transformations needed
wxImage im(width, height, todraw, true);
bm = new wxBitmap(im);
} else if(out_16) {
// scaled by filters, top/right borders, transform to 24-bit
wxImage im(width * scale, height * scale, false);
u16 *src = (u16 *)todraw + (width + 2) * scale; // skip top border
u8 *dst = im.GetData();
for(int y = 0; y < height * scale; y++) {
for(int x = 0; x < width * scale; x++, src++) {
*dst++ = ((*src >> systemRedShift) & 0x1f) << 3;
*dst++ = ((*src >> systemGreenShift) & 0x1f) << 3;
*dst++ = ((*src >> systemBlueShift) & 0x1f) << 3;
}
src += 2; // skip rhs border
}
bm = new wxBitmap(im);
} else { // 32-bit
}
else
{ // 32-bit
// scaled by filters, top/right borders, transform to 24-bit
wxImage im(width * scale, height * scale, false);
u32 *src = (u32 *)todraw + (width + 1) * scale; // skip top border
@ -1428,7 +1407,7 @@ void BasicDrawingPanel::DrawArea(wxWindowDC &dc)
}
++src; // skip rhs border
}
bm = new wxBitmap(im);
bm = new wxBitmap(im);
}
double sx, sy;
int w, h;
@ -1533,9 +1512,8 @@ void GLDrawingPanel::Init()
gopts.bilinear ? GL_LINEAR : GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
gopts.bilinear ? GL_LINEAR : GL_NEAREST);
#define int_fmt out_16 ? GL_RGB5 : GL_RGB
#define tex_fmt out_16 ? GL_BGRA : GL_RGBA, \
out_16 ? GL_UNSIGNED_SHORT_1_5_5_5_REV : GL_UNSIGNED_BYTE
#define int_fmt GL_RGB
#define tex_fmt GL_RGBA, GL_UNSIGNED_BYTE
#if 0
texsize = width > height ? width : height;
texsize *= scale;
@ -1592,15 +1570,10 @@ void GLDrawingPanel::DrawArea(wxWindowDC &dc)
Init();
if(todraw) {
int rowlen = width * scale + (out_16 ? 2 : 1);
int rowlen = width * scale + 1;
glPixelStorei(GL_UNPACK_ROW_LENGTH, rowlen);
#if wxBYTE_ORDER == wxBIG_ENDIAN
// FIXME: is this necessary?
if(out_16)
glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_TRUE);
#endif
glTexImage2D(GL_TEXTURE_2D, 0, int_fmt, width * scale, height * scale,
0, tex_fmt, todraw + rowlen * (out_16 ? 2 : 4) * scale);
0, tex_fmt, todraw + rowlen * 4 * scale);
glCallList(vlist);
} else
glClear(GL_COLOR_BUFFER_BIT);
@ -1698,33 +1671,11 @@ void CairoDrawingPanel::DrawArea(wxWindowDC &dc)
#endif
#endif
cairo_surface_t *surf;
if(!out_16)
surf = cairo_image_surface_create_for_data(todraw + 4 * width,
CAIRO_FORMAT_RGB24,
width, height,
4 * (width + 1));
else {
if(!conv_surf)
conv_surf = cairo_image_surface_create(CAIRO_FORMAT_RGB24,
width * scale,
height * scale);
if(!conv_surf) {
wxLogError(_("Cannot create conversion buffer"));
wxGetApp().frame->Close(true);
}
surf = cairo_surface_reference(conv_surf);
u16 *src = (u16 *)todraw + (width + 2) * scale; // skip top border
u32 *dst = (u32 *)cairo_image_surface_get_data(surf);
for(int y = 0; y < height * scale; y++) {
for(int x = 0; x < width * scale; x++, src++) {
*dst++ = (((*src >> systemRedShift) & 0x1f) << 19) |
(((*src >> systemGreenShift) & 0x1f) << 11) |
(((*src >> systemBlueShift) & 0x1f) << 3);
}
src += 2; // skip rhs border
}
}
cairo_pattern_t *pat = cairo_pattern_create_for_surface(surf);
// GOOD is "similar to" bilinear, and FAST is "similar to" nearest
// could also just use BILINEAR and NEAREST directly, I suppose