box-drawing: draw shades as “antialiased” blocks

When rendering to an a8 surface, render shades using “transparent”
pixman rectangles.

When these glyphs are composited with a color, the resulting look is
the color, but darkened.
This commit is contained in:
Daniel Eklöf 2021-05-05 15:31:57 +02:00
parent d6898dcc42
commit b280928084
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

View file

@ -1676,40 +1676,58 @@ draw_right_half_block(struct buf *buf)
rect(round(buf->width / 2.), 0, buf->width, buf->height);
}
static void NOINLINE
draw_pixman_shade(struct buf *buf, uint16_t v)
{
pixman_color_t shade = {0, 0, 0, v};
pixman_image_fill_rectangles(
PIXMAN_OP_SRC, buf->pix, &shade, 1,
(pixman_rectangle16_t []){{0, 0, buf->width, buf->height}});
}
static void
draw_light_shade(struct buf *buf)
{
for (size_t row = 0; row < buf->height; row += 2) {
for (size_t col = 0; col < buf->width; col += 2) {
size_t idx = col / 8;
size_t bit_no = col % 8;
buf->data[row * buf->stride + idx] |= 1 << bit_no;
if (pixman_image_get_format(buf->pix) == PIXMAN_a1) {
for (size_t row = 0; row < buf->height; row += 2) {
for (size_t col = 0; col < buf->width; col += 2) {
size_t idx = col / 8;
size_t bit_no = col % 8;
buf->data[row * buf->stride + idx] |= 1 << bit_no;
}
}
}
} else
draw_pixman_shade(buf, 0x8000);
}
static void
draw_medium_shade(struct buf *buf)
{
for (size_t row = 0; row < buf->height; row++) {
for (size_t col = row % 2; col < buf->width; col += 2) {
size_t idx = col / 8;
size_t bit_no = col % 8;
buf->data[row * buf->stride + idx] |= 1 << bit_no;
if (pixman_image_get_format(buf->pix) == PIXMAN_a1) {
for (size_t row = 0; row < buf->height; row++) {
for (size_t col = row % 2; col < buf->width; col += 2) {
size_t idx = col / 8;
size_t bit_no = col % 8;
buf->data[row * buf->stride + idx] |= 1 << bit_no;
}
}
}
} else
draw_pixman_shade(buf, 0x4000);
}
static void
draw_dark_shade(struct buf *buf)
{
for (size_t row = 0; row < buf->height; row++) {
for (size_t col = 0; col < buf->width; col += 1 + row % 2) {
size_t idx = col / 8;
size_t bit_no = col % 8;
buf->data[row * buf->stride + idx] |= 1 << bit_no;
if (pixman_image_get_format(buf->pix) == PIXMAN_a1) {
for (size_t row = 0; row < buf->height; row++) {
for (size_t col = 0; col < buf->width; col += 1 + row % 2) {
size_t idx = col / 8;
size_t bit_no = col % 8;
buf->data[row * buf->stride + idx] |= 1 << bit_no;
}
}
}
} else
draw_pixman_shade(buf, 0x2000);
}
static void