diff --git a/src/conio/cterm.c b/src/conio/cterm.c index 2bd766cdfa3a329ae3aa80992d14ae1bb41ed6ab..7a8407e087e3cc3fa1c0f73e780f632697311a97 100644 --- a/src/conio/cterm.c +++ b/src/conio/cterm.c @@ -1373,7 +1373,7 @@ static void parse_sixel_string(struct cterminal *cterm, bool finish) b = strtoul(p, &p, 10); } if (t == 2) // Only support RGB - setpalette(cterm->sx_fg, r<<8|r, g<<8|g, b<<8|b); + setpalette(cterm->sx_fg, UINT16_MAX*r/100, UINT16_MAX*g/100, UINT16_MAX*b/100); } break; case '$': // Graphics Carriage Return @@ -1390,9 +1390,14 @@ static void parse_sixel_string(struct cterminal *cterm, bool finish) if(cterm->origin_mode) max_row = cterm->bottom_margin - cterm->top_margin + 1; + if ((!cterm->sx_scroll_mode) && (((cterm->sx_y + 6 * cterm->sx_iv) + 6*cterm->sx_iv - 1) >= (cterm->y + max_row - 1) * vparams[vmode].charheight)) { + p++; + break; + } + cterm->sx_x = cterm->sx_left; cterm->sx_y += 6*cterm->sx_iv; - while ((cterm->sx_y + 6*cterm->sx_iv - 1) >= (cterm->y + max_row - 1) * vparams[vmode].charheight) { + while ((cterm->sx_y + 6 * cterm->sx_iv - 1) >= (cterm->y + max_row - 1) * vparams[vmode].charheight) { scrollup(cterm); cterm->sx_y -= vparams[vmode].charheight; } @@ -1414,15 +1419,20 @@ all_done: GETTEXTINFO(&ti); vmode = find_vmode(ti.currmode); - cterm->sx_x = cterm->sx_left; - cterm->sx_x = cterm->sx_x / vparams[vmode].charwidth + 1; - cterm->sx_x -= (cterm->x - 1); + *cterm->hold_update=cterm->sx_hold_update; + if (cterm->sx_scroll_mode) { + cterm->sx_x = cterm->sx_left; + cterm->sx_x = cterm->sx_x / vparams[vmode].charwidth + 1; + cterm->sx_x -= (cterm->x - 1); - cterm->sx_y = (cterm->sx_y+6*cterm->sx_iv-1) / vparams[vmode].charheight + 1; - cterm->sx_y -= (cterm->y - 1); + cterm->sx_y = (cterm->sx_y+6*cterm->sx_iv-1) / vparams[vmode].charheight + 1; + cterm->sx_y -= (cterm->y - 1); - *cterm->hold_update=cterm->sx_hold_update; - GOTOXY(cterm->sx_x,cterm->sx_y); + GOTOXY(cterm->sx_x,cterm->sx_y); + } + else { + GOTOXY(cterm->sx_start_x, cterm->sx_start_y); + } SETCURSORTYPE(cterm->cursor); cterm->sixel = SIXEL_INACTIVE; } @@ -1503,6 +1513,10 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * i=GETVIDEOFLAGS(); i|=CIOLIB_VIDEO_NOBLINK; SETVIDEOFLAGS(i); + break; + case 80: + cterm->sx_scroll_mode = 1; + break; } } } @@ -1549,6 +1563,9 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * i&=~CIOLIB_VIDEO_NOBLINK; SETVIDEOFLAGS(i); break; + case 80: + cterm->sx_scroll_mode = 0; + break; } } } @@ -1595,6 +1612,8 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * strcat(tmp, ";34"); if(vidflags & CIOLIB_VIDEO_NOBLINK) strcat(tmp, ";35"); + if (cterm->sx_scroll_mode) + strcat(tmp, ";80"); if (strlen(tmp) == 4) { // Nothing set strcat(tmp, ";"); } @@ -1611,8 +1630,8 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * i=GETVIDEOFLAGS(); if(seq->param_count == 0) { /* All the save stuff... */ - cterm->saved_mode_mask |= (CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_ORIGIN); - cterm->saved_mode &= ~(CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_ORIGIN); + cterm->saved_mode_mask |= (CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_ORIGIN|CTERM_SAVEMODE_SIXEL_SCROLL); + cterm->saved_mode &= ~(CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_ORIGIN|CTERM_SAVEMODE_SIXEL_SCROLL); cterm->saved_mode |= (cterm->autowrap)?CTERM_SAVEMODE_AUTOWRAP:0; cterm->saved_mode |= (cterm->cursor==_NORMALCURSOR)?CTERM_SAVEMODE_CURSOR:0; cterm->saved_mode |= (i&CIOLIB_VIDEO_ALTCHARS)?CTERM_SAVEMODE_ALTCHARS:0; @@ -1621,6 +1640,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * cterm->saved_mode |= (i&CIOLIB_VIDEO_BLINKALTCHARS)?CTERM_SAVEMODE_BLINKALTCHARS:0; cterm->saved_mode |= (i&CIOLIB_VIDEO_NOBLINK)?CTERM_SAVEMODE_NOBLINK:0; cterm->saved_mode |= (cterm->origin_mode)?CTERM_SAVEMODE_ORIGIN:0; + cterm->saved_mode |= (cterm->sx_scroll_mode)?CTERM_SAVEMODE_SIXEL_SCROLL:0; break; } else { @@ -1666,6 +1686,11 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * cterm->saved_mode &= ~(CTERM_SAVEMODE_NOBLINK); cterm->saved_mode |= (i&CIOLIB_VIDEO_NOBLINK)?CTERM_SAVEMODE_NOBLINK:0; break; + case 80: + cterm->saved_mode_mask |= CTERM_SAVEMODE_SIXEL_SCROLL; + cterm->saved_mode &= ~(CTERM_SAVEMODE_SIXEL_SCROLL); + cterm->saved_mode |= (cterm->sx_scroll_mode)?CTERM_SAVEMODE_SIXEL_SCROLL:0; + break; } } } @@ -1681,6 +1706,8 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * cterm->origin_mode=(cterm->saved_mode & CTERM_SAVEMODE_ORIGIN) ? true : false; if(cterm->saved_mode_mask & CTERM_SAVEMODE_AUTOWRAP) cterm->autowrap=(cterm->saved_mode & CTERM_SAVEMODE_AUTOWRAP) ? true : false; + if(cterm->saved_mode_mask & CTERM_SAVEMODE_SIXEL_SCROLL) + cterm->sx_scroll_mode=(cterm->saved_mode & CTERM_SAVEMODE_SIXEL_SCROLL) ? true : false; if(cterm->saved_mode_mask & CTERM_SAVEMODE_CURSOR) { cterm->cursor = (cterm->saved_mode & CTERM_SAVEMODE_CURSOR) ? _NORMALCURSOR : _NOCURSOR; SETCURSORTYPE(cterm->cursor); @@ -1780,6 +1807,10 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int * SETVIDEOFLAGS(i); } break; + case 80: + if(cterm->saved_mode_mask & CTERM_SAVEMODE_SIXEL_SCROLL) + cterm->sx_scroll_mode=(cterm->saved_mode & CTERM_SAVEMODE_SIXEL_SCROLL) ? true : false; + break; } } } @@ -2594,6 +2625,7 @@ struct cterminal* CIOLIBCALL cterm_init(int height, int width, int xpos, int ypo cterm->origin_mode=false; cterm->fg_color = UINT32_MAX; cterm->bg_color = UINT32_MAX; + cterm->sx_scroll_mode = true; if(cterm->scrollback!=NULL) memset(cterm->scrollback,0,cterm->width*2*cterm->backlines); if(cterm->scrollbackf!=NULL) @@ -2805,8 +2837,15 @@ static void parse_sixel_intro(struct cterminal *cterm) GETTEXTINFO(&ti); vmode = find_vmode(ti.currmode); attr2palette(ti.attribute, &cterm->sx_fg, &cterm->sx_bg); - cterm->sx_x = cterm->sx_left = (cterm->x + WHEREX() - 2) * vparams[vmode].charwidth; - cterm->sx_y = (cterm->y + WHEREY() - 2) * vparams[vmode].charheight; + if (cterm->sx_scroll_mode) { + cterm->sx_x = cterm->sx_left = (cterm->x + WHEREX() - 2) * vparams[vmode].charwidth; + cterm->sx_y = (cterm->y + WHEREY() - 2) * vparams[vmode].charheight; + } + else { + cterm->sx_x = cterm->sx_left = cterm->sx_y = 0; + cterm->sx_start_x = WHEREX(); + cterm->sx_start_y = WHEREY(); + } SETCURSORTYPE(_NOCURSOR); GOTOXY(ti.winright - ti.winleft + 1, ti.winbottom - ti.wintop + 1); *cterm->hold_update = 1; diff --git a/src/conio/cterm.h b/src/conio/cterm.h index 32f9badfa2c9e8f70cff35b3547bae170c7cd992..c40bc9ac4e432152203fe807f9da3df7aa1c8930 100644 --- a/src/conio/cterm.h +++ b/src/conio/cterm.h @@ -100,7 +100,7 @@ struct cterminal { #define CTERM_SAVEMODE_ALTCHARS 0x004 #define CTERM_SAVEMODE_NOBRIGHT 0x008 #define CTERM_SAVEMODE_BGBRIGHT 0x010 - // 0x010 was CTERM_SAVEMODE_DOORWAY +#define CTERM_SAVEMODE_SIXEL_SCROLL 0x020 #define CTERM_SAVEMODE_ORIGIN 0x040 #define CTERM_SAVEMODE_BLINKALTCHARS 0x080 #define CTERM_SAVEMODE_NOBLINK 0x100 @@ -167,6 +167,9 @@ struct cterminal { Raster Attributes are ignore if this is true. */ int sx_first_pass; // First pass through a line int sx_hold_update; // hold_update value to restore on completion + bool sx_scroll_mode; // Sixel scrolling mode + int sx_start_x; // Starting X position + int sx_start_y; // Starting Y position /* conio function pointers */ #ifdef CTERM_WITHOUT_CONIO diff --git a/src/conio/cterm.txt b/src/conio/cterm.txt index bdd37adaed686cbde395b461213e5eeab608cc93..8ba2b13aa4d8832c2be754ee32c2863caf0946e6 100644 --- a/src/conio/cterm.txt +++ b/src/conio/cterm.txt @@ -64,11 +64,83 @@ ESC M (Disabled in current code) SOURCE: BANSI.TXT ESC _ Application Program String + Begins a string consisting of the characters 0x08 - 0x0d and + 0x20-0x7e, terminated by a String Terminator (ST) + The string is currently ignored. + ESC P Device Control String + Begins a string consisting of the characters 0x08 - 0x0d and + 0x20-0x7e, terminated by a String Terminator (ST) + Supported OSC values: + [ p1 [ ; p2 ] ] q + Defaults: p1 = 0 p2 = 0 + Indicates the string is a sixel sequence. + + p1 selects the vertical height of a single pixel. This + may be overridden by the raster attributes command, and + is deprecated. Supported values + + Value Vertical Size + ----- ------------- + 0,1,5,6 2 pixels + 2 5 pixels + 3,4 3 pixels + 7,8,9 1 pixel + + p2 indicates if unset sixels should be set to the current + background colour. If p2 is 1, positions specified as 0 + remain at their current colour. + + Any additional parameters are ignored. + + The rest of the string is made up of sixel data characters and + sixel control functions. Sixel data characters are in the + rage of '?' (0x3f) to '~' (0x7e). Each sixel data character + represents six vertical pixels. The data is extracted by + subtracting 0x3f from the ASCII value of the character. + The least significant bit is the topmost pixel. + + Sixel Control Functions + ! Pn X + Graphics Repeat Introducer + The character X is repeated Pn times. + " p1 ; p2 [ ; p3 [ ; p4 ] ] + Raster Attributes + p1 indicates the vertical size in pixels of each + sixel. p2 indicates the horizontal size in pixels. + p3 and p4 define the height and width (in sixels) + respectively of a block to fill with the background + colour. This block may not extend past the current + bottom of the screen. If any pixel data characters + proceed this command, it is ignored. + # p1 + Colour Select + Selects the current foreground colour from the + sixel palette. + # p1 ; p2 ; p3 ; p4 ; p5 + Palette map + Defines sixel palette entry p1 and sets it as the + current foreground colour. p2 specifies the colour + space to define the colour in, the only supported + value is 2. p3, p4, and p5 specify the red, green, + and blue content as a percentage (0-100). + $ + Graphics Carriage Return + Returns the active position to the left border of + the same sixel row. Generally, one pass per colour + is used. In passes after the first one, sixels + with a value of zero are not overwritten with the + background colour. + - + Graphics New Line + Moves the active position to the left border of the + next sixel row. + ESC ^ Privacy Message Begins a string consisting of the characters 0x08 - 0x0d and 0x20-0x7e, terminated by a String Terminator (ST) The string is currently ignored. + ESC ] Operating System Command Begins a string consisting of the characters 0x08 - 0x0d and 0x20-0x7e, terminated by a String Terminator (ST) @@ -190,67 +262,49 @@ CSI = 255 h SOURCE: BANSI.TXT -CSI ? 6 h - NON-STANDARD EXTENSION - Enable origin mode. - - In this mode, position parameters are relative to the top left of the - scrolling region, not the screen. - - SOURCE: Digital VT102 User Guide - -CSI ? 7 h - NON-STANDARD EXTENSION - Enable auto wrap. - - This is the normal mode in which a write to the last column of a - row will move the cursor to the start of the next line triggering a - scroll if required to create a new line. - - SOURCE: Digital VT102 User Guide - -CSI ? 25 h - NON-STANDARD EXTENSION - Display the cursor - - SOURCE: "Installing and Using the VT320 Video Terminal" - -CSI ? 31 h - NON-STANDARD EXTENSION - Enable bright alt character set - - With this mode set, the bright (1) graphic rendition selects - characters from an alternate character set. - -CSI ? 32 h - NON-STANDARD EXTENSION - Bright Intensity Disable - - This makes the bright intensity bit not control the intensity. - Mostly for use with CSI ? 31 h to permit fonts in the same - colours. - -CSI ? 33 h - NON-STANDARD EXTENSION - Blink to Bright Intensity Background - - With this mode set, the blink (5,6) graphic renditions cause the - background colour to be high intensity rather than causing blink - -CSI ? 34 h - NON-STANDARD EXTENSION - Enable blink alt character set - - With this mode set, the blink (5,6) graphic renditions selects - characters from an alternate character set. - -CSI ? 35 h +CSI ? [ p1 [ ; pX ... ] ] h NON-STANDARD EXTENSION - Blink Disabled - - This makes the blink bit not cause the character to blink. - Mostly for use with CSI ? 34 h to permit fonts to be used without - blinking. + Set Mode + Sets one or more mode. The following modes are supported: + + 6 - Enable origin mode. + In this mode, position parameters are relative to the top left of + the scrolling region, not the screen. Defaults to reset. + SOURCE: Digital VT102 User Guide + 7 - Enable auto wrap + This is the normal mode in which a write to the last column of a + row will move the cursor to the start of the next line triggering + a scroll if required to create a new line. Defaults to set. + SOURCE: Digital VT102 User Guide + 25 - Display the cursor. Defaults to set. + SOURCE: "Installing and Using the VT320 Video Terminal" + 31 - Enable bright alt character set + With this mode set, the bright (1) graphic rendition selects + characters from an alternate character set. Defaults to reset. + 32 - Bright Intensity Disable + This makes the bright intensity bit not control the intensity. + Mostly for use with CSI ? 31 h to permit fonts in the same + colours. Defaults to reset. + 33 - Blink to Bright Intensity Background + With this mode set, the blink (5,6) graphic renditions cause the + background colour to be high intensity rather than causing blink. + Defaults to reset. + 34 - Enable blink alt character set + With this mode set, the blink (5, 6) graphic renditions selects + characters from an alternate character set. Defaults to reset + 35 - Blink Disabled + This makes the blink (5, 6) graphic renditions not cause the + character to blink. Mostly for use with CSI ? 34 h to permit + fonts to be used without blinking. Defaults to reset. + 80 - Sixel Scrolling Enabled + When this is set, the sixel active position begins in the + upper-left corner of the currently active text position. + When the sixel active position reaches the bottom of the + page, the page is scrolled up. At the end of the sixel + string, a sixel newline is appended, and the current cursor + position is the one in which the bottom sixel is in. + Defaults to set. + SOURCE: VT330/VT340 Programmer Reference Manual CSI = 255 l NON-STANDARD EXTENSION @@ -258,30 +312,48 @@ CSI = 255 l SOURCE: BANSI.TXT -CSI ? 6 h - NON-STANDARD EXTENSION - Disable origin mode. - - In this mode, position parameters are relative to the top left of the - screen, not the scrolling region. - - SOURCE: Digital VT102 User Guide - -CSI ? 7 l +CSI ? [ p1 [ ; pX ... ] ] l NON-STANDARD EXTENSION - Disable auto wrap. - - This mode causes a write to the last column of a to leave the - cursor where it was before the write occurred, overwriting anything - which was previously written to the same position. - - SOURCE: Digital VT102 User Guide - -CSI ? 25 l - NON-STANDARD EXTENSION - Hide the cursor - - SOURCE: "Installing and Using the VT320 Video Terminal" + Reset Mode + Resets one or more mode. The following modes are supported: + + 6 - Origin Mode + With this mode reset, position parameters are relative to the + top left of the screen, not the scrolling region. Defaults + to reset. + SOURCE: Digital VT102 User Guide + 7 - Disable auto wrap + Resetting this mode causes a write to the last column of a to + leave the cursor where it was before the write occurred, + overwriting anything which was previously written to the same + position. + SOURCE: Digital VT102 User Guide + 25 - Hide the cursor. Defaults to set. + SOURCE: "Installing and Using the VT320 Video Terminal" + 31 - Disable bright alt character set + With this mode reset, the bright (1) graphic rendition does not + select an alternative font. Defaults to reset. + 32 - Bright Intensity Enable + When reset, bright intensity graphics rendition behaves normally. + Defaults to reset. + 33 - Disable Blink to Bright Intensity Background + With this mode set, the blink (5,6) graphic renditions do not + affect the background colour. Defaults to reset. + 34 - Disable blink alt character set + With this mode reset, the blink (5, 6) graphic renditions do not + select characters from an alternate character set. Defaults to + reset. + 35 - Blink Enable + With this mode reset, the blink (5,6) graphic renditions behave + normally (cause the characters to blink). Defaults to reset. + 80 - Sixel Scrolling Disabled + When this is reset, the sixel active position begins in the + upper-left corner of the page. Any commands that attempt to + advance the sixel position past the bottom of the page are + ignored. At the end of the sixel string, the current cursor + position is unchanged from where it was when the sixel string + started. Defaults to set. + SOURCE: VT330/VT340 Programmer Reference Manual CSI ? 31 l NON-STANDARD EXTENSION