diff --git a/src/syncterm/ripper.c b/src/syncterm/ripper.c index 7c2bcfa4ba2e19e7f3a6aa2e7f535845ef3031df..fb72947cffe99595fcf808e52ec184bf3cf925d4 100644 --- a/src/syncterm/ripper.c +++ b/src/syncterm/ripper.c @@ -7241,6 +7241,7 @@ static const struct builtin_rip_variable builtins[] = { {"BEEP", rv_sound, NULL}, // Beep Sound (ala Ctrl-G) {"BLIP", rv_sound, NULL}, {"COFF", rv_termset, NULL}, + {"COMPAT", rv_termset, NULL}, {"CON", rv_termset, NULL}, {"CURSOR", rv_termstat, NULL}, {"CURX", rv_termstat, NULL}, @@ -7811,8 +7812,6 @@ map_rip_y(int y) static void scale_setpixel(int x, int y, uint32_t color) { - if (!(color & 0x80000000)) - color = map_rip_color(color); setpixel(map_rip_x(x), map_rip_y(y), color); } @@ -7885,6 +7884,27 @@ rv_termset(const char * const var, const void * const data) rip.curstype = _NORMALCURSOR; _setcursortype(rip.curstype); return NULL; + case 'M': + rip.x_dim = 640; + rip.y_dim = 350; + pthread_mutex_lock(&vstatlock); + rip.x_max = vstat.scrnwidth; + if (rip.x_max > rip.x_dim) + rip.x_max = rip.x_dim; + rip.y_max = vstat.scrnheight; + if (rip.y_max > rip.y_dim) + rip.y_max = rip.y_dim; + // TODO: Hack... we should likely scale both directions... + rip.viewport.sx = 0; + rip.viewport.sy = 0; + rip.viewport.ex = rip.x_dim - 1; + rip.viewport.ey = rip.y_dim - 1; + FREE_AND_NULL(rip.xmap); + FREE_AND_NULL(rip.ymap); + FREE_AND_NULL(rip.xunmap); + FREE_AND_NULL(rip.yunmap); + pthread_mutex_unlock(&vstatlock); + return NULL; } break; case 'U': @@ -10626,6 +10646,108 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) if (arg1 < 16) ega_colours[arg1] = fg; break; + case 'b': // RIP_EXTENDED_TEXT_WINDOW (v2.A4) + handled = true; + GET_XY2(); + arg1 = parse_mega(&args[8], 2); + arg2 = parse_mega(&args[10], 2); + arg3 = parse_mega(&args[12], 1); + arg4 = parse_mega(&args[13], 4); + x1 = map_rip_x(x1 + rip.viewport.sx); + x2 = map_rip_x(x2 + rip.viewport.sy); + y1 = map_rip_y(y1 + rip.viewport.sx); + y2 = map_rip_y(y2 + rip.viewport.sy); + + // Step 1, choose the biggest font that fits... + // we have 8x16, 8x14, 8x8, 7x14, and 7x8 to pick from... + int maxwidth = 16; + if (!(arg4 & 0x10) && arg3 != 4) + maxwidth = 8; + else if (x2 - x1 + 1 < maxwidth * arg1) + maxwidth = 8; + if (x2 - x1 + 1 < maxwidth * arg1) + maxwidth = 7; + + int maxheight = 16; + if (maxwidth == 16) + maxheight = 14; + else if (y2 - y1 + 1 < maxheight * arg2) + maxheight = 14; + if (y2 - y1 + 1 < maxheight * arg2) + maxheight = 8; + + // Step 2, shrink text size if needed + if (x2 - x1 + 1 < maxwidth * arg1) + arg1 = (x2 - x1 + 1) / maxwidth; + if (y2 - y1 + 1 < maxheight * arg2) + arg2 = (y2 - y1 + 1) / maxheight; + + // Now, check the desired font. + if (!(arg4 & 0x10)) { + switch (arg3) { + case 0: + if (maxheight > 8) + maxheight = 8; + break; + case 1: + if (maxheight > 8) + maxheight = 8; + if (maxwidth > 7) + maxwidth = 7; + break; + case 3: + if (maxwidth > 7) + maxwidth = 7; + break; + } + } + + // Step 3, center as best we can + int xoffset = (((x2 - x1 + 1) - (maxwidth * arg1)) / 2) / maxwidth; + int yoffset = (((y2 - y1 + 1) - (maxheight * arg2)) / 2) / maxheight; + + // Step 4, set the text window + void *fnt; + if (maxwidth == 16 && maxheight == 14) + fnt = ripfnt16x14; + else if (maxwidth == 8 && maxheight == 16) + fnt = conio_fontdata[0].eight_by_sixteen; + else if (maxwidth == 8 && maxheight == 14) + fnt = conio_fontdata[0].eight_by_fourteen; + else if (maxwidth == 8 && maxheight == 8) + fnt = conio_fontdata[0].eight_by_eight; + else if (maxwidth == 7 && maxheight == 14) + fnt = ripfnt7x14; + else if (maxwidth == 7 && maxheight == 8) + fnt = ripfnt7x8; + else { + printf("Unsupported font size %dx%d\n", maxwidth, maxheight); + fnt = ripfnt7x8; + maxwidth = 7; + maxheight = 8; + } + reinit_screen(fnt, maxwidth, maxheight); + + cterm->left_margin = (x1 / maxwidth) + xoffset; + cterm->top_margin = (y1 / maxheight) + yoffset; + cterm->right_margin = cterm->left_margin + arg1 - 1; + cterm->bottom_margin = cterm->top_margin + arg2 - 1; + setwindow(cterm); + gotoxy(1, 1); + cterm->extattr |= CTERM_EXTATTR_ORIGINMODE; + + // Step 5, apply flags + if (arg4 & 0x01) + cterm->extattr |= CTERM_EXTATTR_AUTOWRAP; + else + cterm->extattr &= ~CTERM_EXTATTR_AUTOWRAP; + if (arg4 & 0x02) + _setcursortype(rip.curstype); + if (arg4 & 0x20) // Clear area... + for (i = x1; i <= x2; i++) + for (j = y1; j <= y2; j++) + rip_setpixel(i, j, 0); + break; case 'c': // RIP_COLOR !|c <color> /* This command sets the color for drawing lines, circles, arcs, * rectangles, and other graphics primitives, as well as the color for @@ -13829,8 +13951,10 @@ init_rip(int version) if (moredata) moredata[0] = 0; if (version) { + shadow_palette(); memcpy(&curr_ega_palette, &default_ega_palette, sizeof(curr_ega_palette)); set_ega_palette(); + normal_palette(); } }