On Monday, 26 May 2025 03:39:35 BST G. Branden Robinson wrote:
> 2. Deri submitted an interesting patch to grotty, implementing "true
> color" support.[3] I think it uses Thomas Dickey's xterm extension
> for 24-bit direct color support (terminology is all over the place
> in this area, and the patch suggests a familiarity mainly with the
> S-Lang view of the terminal color model, which I think is
> blinkered[4]).
>
> I'd like to merge the patch, but I'll likely whack on it a bit
> afterwards.
>
> In the meantime, it would be helpful to me, and possibly fun for
> groff users, if people tried applying the patch and exercising the
> new feature to see how it sits, and reported their findings here
> or to the Savannah ticket.[3]
>
> See y'all soon!
Hi Branden,
Have a nice holibobs.
Attached is a little test script which shows a graduated rainbow on one tty
line. I have a couple of queries.
A) Should tty.tmac now include all the named colours in ps.tmac since it can
show them all on the screen?
B) Currently I have implemented a -t flag for grotty to "turn on" 24 bit
colour support, rather than the legacy 4 bit colours, however, this is not
strictly necessary. If grotty starts up legacy mode it could switch to RGB
mode the first time the document it is processing uses a colour which is not
one of the 8 legacy colours. This would mean that any existing documents which
just used the legacy colours would render the same, but any new documents
which used RGB colours would automatically switch to the new mode.
There is a little wrinkle in the ointment (which is why I implemented a
separate flag to use 24 bit colours). Tty.tmac currently defines "yellow" as
rgb #ffff00 which is correct in rgb terms, but if you use \m[yellow] the text
or equivalent background is actually a brown, because there are only 8 colours
in 4 bit mode, the other 8 colours are "bright" versions of the 8 colours, and
grotty reserves the bright versions for the bold font, which means you only
get the true yellow using the bold font, which in turn means there is no
legacy way of getting the true "bright" yellow background. In 24 bit mode no
behind the scenes fiddling to the colour is done, you get exactly the colour
requested, if you use the bold font the glyph is emboldened but the colour
remains what was requested. This applies to all 8 legacy colours, even "black"
has a "bright" version! This means that in a new document if you used
\m[steelblue] before \m[yellow] you would get the proper yellow because it has
switched to RGB mode when producing the blue but if the order of the colours
is reversed then the yellow would be the legacy brown since grotty has not
switched to RGB mode until the steelblue is encountered. This is why I
introduced a new flag rather than deduce the desired mode algorithmically, but
people may prefer the convenience of the detection method not withstanding the
"wrinkle".
One advantage of using RGB mode text colours is that they will appear the same
on ps/pdf output.
Cheers
Deri
.\" Rainbow.trf
.\"
.\" Implementing this awk script in groff:-
.\"
.\" awk 'BEGIN{
.\" s="/\\/\\/\\/\\/\\"; s=s s s s s s s s;
.\" for (colnum = 0; colnum<77; colnum++) {
.\" r = 255-(colnum*255/76);
.\" g = (colnum*510/76);
.\" b = (colnum*255/76);
.\" if (g>255) g = 510-g;
.\" printf "\033[48;2;%d;%d;%dm", r,g,b;
.\" printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b;
.\" printf "%s\033[0m", substr(s,colnum+1,1);
.\" }
.\" printf "\n";
.\" }'
.\"
.\" Found at:-
.\"
.\" https://github.com/termstandard/colors?tab=readme-ov-file
.\"
.\" Run: ./test-groff -Tutf8 -P-t Rainbow.trf
.\"
.pl 10v
.ll 78n
.de cell
. nr r 255-((\\$1*255)/76)
. nr g (\\$1*510)/76
. nr b (\\$1*255)/76
. if \\n[g]>255 .nr g 510-\\n[g]
. nr fr 255-\\n[r]
. nr fg 255-\\n[g]
. nr fb 255-\\n[b]
. defcolor BG rgb \\n[r]u*256u+\\n[r]u \\n[g]u*256u+\\n[g]u \\n[b]u*256u+\\n[b]u
. defcolor FG rgb \\n[fr]u*256u+\\n[fr]u \\n[fg]u*256u+\\n[fg]u \\n[fb]u*256u+\\n[fb]u
. ds t /
. if \\$1%2 .ds t \[rs]
. nop \M[BG]\m[FG]\\*[t]\m[]\M[]\c
..
.nr col 0
.while \n[col]<77 \{\
. cell \n[col]
. nr col +1
\}\