diff --git a/src/conio/bitmap_con.c b/src/conio/bitmap_con.c index a1a47f5bdc3e6fdbdbb662844f6fbbc028695dd7..3dcc807e9976a602ccf1db91f11c53284323fe01 100644 --- a/src/conio/bitmap_con.c +++ b/src/conio/bitmap_con.c @@ -502,6 +502,7 @@ static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) int x; int fdx; uint8_t fb = 0; + uint8_t fbb = 0; int y; int fontoffset; int pixeloffset; @@ -509,6 +510,8 @@ static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) WORD sch; struct vstat_vmem *vmem_ptr; BOOL draw_fg = TRUE; + size_t vmo; + size_t rsz; if(!bitmap_initialized) { return(-1); @@ -520,9 +523,12 @@ static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) return(-1); } - sch=vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].legacy_attr << 8 | vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].ch; - fg = vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].fg; - bg = vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].bg; + vmo = (ypos-1)*cio_textinfo.screenwidth+(xpos-1); + sch = vmem_ptr->vmem[vmo].legacy_attr << 8 | vmem_ptr->vmem[vmo].ch; + fg = vmem_ptr->vmem[vmo].fg; + bg = vmem_ptr->vmem[vmo].bg; + draw_fg = ((!(sch & 0x8000)) || vstat.no_blink); + sch &= 0xff; if (vstat.forced_font) { this_font = vstat.forced_font; @@ -533,13 +539,13 @@ static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) else { switch (vstat.charheight) { case 8: - this_font = (unsigned char *)conio_fontdata[vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].font].eight_by_eight; + this_font = (unsigned char *)conio_fontdata[vmem_ptr->vmem[vmo].font].eight_by_eight; break; case 14: - this_font = (unsigned char *)conio_fontdata[vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].font].eight_by_fourteen; + this_font = (unsigned char *)conio_fontdata[vmem_ptr->vmem[vmo].font].eight_by_fourteen; break; case 16: - this_font = (unsigned char *)conio_fontdata[vmem_ptr->vmem[(ypos-1)*cio_textinfo.screenwidth+(xpos-1)].font].eight_by_sixteen; + this_font = (unsigned char *)conio_fontdata[vmem_ptr->vmem[vmo].font].eight_by_sixteen; break; default: return(-1); @@ -549,7 +555,7 @@ static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) if (this_font == NULL) this_font = font[0]; fdw = vstat.charwidth - (vstat.flags & VIDMODES_FLAG_EXPAND) ? 1 : 0; - fontoffset=(sch & 0xff) * (vstat.charheight * ((fdw + 7) / 8)); + fontoffset=(sch) * (vstat.charheight * ((fdw + 7) / 8)); pthread_mutex_lock(&screena.screenlock); pthread_mutex_lock(&screenb.screenlock); @@ -567,8 +573,8 @@ static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) return(-1); } - draw_fg = ((!(sch & 0x8000)) || vstat.no_blink); pixeloffset = PIXEL_OFFSET(screena, xoffset, yoffset); + rsz = screena.screenwidth - vstat.charwidth; for(y=0; y<vstat.charheight; y++) { for(x=0; x<vstat.charwidth; x++) { fdx = x; @@ -582,7 +588,7 @@ static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) if (!(vstat.flags & VIDMODES_FLAG_LINE_GRAPHICS_EXPAND)) { fb = 0; } - else if ((sch & 0xff) >= 0xC0 && (sch & 0xff) <= 0xDF) { + else if ((sch) >= 0xC0 && (sch) <= 0xDF) { fb = this_font[fontoffset]; } else @@ -590,8 +596,9 @@ static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) } } + fbb = fb & (0x80 >> (fdx & 7)); - if(fb & (0x80 >> (fdx & 7)) && draw_fg) { + if(fbb && draw_fg) { if (screena.rect->data[pixeloffset] != fg) { screena.update_pixels = 1; screena.rect->data[pixeloffset] = fg; @@ -604,7 +611,7 @@ static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) } } - if(fb & (0x80 >> (fdx & 7))) { + if(fbb) { if (screenb.rect->data[pixeloffset] != fg) { screenb.update_pixels = 1; screenb.rect->data[pixeloffset] = fg; @@ -620,7 +627,7 @@ static int bitmap_draw_one_char(unsigned int xpos, unsigned int ypos) } if (x & 0x07) fontoffset++; - pixeloffset += screena.screenwidth - vstat.charwidth; + pixeloffset += rsz; } pthread_mutex_unlock(&screenb.screenlock); pthread_mutex_unlock(&screena.screenlock); @@ -1696,10 +1703,14 @@ int bitmap_drv_init_mode(int mode, int *width, int *height) /* Initialize video memory with black background, white foreground */ for (i = 0; i < vstat.cols*vstat.rows; ++i) { - vstat.vmem->vmem[i].ch = 0; - vstat.vmem->vmem[i].legacy_attr = vstat.currattr; - vstat.vmem->vmem[i].font = default_font; - bitmap_attr2palette_locked(vstat.currattr, &vstat.vmem->vmem[i].fg, &vstat.vmem->vmem[i].bg); + if (i > 0) + vstat.vmem->vmem[i] = vstat.vmem->vmem[0]; + else { + vstat.vmem->vmem[i].ch = 0; + vstat.vmem->vmem[i].legacy_attr = vstat.currattr; + vstat.vmem->vmem[i].font = default_font; + bitmap_attr2palette_locked(vstat.currattr, &vstat.vmem->vmem[i].fg, &vstat.vmem->vmem[i].bg); + } } if (init_screen(&screena, width, height)) diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c index 1f939ba11dd74f743c03feeca7d4bdd7d8aa838d..b9120d6370076f049306873ff30de0df12ccbf8f 100644 --- a/src/conio/ciolib.c +++ b/src/conio/ciolib.c @@ -905,11 +905,15 @@ CIOLIBEXPORT void ciolib_clreol(void) if (!buf) return; for(i=0;i<width*height;i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cio_textinfo.attribute; - buf[i].fg = ciolib_fg; - buf[i].bg = ciolib_bg; - buf[i].font = ciolib_attrfont(cio_textinfo.attribute); + if (i > 0) + buf[i] = buf[0]; + else { + buf[i].ch = ' '; + buf[i].legacy_attr = cio_textinfo.attribute; + buf[i].fg = ciolib_fg; + buf[i].bg = ciolib_bg; + buf[i].font = ciolib_attrfont(cio_textinfo.attribute); + } } ciolib_vmem_puttext( cio_textinfo.curx+cio_textinfo.winleft-1, @@ -940,11 +944,15 @@ CIOLIBEXPORT void ciolib_clrscr(void) if(!buf) return; for(i=0;i<width*height;i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cio_textinfo.attribute; - buf[i].fg = ciolib_fg; - buf[i].bg = ciolib_bg; - buf[i].font = ciolib_attrfont(cio_textinfo.attribute); + if (i > 0) + buf[i] = buf[0]; + else { + buf[i].ch = ' '; + buf[i].legacy_attr = cio_textinfo.attribute; + buf[i].fg = ciolib_fg; + buf[i].bg = ciolib_bg; + buf[i].font = ciolib_attrfont(cio_textinfo.attribute); + } } puttext_can_move=1; ciolib_vmem_puttext(cio_textinfo.winleft,cio_textinfo.wintop,cio_textinfo.winright,cio_textinfo.winbottom,buf); diff --git a/src/conio/cterm.c b/src/conio/cterm.c index f3753008d52496be12053b5576d4128bbf045d76..a48c8ef84b0775ab817a986caf252dbc8147f53f 100644 --- a/src/conio/cterm.c +++ b/src/conio/cterm.c @@ -1131,11 +1131,15 @@ cterm_clreol(struct cterminal *cterm) if (!buf) return; for (i = 0; i < width; i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cterm->attr; - buf[i].fg = cterm->fg_color; - buf[i].bg = cterm->bg_color; - buf[i].font = ciolib_attrfont(cterm->attr); + if (i > 0) + buf[i] = buf[0]; + else { + buf[i].ch = ' '; + buf[i].legacy_attr = cterm->attr; + buf[i].fg = cterm->fg_color; + buf[i].bg = cterm->bg_color; + buf[i].font = ciolib_attrfont(cterm->attr); + } } coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &x, &y); coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &rm, NULL); @@ -1154,11 +1158,15 @@ cterm_clrblk(struct cterminal *cterm, int sx, int sy, int ex, int ey) if (!buf) return; for (i = 0; i < chars ; i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cterm->attr; - buf[i].fg = cterm->fg_color; - buf[i].bg = cterm->bg_color; - buf[i].font = ciolib_attrfont(cterm->attr); + if (i > 0) + buf[i] = buf[0]; + else { + buf[i].ch = ' '; + buf[i].legacy_attr = cterm->attr; + buf[i].fg = cterm->fg_color; + buf[i].bg = cterm->bg_color; + buf[i].font = ciolib_attrfont(cterm->attr); + } } vmem_puttext(sx, sy, ex, ey, buf); free(buf); @@ -1263,11 +1271,15 @@ clear2bol(struct cterminal * cterm) CURR_XY(&x, &y); buf = malloc(x * sizeof(*buf)); for(i = 0; i < x; i++) { - buf[i].ch = ' '; - buf[i].legacy_attr = cterm->attr; - buf[i].fg = cterm->fg_color; - buf[i].bg = cterm->bg_color; - buf[i].font = ciolib_attrfont(cterm->attr); + if (i > 0) + buf[i] = buf[0]; + else { + buf[i].ch = ' '; + buf[i].legacy_attr = cterm->attr; + buf[i].fg = cterm->fg_color; + buf[i].bg = cterm->bg_color; + buf[i].font = ciolib_attrfont(cterm->attr); + } } coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &x, &y); coord_conv_xy(cterm, CTERM_COORD_CURR, CTERM_COORD_SCREEN, &minx, NULL);