Changeset 650
- Timestamp:
- Mar 19, 2006, 6:10:12 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcaca/trunk/caca/driver_x11.c
r640 r650 274 274 unsigned int yoff = (y + 1) * kk->drv.p->font_height 275 275 - 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 { 281 280 uint8_t *attr = kk->qq->attr + x + y * kk->qq->width; 282 281 283 len = 1;284 285 282 /* Skip spaces */ 286 if( chars[0]== 0x00000020)283 if(*chars == 0x00000020) 287 284 continue; 288 285 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) 296 291 { 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; 304 296 } 305 297 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 } 310 374 } 311 375 }
Note: See TracChangeset
for help on using the changeset viewer.