sixel: implement P2=1 - transparent pixels

When P2=1, empty pixels are transparent.

This patch also changes the behavior of P2=0|2, from setting empty
pixels to the default background color, to instead use the *current*
background color.

To implement this, a couple of changes are needed:

* Sixel pixels always use alpha=1.0, except for *empty* cells when
  P2=1 (i.e. transparent pixels).
* The renderer draws sixels with the OVER operator, instead of the SRC
  operator.
* The renderer *must* now render the cells beneath the sixel. As an
  optimization, this is only done for sixels where P2=1. I.e. for
  fully opaque sixels, there’s no need to render the cells beneath.

The sixel renderer isn’t yet hooked into the multi-threaded
renderer. This means *rows* (not just the cells) beneath
maybe-transparent sixels are rendered single-threaded.

Closes #391.
This commit is contained in:
Daniel Eklöf 2021-03-09 17:23:55 +01:00
parent 5650120e08
commit 7d315d7bf9
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
5 changed files with 91 additions and 50 deletions

9
dcs.c
View file

@ -42,12 +42,17 @@ dcs_hook(struct terminal *term, uint8_t final)
switch (term->vt.private) {
case 0:
switch (final) {
case 'q':
sixel_init(term);
case 'q': {
int p1 = vt_param_get(term, 0, 0);
int p2 = vt_param_get(term, 1,0);
int p3 = vt_param_get(term, 2, 0);
sixel_init(term, p1, p2, p3);
term->vt.dcs.put_handler = &sixel_put;
term->vt.dcs.unhook_handler = &sixel_unhook;
break;
}
}
break;
case '=':