mirror of
https://github.com/Interlisp/maiko.git
synced 2026-02-27 00:59:46 +00:00
Only bitblt on damage.
Also add an alternative for key handling, which does not work any better...
This commit is contained in:
@@ -43,6 +43,10 @@ extern DLword *DISP_MAX_Address;
|
||||
#define DISPLAYBUFFER
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
#define DISPLAYBUFFER
|
||||
#endif /* SDL */
|
||||
|
||||
#ifdef DOS
|
||||
#define DISPLAYBUFFER
|
||||
#endif /* DOS */
|
||||
|
||||
19
src/bbtsub.c
19
src/bbtsub.c
@@ -470,6 +470,10 @@ do_it_now:
|
||||
if (in_display_segment(dstbase)) flush_display_region(dx, dty, w, h);
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
if (in_display_segment(dstbase)) flush_display_region(dx, dty, w, h);
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef DOS
|
||||
/* Copy the changed section of display bank to the frame buffer */
|
||||
if (in_display_segment(dstbase)) {
|
||||
@@ -823,6 +827,10 @@ do_it_now:
|
||||
if (in_display_segment(dstbase)) flush_display_region(dlx, dty, width, height);
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
if (in_display_segment(dstbase)) flush_display_region(dlx, dty, width, height);
|
||||
#endif /* SDL */
|
||||
|
||||
#ifdef DOS
|
||||
/* Copy the changed section of display bank to the frame buffer */
|
||||
if (in_display_segment(dstbase)) {
|
||||
@@ -1070,6 +1078,10 @@ do_it_now:
|
||||
if (in_display_segment(dstbase)) flush_display_region(left, dty, width, height);
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
if (in_display_segment(dstbase)) flush_display_region(left, dty, width, height);
|
||||
#endif /* SDL */
|
||||
|
||||
#ifdef DOS
|
||||
/* Copy the changed section of display bank to the frame buffer */
|
||||
if (in_display_segment(dstbase)) {
|
||||
@@ -1199,6 +1211,10 @@ void bltchar(LispPTR *args)
|
||||
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
|
||||
#endif /* SDL */
|
||||
|
||||
#ifdef DOS
|
||||
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
|
||||
#endif /* DOS */
|
||||
@@ -1415,6 +1431,9 @@ void newbltchar(LispPTR *args) {
|
||||
#ifdef XWINDOW
|
||||
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
|
||||
#endif /* XWINDOW */
|
||||
#ifdef SDL
|
||||
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
|
||||
#endif /* SDL */
|
||||
#ifdef DOS
|
||||
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
|
||||
#endif /* DOS */
|
||||
|
||||
@@ -261,8 +261,11 @@ in_display_segment(baseaddr)
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
<<<<<<< HEAD
|
||||
void flush_display_buffer(void) {
|
||||
|
||||
#ifdef SDL
|
||||
sdl_bitblt_to_screen(0, 0, sdl_displaywidth, sdl_displayheight);
|
||||
#endif
|
||||
#ifdef XWINDOW
|
||||
(currentdsp->bitblt_to_screen)(currentdsp, DisplayRegion68k, currentdsp->Visible.x,
|
||||
currentdsp->Visible.y, currentdsp->Visible.width,
|
||||
@@ -290,7 +293,10 @@ void flush_display_buffer(void) {
|
||||
/************************************************************************/
|
||||
void flush_display_region(int x, int y, int w, int h)
|
||||
{
|
||||
|
||||
// printf("flush_display_region %d %d %d %d\n", x, y, w, h);
|
||||
#ifdef SDL
|
||||
sdl_bitblt_to_screen(x, y, w, h);
|
||||
#endif
|
||||
#if (defined(XWINDOW) || defined(DOS))
|
||||
TPRINT(("Enter flush_display_region x=%d, y=%d, w=%d, h=%d\n", x, y, w, h));
|
||||
(currentdsp->bitblt_to_screen)(currentdsp, DisplayRegion68k, x, y, w, h);
|
||||
@@ -333,7 +339,10 @@ void flush_display_lineregion(UNSIGNED x, DLword *ybase, int w, int h)
|
||||
{
|
||||
int y;
|
||||
y = ((DLword *)ybase - DisplayRegion68k) / DLWORD_PERLINE;
|
||||
|
||||
// printf("flush_display_lineregion %d %d %d %d\n", x, y, w, h);
|
||||
#ifdef SDL
|
||||
sdl_bitblt_to_screen(x, y, w, h);
|
||||
#endif
|
||||
#if (defined(XWINDOW) || defined(DOS))
|
||||
TPRINT(("Enter flush_display_lineregion x=%p, y=%d, w=%d, h=%d\n", (void *)x, y, w, h));
|
||||
(currentdsp->bitblt_to_screen)(currentdsp, DisplayRegion68k, x, y, w, h);
|
||||
@@ -364,7 +373,10 @@ void flush_display_ptrregion(DLword *ybase, UNSIGNED bitoffset, int w, int h)
|
||||
baseoffset = (((DLword *)ybase) - DisplayRegion68k);
|
||||
y = baseoffset / DLWORD_PERLINE;
|
||||
x = bitoffset + (BITSPERWORD * (baseoffset - (DLWORD_PERLINE * y)));
|
||||
|
||||
// printf("flush_display_ptrregion %d %d %d %d\n", x, y, w, h);
|
||||
#ifdef SDL
|
||||
sdl_bitblt_to_screen(x, y, w, h);
|
||||
#endif
|
||||
#if (defined(XWINDOW) || defined(DOS))
|
||||
TPRINT(("Enter flush_display_ptrregion\n x=%d, y=%d, w=%d, h=%d\n", x, y, w, h));
|
||||
(currentdsp->bitblt_to_screen)(currentdsp, DisplayRegion68k, x, y, w, h);
|
||||
|
||||
76
src/sdl.c
76
src/sdl.c
@@ -125,7 +125,7 @@ int sdl_windowheight = 0;
|
||||
// each pixel is shown as this many pixels
|
||||
int sdl_pixelscale = 0;
|
||||
|
||||
extern char *DisplayRegion68k;
|
||||
extern Uint32 *DisplayRegion68k;
|
||||
|
||||
|
||||
extern DLword *EmKbdAd068K, *EmKbdAd168K, *EmKbdAd268K, *EmKbdAd368K, *EmKbdAd468K, *EmKbdAd568K,
|
||||
@@ -201,13 +201,14 @@ void set_pixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
|
||||
+ x * surface->format->BytesPerPixel);
|
||||
*target_pixel = pixel;
|
||||
}
|
||||
void sdl_bitblt_to_screen(uint32_t *source) {
|
||||
void sdl_bitblt_to_screen(int _x, int _y, int _w, int _h) {
|
||||
// printf("bitblting\n");
|
||||
int width = sdl_displaywidth;
|
||||
int height = sdl_displayheight;
|
||||
int bpw = 32;
|
||||
for(int y = 0; y < height; y++) {
|
||||
for(int x = 0; x < width / bpw; x++) {
|
||||
int w = source[y*(sdl_displaywidth/bpw) + x];
|
||||
for(int y = _y; y < _y + _h; y++) {
|
||||
for(int x = _x / bpw; x < (_x + _w + bpw - 1) / bpw; x++) {
|
||||
int w = DisplayRegion68k[y*(sdl_displaywidth/bpw) + x];
|
||||
for(int b = 0; b < bpw; b++) {
|
||||
//printf("%d/%d %d\n", x, y, b);
|
||||
int px = 0;
|
||||
@@ -222,6 +223,7 @@ void sdl_bitblt_to_screen(uint32_t *source) {
|
||||
}
|
||||
}
|
||||
}
|
||||
SDL_UpdateTexture(sdl_texture, NULL, buffer, sdl_displaywidth * sizeof(Uint32));
|
||||
}
|
||||
int map_key(SDL_Keycode k) {
|
||||
for(int i = 0; keymap[i] != -1; i+= 2) {
|
||||
@@ -288,6 +290,28 @@ static int min(int a, int b) {
|
||||
return a;
|
||||
return b;
|
||||
}
|
||||
static int last_draw = 0;
|
||||
static int last_keystate[512] = { 0 };
|
||||
/* void handle_keyboard() { */
|
||||
/* SDL_PumpEvents(); */
|
||||
/* int numkeys; */
|
||||
/* const Uint8 *keystates = SDL_GetKeyboardState(&numkeys); */
|
||||
/* for(int i = 0; keymap[i] != -1; i+= 2) { */
|
||||
/* int keycode = keymap[i+1]; */
|
||||
/* int lk = keymap[i]; */
|
||||
/* int scancode = SDL_GetScancodeFromKey(keycode); */
|
||||
/* if(scancode < numkeys) { */
|
||||
/* int state = keystates[scancode]; */
|
||||
/* if(state != last_keystate[scancode]) { */
|
||||
/* printf("lk %d scancode %d %s <%s>\n", lk, scancode, state ? "pressed" : "released", SDL_GetKeyName(keycode)); */
|
||||
/* kb_trans(lk - KEYCODE_OFFSET, state ? FALSE : TRUE); */
|
||||
/* DoRing(); */
|
||||
/* if ((KBDEventFlg += 1) > 0) Irq_Stk_End = Irq_Stk_Check = 0; */
|
||||
/* } */
|
||||
/* last_keystate[scancode] = state; */
|
||||
/* } */
|
||||
/* } */
|
||||
/* } */
|
||||
void process_SDLevents() {
|
||||
SDL_Event event;
|
||||
while(SDL_PollEvent(&event)) {
|
||||
@@ -365,25 +389,29 @@ void process_SDLevents() {
|
||||
printf("other event type: %d\n", event.type);
|
||||
}
|
||||
}
|
||||
int before = SDL_GetTicks();
|
||||
sdl_bitblt_to_screen(DisplayRegion68k);
|
||||
int after = SDL_GetTicks();
|
||||
// printf("blitting took %dms\n", after - before);
|
||||
SDL_UpdateTexture(sdl_texture, NULL, buffer, sdl_displaywidth * sizeof(Uint32));
|
||||
SDL_RenderClear(sdl_renderer);
|
||||
SDL_Rect r;
|
||||
r.x = 0;
|
||||
r.y = 0;
|
||||
r.w = min(sdl_windowwidth / sdl_pixelscale, sdl_displaywidth);
|
||||
r.h = min(sdl_windowheight / sdl_pixelscale, sdl_displayheight);
|
||||
SDL_Rect s;
|
||||
s.x = 0;
|
||||
s.y = 0;
|
||||
s.w = min(sdl_windowwidth / sdl_pixelscale * sdl_pixelscale, sdl_displaywidth * sdl_pixelscale);
|
||||
s.h = min(sdl_windowheight / sdl_pixelscale * sdl_pixelscale, sdl_displayheight * sdl_pixelscale);
|
||||
SDL_RenderCopy(sdl_renderer, sdl_texture, &r, &s);
|
||||
SDL_RenderPresent(sdl_renderer);
|
||||
SDL_PumpEvents();
|
||||
// handle_keyboard();
|
||||
/* int before = SDL_GetTicks(); */
|
||||
/* sdl_bitblt_to_screen(); */
|
||||
/* int after = SDL_GetTicks(); */
|
||||
// printf("blitting took %dms\n", after - before);
|
||||
// SDL_UpdateTexture(sdl_texture, NULL, buffer, sdl_displaywidth * sizeof(Uint32));
|
||||
int this_draw = SDL_GetTicks();
|
||||
if(this_draw - last_draw > 16) {
|
||||
SDL_RenderClear(sdl_renderer);
|
||||
SDL_Rect r;
|
||||
r.x = 0;
|
||||
r.y = 0;
|
||||
r.w = min(sdl_windowwidth / sdl_pixelscale, sdl_displaywidth);
|
||||
r.h = min(sdl_windowheight / sdl_pixelscale, sdl_displayheight);
|
||||
SDL_Rect s;
|
||||
s.x = 0;
|
||||
s.y = 0;
|
||||
s.w = min(sdl_windowwidth / sdl_pixelscale * sdl_pixelscale, sdl_displaywidth * sdl_pixelscale);
|
||||
s.h = min(sdl_windowheight / sdl_pixelscale * sdl_pixelscale, sdl_displayheight * sdl_pixelscale);
|
||||
SDL_RenderCopy(sdl_renderer, sdl_texture, &r, &s);
|
||||
SDL_RenderPresent(sdl_renderer);
|
||||
last_draw = this_draw;
|
||||
}
|
||||
}
|
||||
int init_SDL(int w, int h, int s) {
|
||||
sdl_pixelscale = s;
|
||||
|
||||
Reference in New Issue
Block a user