mirror of
https://github.com/Interlisp/maiko.git
synced 2026-04-27 20:58:44 +00:00
When updating the window surface directly, at scale 1, avoid the intermediate buffer
Adds an sdl_blt_to_window_surface() that goes directly from the Lisp bitmap to the window surface avoiding the intermediate copy. This is only coded for a scale factor of 1. Uses the intermediate buffer if the scale is not 1. Corrects an error where the damage rectangle was not properly reset.
This commit is contained in:
48
src/sdl.c
48
src/sdl.c
@@ -385,6 +385,39 @@ void sdl_bitblt_to_screen(int _x, int _y, int _w, int _h) {
|
|||||||
int after = SDL_GetTicks();
|
int after = SDL_GetTicks();
|
||||||
// printf("bitblting took %dms\n", after - before);
|
// printf("bitblting took %dms\n", after - before);
|
||||||
}
|
}
|
||||||
|
void sdl_bitblt_to_window_surface(int _x, int _y, int _w, int _h) {
|
||||||
|
// printf("bitblt(%d, %d, %d, %d)\n", _x, _y, _w, _h);
|
||||||
|
Uint32 *dr = (Uint32*)DisplayRegion68k;
|
||||||
|
|
||||||
|
int before = SDL_GetTicks();
|
||||||
|
int width = sdl_displaywidth;
|
||||||
|
int height = sdl_displayheight;
|
||||||
|
int bpw = 8 * sizeof(Uint32);
|
||||||
|
int pitch = sdl_displaywidth / bpw;
|
||||||
|
int xlimit = (_x + _w + bpw - 1) / bpw;
|
||||||
|
int ylimit = _y + _h;
|
||||||
|
for(int y = _y; y < ylimit; y++) {
|
||||||
|
for(int x = _x / bpw; x < xlimit; x++) {
|
||||||
|
int w = dr[y * pitch + x];
|
||||||
|
int thex = x * bpw;
|
||||||
|
for(int b = 0; b < bpw; b++) {
|
||||||
|
//printf("%d/%d %d\n", x, y, b);
|
||||||
|
uint32_t px = 0;
|
||||||
|
if(w & (1 << (bpw - 1 - b))) {
|
||||||
|
px = do_invert ? sdl_white : sdl_black;
|
||||||
|
} else {
|
||||||
|
px = do_invert ? sdl_black : sdl_white;
|
||||||
|
}
|
||||||
|
//printf("px is %x\n", px);
|
||||||
|
int pxindex = (y * sdl_displaywidth) + thex + b;
|
||||||
|
assert(pxindex >= 0 && pxindex < buffer_size);
|
||||||
|
((Uint32 *)sdl_windowsurface->pixels)[pxindex] = px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int after = SDL_GetTicks();
|
||||||
|
// printf("bitblting took %dms\n", after - before);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
static int map_key(SDL_Keycode k) {
|
static int map_key(SDL_Keycode k) {
|
||||||
for(int i = 0; keymap[i] != -1; i+= 2) {
|
for(int i = 0; keymap[i] != -1; i+= 2) {
|
||||||
@@ -528,16 +561,13 @@ void sdl_update_display_surfaces() {
|
|||||||
if (!should_update_texture || this_draw - last_draw <= 16) {
|
if (!should_update_texture || this_draw - last_draw <= 16) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
before = SDL_GetTicks();
|
|
||||||
sdl_bitblt_to_screen(min_x, min_y, max_x - min_x, max_y - min_y);
|
|
||||||
after = SDL_GetTicks();
|
|
||||||
SDL_Rect r;
|
SDL_Rect r;
|
||||||
r.x = min_x;
|
r.x = min_x;
|
||||||
r.y = min_y;
|
r.y = min_y;
|
||||||
r.w = max_x - min_x;
|
r.w = max_x - min_x;
|
||||||
r.h = max_y - min_y;
|
r.h = max_y - min_y;
|
||||||
if (sdl_pixelscale == 1) {
|
if (sdl_pixelscale == 1) {
|
||||||
SDL_BlitSurface(sdl_buffersurface, &r, sdl_windowsurface, &r);
|
sdl_bitblt_to_window_surface(r.x, r.y, r.w, r.h);
|
||||||
SDL_UpdateWindowSurfaceRects(sdl_window, &r, 1);
|
SDL_UpdateWindowSurfaceRects(sdl_window, &r, 1);
|
||||||
} else {
|
} else {
|
||||||
SDL_Rect s;
|
SDL_Rect s;
|
||||||
@@ -545,13 +575,15 @@ void sdl_update_display_surfaces() {
|
|||||||
s.y = r.y * sdl_pixelscale;
|
s.y = r.y * sdl_pixelscale;
|
||||||
s.w = r.w * sdl_pixelscale;
|
s.w = r.w * sdl_pixelscale;
|
||||||
s.h = r.h * sdl_pixelscale;
|
s.h = r.h * sdl_pixelscale;
|
||||||
|
sdl_bitblt_to_screen(r.x, r.y, r.w, r.h);
|
||||||
SDL_BlitScaled(sdl_buffersurface, &r, sdl_windowsurface, &s);
|
SDL_BlitScaled(sdl_buffersurface, &r, sdl_windowsurface, &s);
|
||||||
SDL_UpdateWindowSurfaceRects(sdl_window, &s, 1);
|
SDL_UpdateWindowSurfaceRects(sdl_window, &s, 1);
|
||||||
}
|
}
|
||||||
min_x = 0;
|
min_x = sdl_displaywidth;
|
||||||
max_x = sdl_displaywidth;
|
max_x = 0;
|
||||||
min_y = 0;
|
min_y = sdl_displayheight;
|
||||||
max_y = sdl_displayheight;
|
max_y = 0;
|
||||||
|
should_update_texture = 0;
|
||||||
after = SDL_GetTicks();
|
after = SDL_GetTicks();
|
||||||
last_draw = this_draw;
|
last_draw = this_draw;
|
||||||
// printf("surface update took %dms\n", after - before);
|
// printf("surface update took %dms\n", after - before);
|
||||||
|
|||||||
Reference in New Issue
Block a user