Fixed auto scaling and added X8 on Linux

Closes #51
Closes #52
This commit is contained in:
Daniel Collin 2018-05-05 15:14:57 +02:00
parent a48cffc2ac
commit 26e6eca208
2 changed files with 44 additions and 3 deletions

View file

@ -515,6 +515,41 @@ static void scale_4x(unsigned int* dest, unsigned int* source, int width, int he
} }
} }
#define write_8(offset) \
dest[(width * offset) + 0] = t; \
dest[(width * offset) + 1] = t; \
dest[(width * offset) + 2] = t; \
dest[(width * offset) + 3] = t; \
dest[(width * offset) + 4] = t; \
dest[(width * offset) + 5] = t; \
dest[(width * offset) + 6] = t; \
dest[(width * offset) + 7] = t;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static void scale_8x(unsigned int* dest, unsigned int* source, int width, int height, int scale) {
int x, y;
for (y = 0; y < height; y += scale) {
for (x = 0; x < width; x += scale) {
const unsigned int t = *source++;
write_8(0);
write_8(1);
write_8(2);
write_8(3);
write_8(4);
write_8(5);
write_8(6);
write_8(7);
dest += scale;
}
dest += width * (scale - 1);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void mfb_update_with_buffer(void* window_info, void* buffer) void mfb_update_with_buffer(void* window_info, void* buffer)
@ -539,6 +574,11 @@ void mfb_update_with_buffer(void* window_info, void* buffer)
scale_4x(info->draw_buffer, buffer, width, height, scale); scale_4x(info->draw_buffer, buffer, width, height, scale);
break; break;
} }
case 8: {
scale_8x(info->draw_buffer, buffer, width, height, scale);
break;
}
} }
XPutImage(s_display, info->window, s_gc, info->ximage, 0, 0, 0, 0, width, height); XPutImage(s_display, info->window, s_gc, info->ximage, 0, 0, 0, 0, width, height);

View file

@ -374,6 +374,7 @@ impl Window {
Scale::X1 => 1, Scale::X1 => 1,
Scale::X2 => 2, Scale::X2 => 2,
Scale::X4 => 4, Scale::X4 => 4,
Scale::X8 => 8,
Scale::FitScreen => { Scale::FitScreen => {
let wh: u32 = mfb_get_screen_size(); let wh: u32 = mfb_get_screen_size();
let screen_x = (wh >> 16) as i32; let screen_x = (wh >> 16) as i32;
@ -387,15 +388,15 @@ impl Window {
let w = width as i32 * (scale + 1); let w = width as i32 * (scale + 1);
let h = height as i32 * (scale + 1); let h = height as i32 * (scale + 1);
if w > screen_x || h > screen_y { if w >= screen_x || h >= screen_y {
break; break;
} }
scale *= 2; scale *= 2;
} }
if scale >= 4 { if scale >= 8 {
4 8
} else { } else {
scale scale
} }