浏览代码

* Added basic support for a few Unicode characters to the X11 driver.

tags/v0.99.beta14
Sam Hocevar sam 18 年前
父节点
当前提交
9dd86c2766
共有 1 个文件被更改,包括 87 次插入23 次删除
  1. +87
    -23
      caca/driver_x11.c

+ 87
- 23
caca/driver_x11.c 查看文件

@@ -273,40 +273,104 @@ static void x11_display(caca_t *kk)
{
unsigned int yoff = (y + 1) * kk->drv.p->font_height
- kk->drv.p->font_offset;
uint32_t *chars = kk->qq->chars + y * kk->qq->width;

for(x = 0; x < kk->qq->width; x += len)
for(x = 0; x < kk->qq->width; x++, chars++)
{
char buffer[BUFSIZ]; /* FIXME: use a smaller buffer */
uint32_t *chars = kk->qq->chars + x + y * kk->qq->width;
uint8_t *attr = kk->qq->attr + x + y * kk->qq->width;

len = 1;

/* Skip spaces */
if(chars[0] == 0x00000020)
if(*chars == 0x00000020)
continue;

if(chars[0] > 0x00000020 && chars[0] < 0x00000080)
buffer[0] = (char)chars[0];
else
buffer[0] = '?';
XSetForeground(kk->drv.p->dpy, kk->drv.p->gc,
kk->drv.p->colors[*attr & 0xf]);

while(x + len < kk->qq->width
&& (attr[len] & 0xf) == (attr[0] & 0xf))
/* Plain ASCII, no problem. */
if(*chars > 0x00000020 && *chars < 0x00000080)
{
if(chars[len] == 0x00000020)
buffer[len] = ' ';
else if(chars[len] > 0x00000020 && chars[len] < 0x00000080)
buffer[len] = (char)chars[len];
else
buffer[len] = '?';
len++;
char c = (uint8_t)*chars;
XDrawString(kk->drv.p->dpy, kk->drv.p->pixmap, kk->drv.p->gc,
x * kk->drv.p->font_width, yoff, &c, 1);
continue;
}

XSetForeground(kk->drv.p->dpy, kk->drv.p->gc,
kk->drv.p->colors[attr[0] & 0xf]);
XDrawString(kk->drv.p->dpy, kk->drv.p->pixmap, kk->drv.p->gc,
x * kk->drv.p->font_width, yoff, buffer, len);
/* We want to be able to print a few special Unicode characters
* such as the CP437 gradients and half blocks. For unknown
* characters, just print '?'. */
switch(*chars)
{
case 0x00002580: /* ▀ */
XFillRectangle(kk->drv.p->dpy, kk->drv.p->pixmap,
kk->drv.p->gc,
x * kk->drv.p->font_width,
y * kk->drv.p->font_height,
kk->drv.p->font_width,
kk->drv.p->font_height / 2);
break;
case 0x00002584: /* ▄ */
XFillRectangle(kk->drv.p->dpy, kk->drv.p->pixmap,
kk->drv.p->gc,
x * kk->drv.p->font_width,
(y + 1) * kk->drv.p->font_height
- kk->drv.p->font_height / 2,
kk->drv.p->font_width,
kk->drv.p->font_height / 2);
break;
case 0x00002588: /* █ */
XFillRectangle(kk->drv.p->dpy, kk->drv.p->pixmap,
kk->drv.p->gc,
x * kk->drv.p->font_width,
y * kk->drv.p->font_height,
kk->drv.p->font_width,
kk->drv.p->font_height);
break;
case 0x0000258c: /* ▌ */
XFillRectangle(kk->drv.p->dpy, kk->drv.p->pixmap,
kk->drv.p->gc,
x * kk->drv.p->font_width,
y * kk->drv.p->font_height,
kk->drv.p->font_width / 2,
kk->drv.p->font_height);
break;
case 0x00002590: /* ▐ */
XFillRectangle(kk->drv.p->dpy, kk->drv.p->pixmap,
kk->drv.p->gc,
(x + 1) * kk->drv.p->font_width
- kk->drv.p->font_width / 2,
y * kk->drv.p->font_height,
kk->drv.p->font_width / 2,
kk->drv.p->font_height);
break;
case 0x00002593: /* ▓ */
case 0x00002592: /* ▒ */
case 0x00002591: /* ░ */
{
/* FIXME: this sucks utterly */
int i, j, k = *chars - 0x00002591;
for(j = kk->drv.p->font_height; j--; )
for(i = kk->drv.p->font_width; i--; )
{
if(((i + 2 * (j & 1)) & 3) > k)
continue;

XDrawPoint(kk->drv.p->dpy, kk->drv.p->pixmap,
kk->drv.p->gc,
x * kk->drv.p->font_width + i,
y * kk->drv.p->font_height + j);
}
break;
}
default:
{
char c;
c = '?';
XDrawString(kk->drv.p->dpy, kk->drv.p->pixmap,
kk->drv.p->gc,
x * kk->drv.p->font_width, yoff, &c, 1);
break;
}
}
}
}



正在加载...
取消
保存