Ignore:
Timestamp:
Mar 19, 2006, 6:10:12 PM (15 years ago)
Author:
Sam Hocevar
Message:
  • Added basic support for a few Unicode characters to the X11 driver.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/driver_x11.c

    r640 r650  
    274274        unsigned int yoff = (y + 1) * kk->drv.p->font_height
    275275                                    - kk->drv.p->font_offset;
    276 
    277         for(x = 0; x < kk->qq->width; x += len)
    278         {
    279             char buffer[BUFSIZ]; /* FIXME: use a smaller buffer */
    280             uint32_t *chars = kk->qq->chars + x + y * kk->qq->width;
     276        uint32_t *chars = kk->qq->chars + y * kk->qq->width;
     277
     278        for(x = 0; x < kk->qq->width; x++, chars++)
     279        {
    281280            uint8_t *attr = kk->qq->attr + x + y * kk->qq->width;
    282281
    283             len = 1;
    284 
    285282            /* Skip spaces */
    286             if(chars[0] == 0x00000020)
     283            if(*chars == 0x00000020)
    287284                continue;
    288285
    289             if(chars[0] > 0x00000020 && chars[0] < 0x00000080)
    290                 buffer[0] = (char)chars[0];
    291             else
    292                 buffer[0] = '?';
    293 
    294             while(x + len < kk->qq->width
    295                    && (attr[len] & 0xf) == (attr[0] & 0xf))
     286            XSetForeground(kk->drv.p->dpy, kk->drv.p->gc,
     287                           kk->drv.p->colors[*attr & 0xf]);
     288
     289            /* Plain ASCII, no problem. */
     290            if(*chars > 0x00000020 && *chars < 0x00000080)
    296291            {
    297                 if(chars[len] == 0x00000020)
    298                     buffer[len] = ' ';
    299                 else if(chars[len] > 0x00000020 && chars[len] < 0x00000080)
    300                     buffer[len] = (char)chars[len];
    301                 else
    302                     buffer[len] = '?';
    303                 len++;
     292                char c = (uint8_t)*chars;
     293                XDrawString(kk->drv.p->dpy, kk->drv.p->pixmap, kk->drv.p->gc,
     294                            x * kk->drv.p->font_width, yoff, &c, 1);
     295                continue;
    304296            }
    305297
    306             XSetForeground(kk->drv.p->dpy, kk->drv.p->gc,
    307                            kk->drv.p->colors[attr[0] & 0xf]);
    308             XDrawString(kk->drv.p->dpy, kk->drv.p->pixmap, kk->drv.p->gc,
    309                         x * kk->drv.p->font_width, yoff, buffer, len);
     298            /* We want to be able to print a few special Unicode characters
     299             * such as the CP437 gradients and half blocks. For unknown
     300             * characters, just print '?'. */
     301            switch(*chars)
     302            {
     303                case 0x00002580: /* ▀ */
     304                    XFillRectangle(kk->drv.p->dpy, kk->drv.p->pixmap,
     305                                   kk->drv.p->gc,
     306                                   x * kk->drv.p->font_width,
     307                                   y * kk->drv.p->font_height,
     308                                   kk->drv.p->font_width,
     309                                   kk->drv.p->font_height / 2);
     310                    break;
     311                case 0x00002584: /* ▄ */
     312                    XFillRectangle(kk->drv.p->dpy, kk->drv.p->pixmap,
     313                                   kk->drv.p->gc,
     314                                   x * kk->drv.p->font_width,
     315                                   (y + 1) * kk->drv.p->font_height
     316                                           - kk->drv.p->font_height / 2,
     317                                   kk->drv.p->font_width,
     318                                   kk->drv.p->font_height / 2);
     319                    break;
     320                case 0x00002588: /* █ */
     321                    XFillRectangle(kk->drv.p->dpy, kk->drv.p->pixmap,
     322                                   kk->drv.p->gc,
     323                                   x * kk->drv.p->font_width,
     324                                   y * kk->drv.p->font_height,
     325                                   kk->drv.p->font_width,
     326                                   kk->drv.p->font_height);
     327                    break;
     328                case 0x0000258c: /* ▌ */
     329                    XFillRectangle(kk->drv.p->dpy, kk->drv.p->pixmap,
     330                                   kk->drv.p->gc,
     331                                   x * kk->drv.p->font_width,
     332                                   y * kk->drv.p->font_height,
     333                                   kk->drv.p->font_width / 2,
     334                                   kk->drv.p->font_height);
     335                    break;
     336                case 0x00002590: /* ▐ */
     337                    XFillRectangle(kk->drv.p->dpy, kk->drv.p->pixmap,
     338                                   kk->drv.p->gc,
     339                                   (x + 1) * kk->drv.p->font_width
     340                                           - kk->drv.p->font_width / 2,
     341                                   y * kk->drv.p->font_height,
     342                                   kk->drv.p->font_width / 2,
     343                                   kk->drv.p->font_height);
     344                    break;
     345                case 0x00002593: /* ▓ */
     346                case 0x00002592: /* ▒ */
     347                case 0x00002591: /* ░ */
     348                {
     349                    /* FIXME: this sucks utterly */
     350                    int i, j, k = *chars - 0x00002591;
     351                    for(j = kk->drv.p->font_height; j--; )
     352                        for(i = kk->drv.p->font_width; i--; )
     353                    {
     354                        if(((i + 2 * (j & 1)) & 3) > k)
     355                            continue;
     356
     357                        XDrawPoint(kk->drv.p->dpy, kk->drv.p->pixmap,
     358                                   kk->drv.p->gc,
     359                                   x * kk->drv.p->font_width + i,
     360                                   y * kk->drv.p->font_height + j);
     361                    }
     362                    break;
     363                }
     364                default:
     365                {
     366                    char c;
     367                    c = '?';
     368                    XDrawString(kk->drv.p->dpy, kk->drv.p->pixmap,
     369                                kk->drv.p->gc,
     370                                x * kk->drv.p->font_width, yoff, &c, 1);
     371                    break;
     372                }
     373            }
    310374        }
    311375    }
Note: See TracChangeset for help on using the changeset viewer.