diff --git a/src/conio/bitmap_con.c b/src/conio/bitmap_con.c index e5d2f2fcbf31f114349feb238626fd7c7e3c9a83..4b3e479d8a7ad73a985e32d19ac2fc52fcede631 100644 --- a/src/conio/bitmap_con.c +++ b/src/conio/bitmap_con.c @@ -63,11 +63,11 @@ static int dbg_pthread_mutex_trylock(pthread_mutex_t *lptr, unsigned line) /* Structs */ +pthread_mutex_t screenlock; struct bitmap_screen { //uint32_t *screen; int screenwidth; int screenheight; - pthread_mutex_t screenlock; int update_pixels; struct rectlist *rect; }; @@ -558,19 +558,16 @@ static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) fdw = vstat.charwidth - (vstat.flags & VIDMODES_FLAG_EXPAND) ? 1 : 0; fontoffset=(sch) * (vstat.charheight * ((fdw + 7) / 8)); - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); + pthread_mutex_lock(&screenlock); if ((xoffset + vstat.charwidth > screena.screenwidth) || (yoffset + vstat.charheight > screena.screenheight) || (xoffset + vstat.charwidth > screenb.screenwidth) || (yoffset + vstat.charheight > screenb.screenheight)) { - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); + pthread_mutex_unlock(&screenlock); return(-1); } if((!screena.rect) || (!screenb.rect)) { - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); + pthread_mutex_unlock(&screenlock); return(-1); } @@ -630,8 +627,7 @@ static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) fontoffset++; pixeloffset += rsz; } - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); + pthread_mutex_unlock(&screenlock); return(0); } @@ -678,12 +674,12 @@ static void blinker_thread(void *data) for (;;) { SLEEP(10); both_screens(&screen, &ncscreen); - pthread_mutex_lock(&screen->screenlock); + pthread_mutex_lock(&screenlock); if (screen->rect != NULL) { - pthread_mutex_unlock(&screen->screenlock); + pthread_mutex_unlock(&screenlock); break; } - pthread_mutex_unlock(&screen->screenlock); + pthread_mutex_unlock(&screenlock); } count++; if (count==25) { @@ -723,8 +719,7 @@ static void blinker_thread(void *data) request_redraw(); } // Lock both screens in same order every time... - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); + pthread_mutex_lock(&screenlock); // TODO: Maybe we can optimize the blink_changed forced update? if (screen->update_pixels || curs_changed || blink_changed) { // If the other screen is update_pixels == 2, clear it. @@ -732,16 +727,14 @@ static void blinker_thread(void *data) ncscreen->update_pixels = 0; rect = get_full_rectangle_locked(screen); screen->update_pixels = 0; - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); + pthread_mutex_unlock(&screenlock); cb_drawrect(rect); } else { if (force_cursor) { rect = get_full_rectangle_locked(screen); } - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); + pthread_mutex_unlock(&screenlock); if (force_cursor) { cb_drawrect(rect); force_cursor = 0; @@ -1136,7 +1129,7 @@ int bitmap_loadfont(const char *filename) } static void -bitmap_movetext_screen(struct bitmap_screen *screen, int x, int y, int tox, int toy, int direction, int height, int width) +bitmap_movetext_screen(int x, int y, int tox, int toy, int direction, int height, int width) { int32_t sdestoffset; size_t ssourcepos; @@ -1152,19 +1145,22 @@ bitmap_movetext_screen(struct bitmap_screen *screen, int x, int y, int tox, int sdestoffset=(((toy - 1) * vstat.scrnwidth * vstat.charheight + (tox - 1) * vstat.charwidth) - ssourcepos); } - pthread_mutex_lock(&screen->screenlock); + pthread_mutex_lock(&screenlock); if (width == cio_textinfo.screenwidth) { - memmove(&(screen->rect->data[ssourcepos+sdestoffset]), &(screen->rect->data[ssourcepos]), sizeof(screen->rect->data[0])*width*vstat.charwidth*height*vstat.charheight); + memmove(&(screena.rect->data[ssourcepos+sdestoffset]), &(screena.rect->data[ssourcepos]), sizeof(screena.rect->data[0])*width*vstat.charwidth*height*vstat.charheight); + memmove(&(screenb.rect->data[ssourcepos+sdestoffset]), &(screenb.rect->data[ssourcepos]), sizeof(screenb.rect->data[0])*width*vstat.charwidth*height*vstat.charheight); } else { step = direction * vstat.scrnwidth; for(screeny=0; screeny < height*vstat.charheight; screeny++) { - memmove(&(screen->rect->data[ssourcepos+sdestoffset]), &(screen->rect->data[ssourcepos]), sizeof(screen->rect->data[0])*width*vstat.charwidth); + memmove(&(screena.rect->data[ssourcepos+sdestoffset]), &(screena.rect->data[ssourcepos]), sizeof(screena.rect->data[0])*width*vstat.charwidth); + memmove(&(screenb.rect->data[ssourcepos+sdestoffset]), &(screenb.rect->data[ssourcepos]), sizeof(screenb.rect->data[0])*width*vstat.charwidth); ssourcepos += step; } } - screen->update_pixels = 1; - pthread_mutex_unlock(&screen->screenlock); + screena.update_pixels = 1; + screenb.update_pixels = 1; + pthread_mutex_unlock(&screenlock); } int bitmap_movetext(int x, int y, int ex, int ey, int tox, int toy) @@ -1219,8 +1215,7 @@ int bitmap_movetext(int x, int y, int ex, int ey, int tox, int toy) } } - bitmap_movetext_screen(&screena, x, y, tox, toy, direction, height, width); - bitmap_movetext_screen(&screenb, x, y, tox, toy, direction, height, width); + bitmap_movetext_screen(x, y, tox, toy, direction, height, width); pthread_mutex_lock(&vstatlock); release_vmem(vmem_ptr); @@ -1372,23 +1367,21 @@ int bitmap_attr2palette(uint8_t attr, uint32_t *fgp, uint32_t *bgp) int bitmap_setpixel(uint32_t x, uint32_t y, uint32_t colour) { - pthread_mutex_lock(&screena.screenlock); + pthread_mutex_lock(&screenlock); if (x < screena.screenwidth && y < screena.screenheight) { if (screena.rect->data[PIXEL_OFFSET(screena, x, y)] != colour) { screena.update_pixels = 1; screena.rect->data[PIXEL_OFFSET(screena, x, y)] = colour; } } - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); if (x < screenb.screenwidth && y < screenb.screenheight) { if (screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] != colour) { screenb.update_pixels = 1; screenb.rect->data[PIXEL_OFFSET(screenb, x, y)] = colour; } } - pthread_mutex_unlock(&screenb.screenlock); + pthread_mutex_unlock(&screenlock); return 1; } @@ -1424,11 +1417,9 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_ return 0; } - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); + pthread_mutex_lock(&screenlock); if (ex > screena.screenwidth || ey > screena.screenheight) { - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); + pthread_mutex_unlock(&screenlock); return 0; } @@ -1484,8 +1475,7 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_ } } } - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); + pthread_mutex_unlock(&screenlock); return 1; } @@ -1524,12 +1514,10 @@ struct ciolib_pixels *bitmap_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, ui } update_from_vmem(force); - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); + pthread_mutex_lock(&screenlock); if (ex >= screena.screenwidth || ey >= screena.screenheight || ex >= screenb.screenwidth || ey >= screenb.screenheight) { - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); + pthread_mutex_unlock(&screenlock); free(pixels->pixelsb); free(pixels->pixels); free(pixels); @@ -1541,8 +1529,7 @@ struct ciolib_pixels *bitmap_getpixels(uint32_t sx, uint32_t sy, uint32_t ex, ui memcpy(&pixels->pixels[width*(y-sy)], &screena.rect->data[PIXEL_OFFSET(screena, sx, y)], width * sizeof(pixels->pixels[0])); memcpy(&pixels->pixelsb[width*(y-sy)], &screenb.rect->data[PIXEL_OFFSET(screenb, sx, y)], width * sizeof(pixels->pixelsb[0])); } - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); + pthread_mutex_unlock(&screenlock); return pixels; } @@ -1576,8 +1563,7 @@ void bitmap_replace_font(uint8_t id, char *name, void *data, size_t size) return; } - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); + pthread_mutex_lock(&screenlock); switch (size) { case 4096: FREE_AND_NULL(conio_fontdata[id].eight_by_sixteen); @@ -1602,8 +1588,7 @@ void bitmap_replace_font(uint8_t id, char *name, void *data, size_t size) free(data); } request_redraw(); - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); + pthread_mutex_unlock(&screenlock); } int bitmap_setpalette(uint32_t index, uint16_t r, uint16_t g, uint16_t b) @@ -1611,35 +1596,45 @@ int bitmap_setpalette(uint32_t index, uint16_t r, uint16_t g, uint16_t b) if (index > 65535) return 0; - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); + pthread_mutex_lock(&screenlock); palette[index] = (0xff << 24) | ((r>>8) << 16) | ((g>>8) << 8) | (b>>8); screena.update_pixels = 1; screenb.update_pixels = 1; - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); + pthread_mutex_unlock(&screenlock); return 1; } // Called with vstatlock -static int init_screen(struct bitmap_screen *screen, int *width, int *height) +static int init_screens(int *width, int *height) { - pthread_mutex_lock(&screen->screenlock); - screen->screenwidth = vstat.scrnwidth; + pthread_mutex_lock(&screenlock); + screena.screenwidth = vstat.scrnwidth; + screenb.screenwidth = vstat.scrnwidth; if (width) - *width = screen->screenwidth; - screen->screenheight = vstat.scrnheight; + *width = screena.screenwidth; + screena.screenheight = vstat.scrnheight; + screenb.screenheight = vstat.scrnheight; if (height) - *height = screen->screenheight; - screen->update_pixels = 1; - bitmap_drv_free_rect(screen->rect); - screen->rect = alloc_full_rect(screen); - if (screen->rect == NULL) { - pthread_mutex_unlock(&screen->screenlock); + *height = screena.screenheight; + screena.update_pixels = 1; + screenb.update_pixels = 1; + bitmap_drv_free_rect(screena.rect); + bitmap_drv_free_rect(screenb.rect); + screena.rect = alloc_full_rect(&screena); + if (screena.rect == NULL) { + pthread_mutex_unlock(&screenlock); return(-1); } - memset_u32(screen->rect->data, color_value(vstat.palette[0]), screen->rect->rect.width * screen->rect->rect.height); - pthread_mutex_unlock(&screen->screenlock); + screenb.rect = alloc_full_rect(&screenb); + if (screenb.rect == NULL) { + bitmap_drv_free_rect(screena.rect); + screena.rect = NULL; + pthread_mutex_unlock(&screenlock); + return(-1); + } + memset_u32(screena.rect->data, color_value(vstat.palette[0]), screena.rect->rect.width * screena.rect->rect.height); + memset_u32(screenb.rect->data, color_value(vstat.palette[0]), screenb.rect->rect.width * screenb.rect->rect.height); + pthread_mutex_unlock(&screenlock); return(0); } @@ -1682,9 +1677,7 @@ int bitmap_drv_init_mode(int mode, int *width, int *height) } } - if (init_screen(&screena, width, height)) - return -1; - if (init_screen(&screenb, width, height)) + if (init_screens(width, height)) return -1; for (i=0; i<sizeof(current_font)/sizeof(current_font[0]); i++) current_font[i]=default_font; @@ -1731,20 +1724,17 @@ int bitmap_drv_init(void (*drawrect_cb) (struct rectlist *data) | CONIO_OPT_BLOCKY_SCALING; pthread_mutex_init(&callbacks.lock, NULL); pthread_mutex_init(&vstatlock, NULL); - pthread_mutex_init(&screena.screenlock, NULL); - pthread_mutex_init(&screenb.screenlock, NULL); + pthread_mutex_init(&screenlock, NULL); pthread_mutex_init(&free_rect_lock, NULL); pthread_mutex_lock(&vstatlock); init_r2y(); vstat.vmem=NULL; vstat.flags = VIDMODES_FLAG_PALETTE_VMEM; - pthread_mutex_lock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); + pthread_mutex_lock(&screenlock); for (i = 0; i < sizeof(dac_default)/sizeof(struct dac_colors); i++) { palette[i] = (0xff << 24) | (dac_default[i].red << 16) | (dac_default[i].green << 8) | dac_default[i].blue; } - pthread_mutex_unlock(&screenb.screenlock); - pthread_mutex_unlock(&screena.screenlock); + pthread_mutex_unlock(&screenlock); pthread_mutex_unlock(&vstatlock); callbacks.drawrect=drawrect_cb; @@ -1758,14 +1748,12 @@ int bitmap_drv_init(void (*drawrect_cb) (struct rectlist *data) void bitmap_drv_request_pixels(void) { - pthread_mutex_lock(&screena.screenlock); + pthread_mutex_lock(&screenlock); if (screena.update_pixels == 0) screena.update_pixels = 2; - pthread_mutex_unlock(&screena.screenlock); - pthread_mutex_lock(&screenb.screenlock); if (screenb.update_pixels == 0) screenb.update_pixels = 2; - pthread_mutex_unlock(&screenb.screenlock); + pthread_mutex_unlock(&screenlock); } void bitmap_drv_request_some_pixels(int x, int y, int width, int height)