untrusted comment: verify with exoticsilicon_0.pub RWRn5d3Yx35u05hqNYN/1ObJW4d7sC2D/UOBsL3O5YS7dBPLwD4sWSgyABoiKmHGk5fVGHnyBPeqgRXAgu+X2yQz1vGsu54AfwI= --- dev/wscons/wsdisplayvar.h.dist Sun Sep 13 07:05:46 2020 +++ dev/wscons/wsdisplayvar.h Sat May 14 20:13:10 2022 @@ -99,6 +99,9 @@ #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 WSSCREEN_NAME_SIZE 16 --- dev/wscons/wsemul_vt100_subr.c.dist Mon May 25 06:55:49 2020 +++ dev/wscons/wsemul_vt100_subr.c Sat May 14 20:13:10 2022 @@ -549,6 +549,9 @@ case 1: /* bold */ flags |= WSATTR_HILIT; break; + case 2: /* dim */ + flags |= WSATTR_DIM; + break; case 4: /* underline */ flags |= WSATTR_UNDERLINE; break; @@ -558,17 +561,30 @@ case 7: /* reverse */ flags |= WSATTR_REVERSE; break; + case 9: /* strikethrough */ + flags |= WSATTR_STRIKE; + break; + case 21: /* double underline */ + flags |= WSATTR_DOUBLE_UNDERLINE; + break; case 22: /* ~bold VT300 only */ flags &= ~WSATTR_HILIT; + /* Disable dim attribute as well */ + flags &= ~WSATTR_DIM; break; case 24: /* ~underline VT300 only */ flags &= ~WSATTR_UNDERLINE; + /* Disable double underline attribute as well */ + flags &= ~WSATTR_DOUBLE_UNDERLINE; break; case 25: /* ~blink VT300 only */ flags &= ~WSATTR_BLINK; break; case 27: /* ~reverse VT300 only */ flags &= ~WSATTR_REVERSE; + break; + case 29: /* no strikethrough */ + flags &= ~WSATTR_STRIKE; break; case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: --- dev/rasops/rasops.c.dist Thu Jul 23 06:17:03 2020 +++ dev/rasops/rasops.c Sat May 14 20:13:10 2022 @@ -36,6 +36,8 @@ #include #include +int exotic=0; + #include #include #include @@ -545,7 +547,7 @@ int rasops_pack_cattr(void *cookie, int fg, int bg, int flg, uint32_t *attr) { - int swap; + int swap, strike, double_underline; #ifdef RASOPS_CLIPPING fg &= 7; @@ -568,6 +570,11 @@ if ((flg & WSATTR_HILIT) != 0) fg += 8; + /* Store values that will be overwritten */ + swap=((flg & WSATTR_DIM)==WSATTR_DIM ? 8 : 0); + strike=((flg & WSATTR_STRIKE)==WSATTR_STRIKE ? 16 : 0); + double_underline=((flg & WSATTR_DOUBLE_UNDERLINE)==WSATTR_DOUBLE_UNDERLINE ? 32 : 0); + flg = ((flg & WSATTR_UNDERLINE) ? 1 : 0); if (rasops_isgray[fg]) @@ -576,6 +583,10 @@ if (rasops_isgray[bg]) flg |= 4; + /* Restore saved values */ + flg |= (swap | strike); + flg |= (swap | double_underline); + *attr = (bg << 16) | (fg << 24) | flg; return (0); } @@ -879,6 +890,50 @@ else ri->ri_devcmap[i] = c; #else + +#define RED ((c & 0xff0000) >> 16) +#define GREEN ((c & 0x00ff00) >> 8) +#define BLUE (c & 0x0000ff) +#define GREY ((int)(((GREEN*0.7)+(RED*0.2)+(BLUE*0.1)))) + +switch (exotic) { + case 1: + /* Reduce blue component */ + #if defined (__amd64__) || defined (__i386__) + asm volatile ("shrb %%al;" : "+a" (c) : :); + #else + c=(c & 0xffff00) | ((c & 0xff)>>1); + #endif + break ; + + case 2: + /* Convert to green-scale */ + c=(int)(((GREEN*0.7)+(RED*0.2)+(BLUE*0.1)))<<8; + break ; + + case 3: + /* Convert to amber-scale */ + c=(GREY<<16)|(GREY<<8); + break ; + + case 4: + /* Convert to greyscale */ + c=((GREY<<16) | (GREY<<8) | GREY); + break ; + + case 5: + /* Convert to pink-scale */ + c=((GREY<<16) | ((GREY>>1)<<8) | (GREY>>1)); + break ; + + case 6: + /* Convert to greyscale and reduce blue component */ + c=((GREY<<16) | (GREY<<8) | (GREY>>1)); + break ; + + default: + break; +} ri->ri_devcmap[i] = c; #endif } @@ -908,6 +963,9 @@ int32_t *dp, clr; ri = (struct rasops_info *)cookie; + + /* Re-initialise the device colour map */ + rasops_init_devcmap (ri); #ifdef RASOPS_CLIPPING if (row < 0) { --- dev/rasops/rasops32.c.dist Mon Jul 20 09:40:45 2020 +++ dev/rasops/rasops32.c Sat May 14 20:13:10 2022 @@ -93,6 +93,12 @@ b = ri->ri_devcmap[(attr >> 16) & 0xf]; f = ri->ri_devcmap[(attr >> 24) & 0xf]; + + /* Implement dim if bit 3 of the attribute is set */ + if ((attr & 8)==8) { + f=(f>>1) & 0x007F7F7F; + } + 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; @@ -202,12 +208,36 @@ } } + /* If double underline is set, set single underline flag to paint that first */ + if ((attr & 32)==32) { attr |= 1; } + /* Do underline a pixel at a time */ if ((attr & 1) != 0) { rp -= step; for (cnt = 0; cnt < width; cnt++) ((int *)rp)[cnt] = f; } + + /* Double underline now just needs to paint the second underline two rows up */ + if ((attr & 32)==32) { + rp-=step; + rp-=step; + for (cnt=0; cnt< width; cnt++) + ((int *)rp)[cnt]=f; + /* Reset pointer to ensure that strikethough appears at a consistent height if combined with underlining */ + rp+=step; + rp+=step; + } + + if ((attr & 16)==16) { + /* Reset pointer to ensure that strikethough appears at a consistent height if combined with underlining */ + if ((attr & 1)==1) { + rp+=step ; + } + rp -= (1+ri->ri_font->fontheight/2)*step; + for (cnt=0; cnt< width; cnt++) + ((int *)rp)[cnt]=f; + } return 0; } --- sys/sysctl.h.dist Fri Feb 25 15:05:49 2022 +++ sys/sysctl.h Sat May 14 20:13:10 2022 @@ -191,7 +191,8 @@ #define KERN_TIMEOUT_STATS 87 /* struct: timeout status and stats */ #define KERN_UTC_OFFSET 88 /* int: adjust RTC time to UTC */ #define KERN_VIDEO 89 /* struct: video properties */ -#define KERN_MAXID 90 /* number of valid kern ids */ +#define KERN_EXOTIC 90 /* alternative framebuffer colour pallette */ +#define KERN_MAXID 91 /* number of valid kern ids */ #define CTL_KERN_NAMES { \ { 0, 0 }, \ @@ -284,6 +285,7 @@ { "timeout_stats", CTLTYPE_STRUCT }, \ { "utc_offset", CTLTYPE_INT }, \ { "video", CTLTYPE_STRUCT }, \ + { "exotic", CTLTYPE_INT }, \ } /* --- kern/kern_sysctl.c.dist Tue Aug 16 10:29:52 2022 +++ kern/kern_sysctl.c Sat Dec 24 12:39:06 2022 @@ -126,6 +126,8 @@ extern int audio_record_enable; extern int video_record_enable; +extern int exotic; + int allowkmem; int sysctl_diskinit(int, struct proc *); @@ -449,6 +451,10 @@ } switch (name[0]) { + + case KERN_EXOTIC: + return (sysctl_int(oldp, oldlenp, newp, newlen, &exotic)); + case KERN_OSTYPE: return (sysctl_rdstring(oldp, oldlenp, newp, ostype)); case KERN_OSRELEASE: