Introduced video double-buffering (so that the render buffer is no longer the same as the interim buffer) and made SDL (Hardware) auto-hint the renderer per the suggestion and code by Agetian.

This commit is contained in:
OBattler
2019-12-06 03:50:54 +01:00
parent e9905a0806
commit 88b9978fae
10 changed files with 85 additions and 1161 deletions

View File

@@ -40,7 +40,7 @@
* W = 3 bus clocks
* L = 4 bus clocks
*
* Version: @(#)video.c 1.0.34 2019/10/20
* Version: @(#)video.c 1.0.35 2019/12/06
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
@@ -72,6 +72,7 @@
volatile int screenshots = 0;
bitmap_t *buffer32 = NULL;
bitmap_t *render_buffer = NULL;
uint8_t fontdat[2048][8]; /* IBM CGA font */
uint8_t fontdatm[2048][16]; /* IBM MDA font */
uint8_t fontdatw[512][32]; /* Wyse700 font */
@@ -381,10 +382,7 @@ video_take_screenshot(const wchar_t *fn, int startx, int starty, int w, int h)
for (y = 0; y < h; ++y) {
b_rgb[y] = (png_byte *) malloc(png_get_rowbytes(png_ptr, info_ptr));
for (x = 0; x < w; ++x) {
if (video_grayscale || invert_display)
video_transform_copy(&temp, &(buffer32->line[y + starty][x + startx]), 1);
else
temp = buffer32->line[y + starty][x + startx];
temp = render_buffer->line[y + starty][x + startx];
b_rgb[y][(x) * 3 + 0] = (temp >> 16) & 0xff;
b_rgb[y][(x) * 3 + 1] = (temp >> 8) & 0xff;
@@ -433,11 +431,37 @@ video_screenshot(int x, int y, int w, int h)
}
static void
video_transform_copy(uint32_t *dst, uint32_t *src, int len)
{
int i;
for (i = 0; i < len; i++) {
*dst = video_color_transform(*src);
dst++;
src++;
}
}
void
video_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h)
{
int yy;
if ((w > 0) && (h > 0)) {
for (yy = 0; yy < h; yy++) {
if (((y + yy) >= 0) && ((y + yy) < buffer32->h)) {
if (video_grayscale || invert_display)
video_transform_copy(&(render_buffer->line[y + yy][x]), &(buffer32->line[y + yy][x]), w);
else
memcpy(&(render_buffer->line[y + yy][x]), &(buffer32->line[y + yy][x]), w << 2);
}
}
}
if (screenshots) {
if (buffer32 != NULL)
if (render_buffer != NULL)
video_screenshot(x, y, w, h);
screenshots--;
video_log("screenshot taken, %i left\n", screenshots);
@@ -520,17 +544,15 @@ video_blit_memtoscreen_8(int x, int y, int y1, int y2, int w, int h)
{
int yy, xx;
if (h <= 0) return;
for (yy = 0; yy < h; yy++)
{
if ((y + yy) >= 0 && (y + yy) < buffer32->h)
{
for (xx = 0; xx < w; xx++) {
if (buffer32->line[y + yy][x + xx] <= 0xff)
buffer32->line[y + yy][x + xx] = pal_lookup[buffer32->line[y + yy][x + xx]];
else
buffer32->line[y + yy][x + xx] = 0x00000000;
if ((w > 0) && (h > 0)) {
for (yy = 0; yy < h; yy++) {
if ((y + yy) >= 0 && (y + yy) < buffer32->h) {
for (xx = 0; xx < w; xx++) {
if (buffer32->line[y + yy][x + xx] <= 0xff)
buffer32->line[y + yy][x + xx] = pal_lookup[buffer32->line[y + yy][x + xx]];
else
buffer32->line[y + yy][x + xx] = 0x00000000;
}
}
}
}
@@ -555,7 +577,7 @@ cgapal_rebuild(void)
if ((cga_palette > 1) && (cga_palette < 8)) {
if (vid_cga_contrast != 0) {
for (c=0; c<16; c++) {
for (c = 0; c < 16; c++) {
pal_lookup[c] = makecol(video_6to8[cgapal_mono[cga_palette - 2][c].r],
video_6to8[cgapal_mono[cga_palette - 2][c].g],
video_6to8[cgapal_mono[cga_palette - 2][c].b]);
@@ -570,7 +592,7 @@ cgapal_rebuild(void)
video_6to8[cgapal_mono[cga_palette - 2][c].b]);
}
} else {
for (c=0; c<16; c++) {
for (c = 0; c < 16; c++) {
pal_lookup[c] = makecol(video_6to8[cgapal_mono[cga_palette - 1][c].r],
video_6to8[cgapal_mono[cga_palette - 1][c].g],
video_6to8[cgapal_mono[cga_palette - 1][c].b]);
@@ -788,8 +810,8 @@ video_init(void)
}
/* Account for overscan. */
// buffer32 = create_bitmap(2048 + 64, 2048 + 64);
buffer32 = create_bitmap(4096 + 64, 4096 + 64);
buffer32 = create_bitmap(2048 + 64, 2048 + 64);
render_buffer = create_bitmap(2048 + 64, 2048 + 64);
for (c = 0; c < 64; c++) {
cgapal[c + 64].r = (((c & 4) ? 2 : 0) | ((c & 0x10) ? 1 : 0)) * 21;
@@ -855,6 +877,7 @@ video_close(void)
free(video_8togs);
free(video_6to8);
destroy_bitmap(render_buffer);
destroy_bitmap(buffer32);
if (fontdatksc5601) {
@@ -1039,15 +1062,3 @@ video_color_transform(uint32_t color)
color ^= 0x00ffffff;
return color;
}
void
video_transform_copy(uint32_t *dst, uint32_t *src, int len)
{
int i;
for (i = 0; i < len; i++) {
*dst = video_color_transform(*src);
dst++;
src++;
}
}

View File

@@ -8,15 +8,15 @@
*
* Definitions for the video controller module.
*
* Version: @(#)video.h 1.0.36 2018/10/28
* Version: @(#)video.h 1.0.37 2019/12/06
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Miran Grca, <mgrca8@gmail.com>
* Fred N. van Kempen, <decwiz@yahoo.com>
*
* Copyright 2008-2018 Sarah Walker.
* Copyright 2016-2018 Miran Grca.
* Copyright 2017,2018 Fred N. van Kempen.
* Copyright 2008-2019 Sarah Walker.
* Copyright 2016-2019 Miran Grca.
* Copyright 2017-2019 Fred N. van Kempen.
*/
#ifndef EMU_VIDEO_H
# define EMU_VIDEO_H
@@ -84,7 +84,7 @@ extern int egareads,
extern int changeframecount;
extern volatile int screenshots;
extern bitmap_t *buffer32;
extern bitmap_t *buffer32, *render_buffer;
extern PALETTE cgapal,
cgapal_mono[6];
extern uint32_t pal_lookup[256];
@@ -184,7 +184,6 @@ extern void svga_dump_vram(void);
#endif
extern uint32_t video_color_transform(uint32_t color);
extern void video_transform_copy(uint32_t *dst, uint32_t *src, int len);
#ifdef __cplusplus
}