console_patches_73����������������������������������������������������������������������������������0040755�0000000�0000000�00000000000�14420265734�0013353�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������console_patches_73/part_1.sig�����������������������������������������������������������������������0100644�0000000�0000000�00000031152�14420264207�0015315�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������untrusted comment: verify with signify key from research.exoticsilicon.com
RWRn5d3Yx35u0+EjnJhojEI4EXC4GSzOzGXHWH2Ki9/PzoobmYCdnHfG/jnJsrRMXtuI7lm27GMro7lwvgE9tI3ti7Fbxy2XuAQ=
This patch is patch 1 of a set of 4 patches, intended to be applied to OpenBSD 7.3-release.
For more information about this patchset, and to download the accompanying userland utilities, please visit:
https://research.exoticsilicon.com/articles/console_enhancement_patchset_73
THIS PATCH IS PROVIDED 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
EXOTIC SILICON BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS PATCH, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- sys/dev/rasops/rasops.c
+++ sys/dev/rasops/rasops.c
@@ -446,6 +446,10 @@
WSSCREEN_WSCOLORS | WSSCREEN_REVERSE;
}
ri->ri_caps |= WSSCREEN_256COL ;
switch (ri->ri_depth) {
#if NRASOPS1 > 0
case 1:
@@ -557,7 +561,7 @@
if ((flg & WSATTR_HILIT) != 0 && fg < 8)
fg += 8;
return (0);
}
@@ -581,7 +585,7 @@
bg = swap;
}
return (0);
}
@@ -863,6 +867,24 @@
ri->ri_devcmap[i] = c;
#endif
}
for (i=16 ; i<256; i++) {
c = (i < 232 ? EBCOL(i) : EBGREY(i));
if (ri->ri_flg & RI_BSWAP)
c = (ri->ri_depth==16 ? swap16(c) : swap32(c));
ri->ri_devcmap[i] = c;
}
#endif
}
@@ -872,8 +894,8 @@
void
rasops_unpack_attr(void *cookie, uint32_t attr, int *fg, int *bg, int *underline)
{
if (underline != NULL)
*underline = (u_int)attr & WSATTR_UNDERLINE;
}
@@ -903,7 +925,7 @@
return 0;
#endif
/*
* XXX The wsdisplay_emulops interface seems a little deficient in
@@ -1245,9 +1267,20 @@
else
col = ri->ri_cols - col - 1;
attr & ~WSATTR_UNDERLINE);
+#define BITMASK_UNSAFE_FOR_ROTATION (WSATTR_UNDERLINE | WSATTR_DOUBLE_UNDERLINE | WSATTR_STRIKE | WSATTR_ITALIC)
if (rc != 0)
return rc;
@@ -1259,7 +1292,7 @@
/* XXX this assumes 16-bit color depth */
if ((attr & WSATTR_UNDERLINE) != 0) {
int16_t c = (int16_t)ri->ri_devcmap[((u_int)attr >> 24) & 0xf];
int16_t c = (int16_t)ri->ri_devcmap[((u_int)attr >> 24) & 0xff];
while (height--) {
*(int16_t *)rp = c;
@@ -1787,8 +1820,8 @@
attr = ri->ri_bs[off].attr;
if ((ri->ri_flg & RI_CURSOR) == 0) {
fg = ((u_int)attr >> 24) & 0xf;
bg = ((u_int)attr >> 16) & 0xf;
fg = ((u_int)attr >> 24) & 0xff;
bg = ((u_int)attr >> 16) & 0xff;
attr &= ~0x0ffff0000;
attr |= (fg << 16) | (bg << 24);
}
--- sys/dev/rasops/rasops.h
+++ sys/dev/rasops/rasops.h
@@ -106,7 +106,7 @@
u_char *ri_origbits; /* where screen bits actually start */
int ri_xorigin; /* where ri_bits begins (x) */
int ri_yorigin; /* where ri_bits begins (y) */
/* The emulops you need to use, and the screen caps for wscons */
struct wsdisplay_emulops ri_ops;
--- sys/dev/rasops/rasops32.c
+++ sys/dev/rasops/rasops32.c
@@ -91,13 +91,46 @@
width = ri->ri_font->fontwidth;
step = ri->ri_stride >> 3;
f=(f>>1) & 0x7F7F7F7F;
}
u.d[0][0] = b; u.d[0][1] = b;
u.d[1][0] = b; u.d[1][1] = f;
u.d[2][0] = f; u.d[2][1] = b;
u.d[3][0] = f; u.d[3][1] = f;
uc=' ';
}
if (uc == ' ') {
while (height--) {
/* the general, pixel-at-a-time case is fast enough */
@@ -203,11 +236,46 @@
}
/* Do underline a pixel at a time */
rp -= step;
for (cnt = 0; cnt < width; cnt++)
((int *)rp)[cnt] = f;
}
+#define FONT_HEIGHT ri->ri_font->fontheight
+#define DOUBLE_UL_SHIFT (FONT_HEIGHT < 12 ? 0 : (FONT_HEIGHT <= 32 ? 1 : 2))
rp-=(step << DOUBLE_UL_SHIFT);
for (cnt=0; cnt< width; cnt++)
((int *)rp)[cnt]=f;
/*
* Reset row pointer to ensure that strikethough appears at a
* consistent height if combined with double underlining.
*/
rp+=(step << DOUBLE_UL_SHIFT);
}
if ((attr & WSATTR_UNDERLINE) != 0) {
rp+=step ;
}
rp -= (1+ri->ri_font->fontheight/2)*step;
for (cnt=0; cnt< width; cnt++)
((int *)rp)[cnt]=f;
}
return 0;
}
--- sys/dev/wscons/wsdisplayvar.h
+++ sys/dev/wscons/wsdisplayvar.h
@@ -94,11 +94,16 @@
#define WSCOL_CYAN 6
#define WSCOL_WHITE 7
/* flag values: */
-#define WSATTR_REVERSE 1
-#define WSATTR_HILIT 2
-#define WSATTR_BLINK 4
-#define WSATTR_UNDERLINE 8
-#define WSATTR_WSCOLORS 16
+#define WSATTR_REVERSE 1
+#define WSATTR_HILIT 2
+#define WSATTR_BLINK 4
+#define WSATTR_UNDERLINE 8
+#define WSATTR_WSCOLORS 16
+#define WSATTR_DIM 32
+#define WSATTR_STRIKE 64
+#define WSATTR_DOUBLE_UNDERLINE 128
+#define WSATTR_INVISIBLE 256
+#define WSATTR_ITALIC 512
};
#define WSSCREEN_NAME_SIZE 16
@@ -114,6 +119,7 @@
#define WSSCREEN_HILIT 4 /* can highlight (however) */
#define WSSCREEN_BLINK 8 /* can blink */
#define WSSCREEN_UNDERLINE 16 /* can underline */
+#define WSSCREEN_256COL 32 /* supports 256 colours */
};
/*
--- sys/dev/wscons/wsemul_vt100_subr.c
+++ sys/dev/wscons/wsemul_vt100_subr.c
@@ -593,6 +593,9 @@
case 1: /* bold */
flags |= WSATTR_HILIT;
break;
case 2: /* dim */
flags |= WSATTR_DIM;
break;
case 4: /* underline */
flags |= WSATTR_UNDERLINE;
break;
@@ -602,11 +605,28 @@
case 7: /* reverse */
flags |= WSATTR_REVERSE;
break;
case 22: /* ~bold VT300 only */
/*
* Invisible text only makes the _glyph_ invisible.
*
* Other active attributes such as underlining and
* strikeout are still displayed in the character cell.
*/
case 8: /* invisible */
flags |= WSATTR_INVISIBLE;
break;
case 9: /* strike */
flags |= WSATTR_STRIKE;
break;
case 21: /* double underline */
flags |= WSATTR_DOUBLE_UNDERLINE;
break;
case 22: /* ~bold ~dim VT300 only */
flags &= ~WSATTR_HILIT;
flags &= ~WSATTR_DIM;
break;
case 24: /* ~underline VT300 only */
flags &= ~WSATTR_UNDERLINE;
flags &= ~WSATTR_DOUBLE_UNDERLINE;
break;
case 25: /* ~blink VT300 only */
flags &= ~WSATTR_BLINK;
@@ -614,12 +634,76 @@
case 27: /* ~reverse VT300 only */
flags &= ~WSATTR_REVERSE;
break;
case 28: /* ~invisible */
flags &= ~WSATTR_INVISIBLE;
break;
case 29: /* ~strike */
flags &= ~WSATTR_STRIKE;
break;
case 30: case 31: case 32: case 33:
case 34: case 35: case 36: case 37:
/* fg color */
flags |= WSATTR_WSCOLORS;
fgcol = ARG(n) - 30;
break;
/*
* Sequences starting CSI 38 escape to a larger
* colourspace, typically either 256 colours or 24-bit.
*
* We support CSI 38;5;X;m to set colour X from a
* palette of 256.
*/
+#define EXIST_ARG2(i) ((edp->nargs-n)>=3)
+#define ARG2_OR_DEF(i) (EXIST_ARG2(i) ? ARG(i+2) : 0)
case 38:
/*
* 38 followed by zero arguments is meaningless.
*/
if (edp->nargs == n+1) {
break ;
}
/*
* 5 should normally be followed by a single
* argument, but zero arguments is also valid to
* set colour zero.
*/
if (ARG(n+1)==5) {
flags |= WSATTR_WSCOLORS;
if (edp->scrcapabilities &
WSSCREEN_256COL) {
fgcol = ARG2_OR_DEF(n);
} else {
fgcol = (ARG2_OR_DEF(n) < 8 ? ARG2_OR_DEF(n)
: fgcol );
}
n+=(EXIST_ARG2(n) ? 2 : 1);
break;
}
/*
* 2 should introduce a sequence of three
* arguments, specifying RGB.
*
* We don't, (yet!), support setting colours by
* 24-bit RGB arguments and don't want to
* interpret these as regular SGR codes.
*
* If there are more then three, skip just
* three, otherwise skip all of them.
*/
if (ARG(n+1)==2) {
n=(edp->nargs-n > 5 ? n+4 :
edp->nargs);
break;
}
/*
* Invalid code, I.E. not 2 or 5.
*
* We do what xterm does and just skip the
* single unrecognised argument, then allow any
* following arguments to be interpreted as SGR.
*/
n++;
break;
case 39:
/* reset fg color */
fgcol = WSCOL_WHITE;
@@ -631,6 +715,29 @@
/* bg color */
flags |= WSATTR_WSCOLORS;
bgcol = ARG(n) - 40;
break;
case 48: /* set 8-bit background colour */
if (edp->nargs == n+1) {
break ;
}
if (ARG(n+1)==5) {
flags |= WSATTR_WSCOLORS;
if (edp->scrcapabilities &
WSSCREEN_256COL) {
bgcol = ARG2_OR_DEF(n);
} else {
bgcol = (ARG2_OR_DEF(n) < 8 ? ARG2_OR_DEF(n)
: bgcol );
}
n+=(EXIST_ARG2(n) ? 2 : 1);
break;
}
if (ARG(n+1)==2) {
n=(edp->nargs-n > 5 ? n+4 :
edp->nargs);
break;
}
n++;
break;
case 49:
/* reset bg color */
����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������console_patches_73/part_2.sig�����������������������������������������������������������������������0100644�0000000�0000000�00000010357�14420264221�0015316�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������untrusted comment: verify with signify key from research.exoticsilicon.com
RWRn5d3Yx35u05UIOxPBA6FziK3xdoX/HPFewiWL8tLSTpbIggRwXek4QaEReIrU8pimxGczen9vtPbGLKFX0quYuo02yn1ncwA=
This patch is patch 2 of a set of 4 patches, intended to be applied to OpenBSD 7.3-release.
For more information about this patchset, and to download the accompanying userland utilities, please visit:
https://research.exoticsilicon.com/articles/console_enhancement_patchset_73
THIS PATCH IS PROVIDED 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
EXOTIC SILICON BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS PATCH, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- sys/dev/wscons/wsemul_vt100_keys.c
+++ sys/dev/wscons/wsemul_vt100_keys.c
@@ -37,11 +37,9 @@
#include <dev/wscons/wsemulvar.h>
#include <dev/wscons/wsemul_vt100var.h>
+#define vt100_fkeys_len(x) (5+(x>=8)+(x>=12))
static const u_char *vt100_fkeys[] = {
"\033[15~", /* F5 */
"\033[17~", /* F6 */
"\033[18~",
@@ -50,18 +48,18 @@
"\033[21~",
"\033[23~", /* VT100: ESC */
"\033[24~", /* VT100: BS */
};
static const u_char *vt100_pfkeys[] = {
@@ -96,14 +94,22 @@
edp->translatebuf, edp->flags & VTFL_UTF8));
}
*out = vt100_fkeys[in - KS_f1];
return (5);
*out = vt100_pfkeys[in - KS_f1];
return (3);
}
*out = vt100_fkeys[in - KS_F1];
return (5);
*out = vt100_pfkeys[in - KS_F1];
return (3);
}
*out = vt100_fkeys[in - KS_f5];
return vt100_fkeys_len(in - KS_f5);
*out = vt100_fkeys[in - KS_F5];
return vt100_fkeys_len(in - KS_F5);
if (in >= KS_KP_F1 && in <= KS_KP_F4) {
*out = vt100_pfkeys[in - KS_KP_F1];
return (3);
@@ -148,12 +154,12 @@
}
switch (in) {
case KS_Help:
*out = vt100_fkeys[15 - 1];
*out = vt100_fkeys[15 - 1 + 4]; /* vt100_fkeys starts at F5 */
return (5);
case KS_Execute: /* "Do" */
*out = vt100_fkeys[16 - 1];
*out = vt100_fkeys[16 - 1 + 4]; /* vt100_fkeys starts at F5 */
return (5);
case KS_Find:
case KS_Find: /* Not defined in xterm terminfo */
*out = "\033[1~";
return (4);
case KS_Insert:
@@ -163,7 +169,7 @@
case KS_KP_Delete:
*out = "\033[3~";
return (4);
case KS_Select:
case KS_Select: /* Not defined in xterm terminfo */
*out = "\033[4~";
return (4);
case KS_Prior:
@@ -177,14 +183,24 @@
case KS_Backtab:
*out = "\033[Z";
return (3);
/*
* Unlike insert, delete, page up, and page down, we purposely don't
* send the same sequence of \033OE for the non-keypad 'begin' key.
*
* This is because the terminfo xterm entry is mapping this to kb2,
* which is defined as 'centre of keypad'.
*/
case KS_KP_Begin:
*out = "\033OE";
return (3);
case KS_Home:
case KS_KP_Home:
*out = "\033[7~";
return (4);
*out = "\033OH";
return (3);
case KS_End:
case KS_KP_End:
*out = "\033[8~";
return (4);
*out = "\033OF";
return (3);
case KS_Up:
case KS_KP_Up:
if (edp->flags & VTFL_APPLCURSOR)
���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������console_patches_73/part_3.sig�����������������������������������������������������������������������0100644�0000000�0000000�00000012650�14420264233�0015320�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������untrusted comment: verify with signify key from research.exoticsilicon.com
RWRn5d3Yx35u0/WqBp/XjOvUxCWQFAXL0Z4PB6G8AwFyPNJdkfCFs/GxQtumeNetdzbrQWp5QAnGGn+BlVwE8jhJWz672lrF9wI=
This patch is patch 3 of a set of 4 patches, intended to be applied to OpenBSD 7.3-release.
For more information about this patchset, and to download the accompanying userland utilities, please visit:
https://research.exoticsilicon.com/articles/console_enhancement_patchset_73
THIS PATCH IS PROVIDED 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
EXOTIC SILICON BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS PATCH, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- sys/dev/rasops/rasops32.c
+++ sys/dev/rasops/rasops32.c
@@ -140,7 +140,25 @@
}
} else {
uc -= ri->ri_font->firstchar;
fr = (u_char *)ri->ri_font->data + uc * ri->ri_fontscale;
/* Choose font data based on bold and italic attributes */
u_char * font_dataset;
switch (attr & (WSATTR_HILIT | WSATTR_ITALIC)) {
case WSATTR_HILIT:
font_dataset=(u_char *)ri->ri_font->data_bold;
break;
case WSATTR_ITALIC:
font_dataset=(u_char *)ri->ri_font->data_italic;
break;
case (WSATTR_HILIT | WSATTR_ITALIC):
font_dataset=(u_char *)ri->ri_font->data_bolditalic;
break;
default:
font_dataset=(u_char *)ri->ri_font->data;
}
fr = (font_dataset + uc * ri->ri_fontscale);
fs = ri->ri_font->stride;
/* double-pixel special cases for the common widths */
--- sys/dev/wscons/wsconsio.h
+++ sys/dev/wscons/wsconsio.h
@@ -536,6 +536,9 @@
#define WSDISPLAY_FONTORDER_R2L 2
void *cookie;
void *data;
};
#define WSDISPLAYIO_LDFONT _IOW ('W', 77, struct wsdisplay_font)
#define WSDISPLAYIO_LSFONT _IOWR('W', 78, struct wsdisplay_font)
--- sys/dev/wscons/wsemul_vt100_subr.c
+++ sys/dev/wscons/wsemul_vt100_subr.c
@@ -596,6 +596,9 @@
case 2: /* dim */
flags |= WSATTR_DIM;
break;
case 3: /* italic */
flags |= WSATTR_ITALIC;
break;
case 4: /* underline */
flags |= WSATTR_UNDERLINE;
break;
@@ -623,6 +626,9 @@
case 22: /* ~bold ~dim VT300 only */
flags &= ~WSATTR_HILIT;
flags &= ~WSATTR_DIM;
break;
case 23: /* ~italic */
flags &= ~WSATTR_ITALIC;
break;
case 24: /* ~underline VT300 only */
flags &= ~WSATTR_UNDERLINE;
--- sys/dev/wsfont/wsfont.c
+++ sys/dev/wsfont/wsfont.c
@@ -586,6 +586,63 @@
lc = ++ent->lockcount;
*ptr = ent->font;
+#define FONT_DATA ((*ptr)->data)
+#define FONT_DATA_BOLD ((*ptr)->data_bold)
+#define FONT_DATA_ITALIC ((*ptr)->data_italic)
+#define FONT_DATA_BOLDITALIC ((*ptr)->data_bolditalic)
+#define FONT_SLANT ((((*ptr)->fontheight))/2)
+#define FONT_BYTES_PER_GLYPH (((*ptr)->stride) * (((*ptr)->fontheight)))
+#define FONT_DATA_LEN FONT_BYTES_PER_GLYPH * ((*ptr)->numchars)
+#define FONT_STRIDE ((*ptr)->stride)
int i, j, row_data;
/*
* Create a bold version of the font:
*
* To produce the bold effect, we simply duplicate the set bits
* of the pixel data offset one pixel to the right, effectively
* 'overprinting' the glyph. Better algorithms probably exist.
*/
(*ptr)->data_bold=malloc(FONT_DATA_LEN, M_TEMP, M_WAITOK);
for (i=0; i < FONT_DATA_LEN ; i++) {
*(unsigned char *)(FONT_DATA_BOLD + i) =
*(unsigned char *)(FONT_DATA + i) |
(*(unsigned char *)(FONT_DATA + i) >> 1) ;
}
/*
* Create an italic version of the font:
*
* Pixel data is increasingly offset to the left as we progress
* down the rows from the top of each glyph. To minimise the
* overall visual shift to the left, we shift a fixed one bit to
* the right for each row.
*/
(*ptr)->data_italic=malloc(FONT_DATA_LEN, M_TEMP, M_WAITOK);
for (i=0; i < FONT_DATA_LEN ; i += FONT_STRIDE) {
row_data=0;
for (j=0; j < FONT_STRIDE; j++) {
row_data |=((*(unsigned char *)(FONT_DATA + i + j) << (8 * (FONT_STRIDE-j-1))));
}
row_data=row_data << (i % FONT_BYTES_PER_GLYPH / FONT_SLANT) >> 1;
for (j=0; j < FONT_STRIDE; j++) {
*(unsigned char *)(FONT_DATA_ITALIC + i + j) = (row_data >> (8 * (FONT_STRIDE-j-1)) & 0xFF);
}
}
/*
* Create a bold and italic version of the font:
*/
(*ptr)->data_bolditalic=malloc(FONT_DATA_LEN, M_TEMP, M_WAITOK);
for (i=0; i < FONT_DATA_LEN ; i++) {
*(unsigned char *)(FONT_DATA_BOLDITALIC + i) =
*(unsigned char *)(FONT_DATA_ITALIC + i) |
(*(unsigned char *)(FONT_DATA_ITALIC + i) >> 1) ;
}
} else
lc = -1;
@@ -600,6 +657,7 @@
wsfont_unlock(int cookie)
{
struct font *ent;
int s, lc;
s = splhigh();
@@ -607,6 +665,10 @@
if ((ent = wsfont_find0(cookie)) != NULL) {
if (ent->lockcount == 0)
panic("wsfont_unlock: font not locked");
ptr = ent->font;
free (ptr->data_bold, M_TEMP, 0);
free (ptr->data_italic, M_TEMP, 0);
free (ptr->data_bolditalic, M_TEMP, 0);
lc = --ent->lockcount;
} else
lc = -1;
����������������������������������������������������������������������������������������console_patches_73/part_4.sig�����������������������������������������������������������������������0100644�0000000�0000000�00000015553�14420264245�0015331�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������untrusted comment: verify with signify key from research.exoticsilicon.com
RWRn5d3Yx35u07zDFXtSicfT32YODvHWc6B3jvWz2gNYCqRIWqpLf/9PTPF5rVX78b7w8ESZTswn72t7ByyxQiMrmjpF0fk2dgo=
This patch is patch 4 of a set of 4 patches, intended to be applied to OpenBSD 7.3-release.
For more information about this patchset, and to download the accompanying userland utilities, please visit:
https://research.exoticsilicon.com/articles/console_enhancement_patchset_73
THIS PATCH IS PROVIDED 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
EXOTIC SILICON BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS PATCH, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- sys/dev/ic/vga.c
+++ sys/dev/ic/vga.c
@@ -116,6 +116,7 @@
int vga_pack_attr(void *, int, int, int, uint32_t *);
int vga_copyrows(void *, int, int, int);
void vga_unpack_attr(void *, uint32_t, int *, int *, int *);
+int vga_screendump(void *, void *);
static const struct wsdisplay_emulops vga_emulops = {
pcdisplay_cursor,
@@ -126,7 +127,8 @@
vga_copyrows,
pcdisplay_eraserows,
vga_pack_attr,
};
/*
@@ -1245,6 +1247,12 @@
vga_loadchars(&vc->hdl, slot, 0, 256, f->height, f->fontdata);
}
+}
+int
+vga_screendump(void * cookie, void * unused)
+{
+return (EINVAL);
}
#ifdef alpha
--- sys/dev/rasops/rasops.c
+++ sys/dev/rasops/rasops.c
@@ -170,6 +170,7 @@
int rf_rotated;
};
#endif
+int rasops_screendump(void *, void *);
void rasops_doswitch(void *);
int rasops_vcons_cursor(void *, int, int, int);
@@ -181,6 +182,7 @@
int rasops_vcons_eraserows(void *, int, int, uint32_t);
int rasops_vcons_pack_attr(void *, int, int, int, uint32_t *);
void rasops_vcons_unpack_attr(void *, uint32_t, int *, int *, int *);
+int rasops_vcons_screendump(void *, void *);
int rasops_wronly_putchar(void *, int, int, u_int, uint32_t);
int rasops_wronly_copycols(void *, int, int, int, int);
@@ -276,6 +278,7 @@
ri->ri_copyrows = ri->ri_ops.copyrows;
ri->ri_eraserows = ri->ri_ops.eraserows;
ri->ri_pack_attr = ri->ri_ops.pack_attr;
if (ri->ri_flg & RI_VCONS) {
void *cookie;
@@ -299,6 +302,7 @@
ri->ri_ops.pack_attr = rasops_vcons_pack_attr;
ri->ri_ops.unpack_attr = rasops_vcons_unpack_attr;
ri->ri_do_cursor = rasops_wronly_do_cursor;
ri->ri_ops.screendump = rasops_vcons_screendump;
} else if ((ri->ri_flg & RI_WRONLY) && ri->ri_bs != NULL) {
uint32_t attr;
int i;
@@ -436,6 +440,7 @@
ri->ri_ops.unpack_attr = rasops_unpack_attr;
ri->ri_do_cursor = rasops_do_cursor;
ri->ri_updatecursor = NULL;
if (ri->ri_depth < 8 || (ri->ri_flg & RI_FORCEMONO) != 0) {
ri->ri_ops.pack_attr = rasops_pack_mattr;
@@ -2032,3 +2037,38 @@
return 0;
}
+/*
+int
+rasops_screendump(void * cookie, void * data)
+{
+#define screendump ((struct wsdisplay_screendump_pixels *)data)
+#define FB_SIZE (ri->ri_stride * ri->ri_height)
+}
+int
+rasops_vcons_screendump(void * cookie, void * data)
+{
+}
--- sys/dev/rasops/rasops.h
+++ sys/dev/rasops/rasops.h
@@ -136,6 +136,7 @@
int (*ri_copyrows)(void *, int, int, int);
int (*ri_eraserows)(void *, int, int, uint32_t);
int (*ri_pack_attr)(void *, int, int, int, uint32_t *);
};
#define DELTA(p, d, cast) ((p) = (cast)((caddr_t)(p) + (d)))
--- sys/dev/wscons/wsconsio.h
+++ sys/dev/wscons/wsconsio.h
@@ -665,4 +665,27 @@
};
#define WSMUXIO_LIST_DEVICES _IOWR('W', 99, struct wsmux_device_list)
+/*
+struct wsdisplay_screendump_text {
+#define WSDISPLAYIO_SCREENDUMP_TEXT _IOWR('W', 160, struct wsdisplay_screendump_text)
+struct wsdisplay_screendump_pixels {
+#define WSDISPLAYIO_SCREENDUMP_PIXELS _IOWR('W', 161, struct wsdisplay_screendump_pixels)
#endif /* DEV_WSCONS_WSCONSIO_H */
--- sys/dev/wscons/wsdisplay.c
+++ sys/dev/wscons/wsdisplay.c
@@ -1161,6 +1161,39 @@
}
switch (cmd) {
{
int result;
struct wsemul_abortstate abortstate;
abortstate.skip=0;
WSEMULOP(result, scr->scr_dconf, &abortstate, screendump, (scr->scr_dconf->emulcookie, ((struct wsdisplay_screendump_pixels *)data)));
return (result);
}
{
struct wsdisplay_charcell cell;
+#define SCREENDUMP ((struct wsdisplay_screendump_text *)data)
+#define DISP_SIZE (SCREENDUMP->rows * SCREENDUMP->cols)
unsigned char * text_data;
unsigned int * attr_data;
int i;
/* The values of the following assignments will be copied back to userspace upon exit. */
SCREENDUMP->rows=N_ROWS(scr->scr_dconf);
SCREENDUMP->cols=N_COLS(scr->scr_dconf);
text_data=malloc(DISP_SIZE, M_IOCTLOPS, M_WAITOK);
attr_data=malloc(DISP_SIZE*sizeof(unsigned int), M_IOCTLOPS, M_WAITOK);
for (i=0; i<DISP_SIZE; i++) {
GETCHAR(scr, i, &cell);
*(text_data + i)=cell.uc;
*(attr_data + i)=cell.attr;
}
/* Only need to use copyout for things passed as pointers */
copyout (text_data, SCREENDUMP->textdata, DISP_SIZE);
copyout (attr_data, SCREENDUMP->attrdata, DISP_SIZE*sizeof(unsigned int));
free (text_data, M_IOCTLOPS, DISP_SIZE);
free (attr_data, M_IOCTLOPS, DISP_SIZE*sizeof(unsigned int));
return (0);
}
case WSDISPLAYIO_GMODE:
if (scr->scr_flags & SCR_GRAPHICS) {
if (scr->scr_flags & SCR_DUMBFB)
--- sys/dev/wscons/wsdisplayvar.h
+++ sys/dev/wscons/wsdisplayvar.h
@@ -84,6 +84,7 @@
uint32_t *attrp);
void (*unpack_attr)(void *c, uint32_t attr, int *fg, int *bg,
int *ul);
/* fg / bg values. Made identical to ANSI terminal color codes. */
#define WSCOL_BLACK 0
#define WSCOL_RED 1
�����������������������������������������������������������������������������������������������������������������������������������������������������demo������������������������������������������������������������������������������������������������0040755�0000000�0000000�00000000000�14420567271�0010616�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������demo/demo_256_and_attributes.c����������������������������������������������������������������������0100644�0000000�0000000�00000006255�14420464056�0015453�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*
*/
/*
*/
int main()
{
int i,j;
printf ("\x1b[m\n");
for (i=0;i<256;i++) {
printf ("\x1b[38;5;%dm#%03d %s",i,i, ((i+1) % 16 ? "" : "\n"));
}
printf ("\n");
for (i=0; i<32; i++) {
printf ("\x1b[m%s%s%s%s%s", ((i & 1) ? "\x1b[2m" : ""), ((i & 2) ? "\x1b[1m" : ""), ((i & 4) ? "\x1b[3m" : ""), ((i & 8) ? "\x1b[21m" : ""),
((i & 16) ? "\x1b[9m" :""));
j=printf ("This is %s%s%s%s%s%stext", i==0 ? "normal " : "", i & 1 ? "dim " : "", i & 2 ? "bold " : "", i & 4 ? "italic " : "",
i & 8 ? "double underlined " : "", i & 16 ? "struck " : "");
if (i % 2) {
printf ("\n");
} else {
printf ("\x1b[m");
printf (" "+j);
}
}
printf ("\x1b[mBack to normal.\n");
}
���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������demo/checksums.sig����������������������������������������������������������������������������������0100644�0000000�0000000�00000000426�14420567302�0013360�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������untrusted comment: verify with signify key from research.exoticsilicon.com
RWRn5d3Yx35u0/HBg2TnWAyGasvatbQkv3SwQR6fClpToRdNukAg/iQ9Ep8LzwWv2Rt5SlvjazEulNZsryx1RKWTFu+tbhZ2OAg=
SHA256 (demo_256_and_attributes.c) = d3a56ed92a0f493e623d1092e2053dbd85090b3d5d9ae301282353660cc0282c
������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������screendump_utilities��������������������������������������������������������������������������������0040755�0000000�0000000�00000000000�14420567014�0014125�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������screendump_utilities/screendump_graphical.c���������������������������������������������������������0100644�0000000�0000000�00000011124�14420263257�0020525�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*
*/
/*
*/
int main()
{
int fd_out;
int header_len;
int pos_in;
int pos_out;
int res;
int x;
int y;
struct wsdisplay_screendump_pixels screendump;
struct wsdisplay_fbinfo dispinfo;
unsigned char * header;
unsigned char * file_out;
unsigned char * processed_pixel_data;
/* Call WSDISPLAYIO_GINFO to get the size of the framebuffer. */
res=ioctl (STDIN_FILENO, WSDISPLAYIO_GINFO, &dispinfo);
if (res == -1) {
printf ("Ioctl WSDISPLAYIO_GINFO not supported for this device\n");
return (1);
}
/* Allocate the correct amount of memory for the screendump. */
screendump.data=malloc(dispinfo.stride * dispinfo.height);
res=ioctl (STDIN_FILENO, WSDISPLAYIO_SCREENDUMP_PIXELS, &screendump);
if (res == -1) {
printf ("Ioctl WSDISPLAYIO_SCREENDUMP_PIXELS not supported for this device\n");
return (1);
}
printf ("Ioctl WSDISPLAYIO_GINFO returned %d\nwidth %d, height %d, stride %d, depth %d\n", res, dispinfo.width, dispinfo.height, dispinfo.stride, dispinfo.depth);
printf ("Ioctl WSDISPLAYIO_SCREENDUMP_PIXELS returned %d\nwidth %d, height %d, stride %d, depth %d\n", res, screendump.width, screendump.height, screendump.stride, screendump.depth);
if (screendump.depth != 32) {
printf ("Only 32bpp input data is supported.\n");
return (1);
}
/*
*/
processed_pixel_data=malloc(screendump.width * screendump.height * 4);
pos_out=0;
pos_in=0;
for (y=0; y<screendump.height; y++) {
for (x=0; x<screendump.stride/4; x++) {
if (x<(screendump.width)) {
*(processed_pixel_data+pos_out++)=*(screendump.data+pos_in+2);
*(processed_pixel_data+pos_out++)=*(screendump.data+pos_in+1);
*(processed_pixel_data+pos_out++)=*(screendump.data+pos_in);
}
pos_in+=4;
}
}
header=malloc(1024);
header_len=sprintf (header, "P6\n%d %d\n255\n", screendump.width, screendump.height);
fd_out=open ("rgb_screendump.ppm", O_CREAT | O_WRONLY, 0644);
write (fd_out, header, header_len);
write (fd_out, processed_pixel_data, pos_out);
close (fd_out);
return (0);
}
��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������screendump_utilities/screendump_text.c��������������������������������������������������������������0100644�0000000�0000000�00000015200�14420263055�0017552�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*
*/
/*
*/
void colour_html(int cindex, unsigned char * return_col)
{
if (cindex < 16) {
*(return_col+3)=0;
*return_col=(cindex & 1 ? (cindex & 8 ? 'f' : '8') : '0');
*(return_col+1)=(cindex & 2 ? (cindex & 8 ? 'f' : '8') : '0');
*(return_col+2)=(cindex & 4 ? (cindex & 8 ? 'f' : '8') : '0');
if (cindex==7) {
*(return_col)='d';
*(return_col+1)='d';
*(return_col+2)='d';
}
if (cindex==8) {
*(return_col)='8';
*(return_col+1)='8';
*(return_col+2)='8';
}
return;
}
if (cindex < 232) {
*(return_col)=HEX(RED(cindex) >> 4);
*(return_col+1)=HEX(RED(cindex));
*(return_col+2)=HEX(GREEN(cindex) >> 4);
*(return_col+3)=HEX(GREEN(cindex));
*(return_col+4)=HEX(BLUE(cindex) >> 4);
*(return_col+5)=HEX(BLUE(cindex));
return ;
}
return ;
}
int main()
{
int fd;
int res;
int i, j;
int pos_in;
int spanopen;
unsigned int cattr;
struct wsdisplay_screendump_text screendump;
unsigned char * buffer;
unsigned char * pos_out;
unsigned char * return_col;
screendump.textdata=malloc(32768);
screendump.attrdata=malloc(65536);
res=ioctl (STDIN_FILENO, WSDISPLAYIO_SCREENDUMP_TEXT, &screendump);
if (res == -1) {
printf ("Ioctl WSDISPLAYIO_SCREENDUMP_TEXT not supported for this device\n");
return (1);
}
printf ("ioctl returned %d\nrows %d, cols %d\n", res, screendump.rows, screendump.cols);
/* Write raw text output to a file */
fd=open ("screendump.raw", O_WRONLY | O_CREAT | O_TRUNC, 0600);
write (fd, screendump.textdata, screendump.rows * screendump.cols);
close (fd);
/* Write line-delimited output to a file */
buffer=malloc(screendump.rows * (screendump.cols + 1));
j=0;
for (i=0 ; i < screendump.rows * screendump.cols ; i++) {
*(buffer+j++)=*(screendump.textdata+i);
if ((i+1) % screendump.cols == 0) {
while (j>0 && *(buffer + j - 1)==32) { j--; }
*(buffer+j++)=10;
}
}
fd=open ("screendump.asc", O_WRONLY | O_CREAT | O_TRUNC, 0600);
write (fd, buffer, j);
close (fd);
free (buffer);
/* Write HTML output to a file */
buffer=malloc(1024*1024);
pos_out=buffer;
spanopen=0;
/* Write HTML preamble */
pos_out+=sprintf(pos_out, "");
return_col=malloc(1024);
/* Process the output line-by-line */
for (i=0; i<screendump.rows; i++) {
pos_out+=sprintf(pos_out, "<div>");
for (j=0; j<screendump.cols; j++) {
if (j==0 || screendump.attrdata[LINEAR_POS]!=cattr) {
cattr=screendump.attrdata[LINEAR_POS];
if (j>0) {
pos_out+=sprintf(pos_out, "</span>");
}
pos_out+=sprintf(pos_out, "%s", "<span style='");
colour_html((cattr >> 16) & 0xff, return_col);
pos_out+=sprintf(pos_out, "background:#%s;", return_col);
colour_html((cattr >> 24) & 0xff, return_col);
pos_out+=sprintf(pos_out, "color:#%s;", return_col);
pos_out+=sprintf(pos_out, "font-weight:%d;", (cattr & WSATTR_HILIT ? 800 : 400));
pos_out+=sprintf(pos_out, "text-decoration:%s;", (cattr & WSATTR_UNDERLINE ? "underline" : "none"));
pos_out+=sprintf(pos_out, "%s", "'>");
}
switch (*(screendump.textdata+LINEAR_POS)) {
case '>':
pos_out+=sprintf(pos_out, "%s", ">");
break;
case '<':
pos_out+=sprintf(pos_out, "%s", "<");
break;
case '&':
pos_out+=sprintf(pos_out, "%s", "&");
break;
default:
*(pos_out++)=*(screendump.textdata+LINEAR_POS);
}
}
pos_out+=sprintf(pos_out, "</span></div>");
}
/* Write HTML trailer */
pos_out+=sprintf(pos_out, "");
fd=open ("screendump.html", O_WRONLY | O_CREAT | O_TRUNC, 0600);
write (fd, buffer, pos_out-buffer);
close (fd);
free (buffer);
free (return_col);
free (screendump.textdata);
free (screendump.attrdata);
return (0);
}
������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������screendump_utilities/checksums.sig������������������������������������������������������������������0100644�0000000�0000000�00000000561�14420567114�0016675�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������wheel������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������untrusted comment: verify with signify key from research.exoticsilicon.com
RWRn5d3Yx35u0xTS8QdGDJ3hkLf7ZYKx1L1j4BJyjksODnJTbMulleYqsnLQaI6uTXC481Ch55nDixUsxJs6+hCEA+SedeRPowU=
SHA256 (screendump_graphical.c) = 5887417b726246aef659a9040467fbccfb53e69081f0d9ec00381adc066ffe4a
SHA256 (screendump_text.c) = 3980ccb25dc28c1315689d349af62e6307d134100b2860bc3d5f9251dba1433f
�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
application/octet-stream
This content has been proxied by September (3851b).