| @@ -98,14 +98,14 @@ static unsigned int conio_get_window_height(caca_t *kk) | |||
| static void conio_display(caca_t *kk) | |||
| { | |||
| char *screen = kk->drv.p->screen; | |||
| uint8_t *attr = kk->qq->attr; | |||
| uint32_t *attr = kk->qq->attr; | |||
| uint32_t *chars = kk->qq->chars; | |||
| int n; | |||
| for(n = kk->qq->height * kk->qq->width; n--; ) | |||
| { | |||
| *screen++ = _cucul_utf32_to_cp437(*chars++); | |||
| *screen++ = *attr++; | |||
| *screen++ = _cucul_rgba32_to_ansi8(*attr++); | |||
| } | |||
| # if defined(SCREENUPDATE_IN_PC_H) | |||
| ScreenUpdate(kk->drv.p->screen); | |||
| @@ -245,12 +245,12 @@ static void gl_display(caca_t *kk) | |||
| line = 0; | |||
| for(y = 0; y < kk->drv.p->height; y += kk->drv.p->font_height) | |||
| { | |||
| uint8_t *attr = kk->qq->attr + line * kk->qq->width; | |||
| uint32_t *attr = kk->qq->attr + line * kk->qq->width; | |||
| for(x = 0; x < kk->drv.p->width; x += kk->drv.p->font_width) | |||
| { | |||
| glDisable(GL_TEXTURE_2D); | |||
| glColor4bv(gl_bgpal[attr[0] >> 4]); | |||
| glColor4bv(gl_bgpal[_cucul_rgba32_to_ansi4bg(*attr++)]); | |||
| glBegin(GL_QUADS); | |||
| glVertex2f(x, y); | |||
| glVertex2f(x + kk->drv.p->font_width, y); | |||
| @@ -258,8 +258,6 @@ static void gl_display(caca_t *kk) | |||
| y + kk->drv.p->font_height); | |||
| glVertex2f(x, y + kk->drv.p->font_height); | |||
| glEnd(); | |||
| attr++; | |||
| } | |||
| line++; | |||
| @@ -273,7 +271,7 @@ static void gl_display(caca_t *kk) | |||
| line = 0; | |||
| for(y = 0; y < kk->drv.p->height; y += kk->drv.p->font_height) | |||
| { | |||
| uint8_t *attr = kk->qq->attr + line * kk->qq->width; | |||
| uint32_t *attr = kk->qq->attr + line * kk->qq->width; | |||
| uint32_t *chars = kk->qq->chars + line * kk->qq->width; | |||
| for(x = 0; x < kk->drv.p->width; x += kk->drv.p->font_width) | |||
| @@ -283,7 +281,7 @@ static void gl_display(caca_t *kk) | |||
| if(c > 0x00000020 && c < 0x00000080) | |||
| { | |||
| glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[c - 32]); | |||
| glColor4bv(gl_bgpal[attr[0] & 0xf]); | |||
| glColor4bv(gl_bgpal[_cucul_rgba32_to_ansi4fg(*attr)]); | |||
| glBegin(GL_QUADS); | |||
| glTexCoord2f(0, kk->drv.p->sh); | |||
| glVertex2f(x, y); | |||
| @@ -190,14 +190,14 @@ static unsigned int ncurses_get_window_height(caca_t *kk) | |||
| static void ncurses_display(caca_t *kk) | |||
| { | |||
| int x, y; | |||
| uint8_t *attr = kk->qq->attr; | |||
| uint32_t *attr = kk->qq->attr; | |||
| uint32_t *chars = kk->qq->chars; | |||
| for(y = 0; y < (int)kk->qq->height; y++) | |||
| { | |||
| move(y, 0); | |||
| for(x = kk->qq->width; x--; ) | |||
| { | |||
| attrset(kk->drv.p->attr[*attr++]); | |||
| attrset(kk->drv.p->attr[_cucul_rgba32_to_ansi8(*attr++)]); | |||
| ncurses_write_utf32(*chars++); | |||
| } | |||
| } | |||
| @@ -55,7 +55,7 @@ static unsigned int raw_get_window_height(caca_t *kk) | |||
| static void raw_display(caca_t *kk) | |||
| { | |||
| uint8_t *attr = kk->qq->attr; | |||
| uint32_t *attr = kk->qq->attr; | |||
| uint32_t *chars = kk->qq->chars; | |||
| uint32_t w, h; | |||
| unsigned int n; | |||
| @@ -70,10 +70,11 @@ static void raw_display(caca_t *kk) | |||
| for(n = kk->qq->height * kk->qq->width; n--; ) | |||
| { | |||
| uint32_t c = *chars++; | |||
| uint8_t a = *attr++; | |||
| uint32_t a = *attr++; | |||
| fprintf(stdout, "%c%c%c%c%c", (c >> 24), (c >> 16) & 0xff, | |||
| (c >> 8) & 0xff, c & 0xff, a); | |||
| fprintf(stdout, "%c%c%c%c%c%c%c%c", | |||
| (c >> 24), (c >> 16) & 0xff, (c >> 8) & 0xff, c & 0xff, | |||
| (a >> 24), (a >> 16) & 0xff, (a >> 8) & 0xff, a & 0xff); | |||
| } | |||
| fprintf(stdout, "ACAC"); | |||
| @@ -202,7 +202,7 @@ static unsigned int slang_get_window_height(caca_t *kk) | |||
| static void slang_display(caca_t *kk) | |||
| { | |||
| int x, y; | |||
| uint8_t *attr = kk->qq->attr; | |||
| uint32_t *attr = kk->qq->attr; | |||
| uint32_t *chars = kk->qq->chars; | |||
| for(y = 0; y < (int)kk->qq->height; y++) | |||
| { | |||
| @@ -212,14 +212,14 @@ static void slang_display(caca_t *kk) | |||
| uint32_t c = *chars++; | |||
| #if defined(OPTIMISE_SLANG_PALETTE) | |||
| uint8_t fgcolor = *attr & 0xf; | |||
| uint8_t bgcolor = *attr >> 4; | |||
| uint8_t fgcolor = _cucul_rgba32_to_ansi4fg(*attr); | |||
| uint8_t bgcolor = _cucul_rgba32_to_ansi4bg(*attr); | |||
| /* If foreground == background, just don't use this colour | |||
| * pair, and print a space instead of the real character. */ | |||
| if(fgcolor != bgcolor) | |||
| { | |||
| SLsmg_set_color(slang_assoc[*attr++]); | |||
| SLsmg_set_color(slang_assoc[_cucul_rgba32_to_ansi8(*attr++)]); | |||
| slang_write_utf32(c); | |||
| } | |||
| else | |||
| @@ -236,7 +236,7 @@ static void slang_display(caca_t *kk) | |||
| attr++; | |||
| } | |||
| #else | |||
| SLsmg_set_color(*attr++); | |||
| SLsmg_set_color(_cucul_rgba32_to_ansi8(*attr++)); | |||
| slang_write_utf32(c); | |||
| #endif | |||
| } | |||
| @@ -116,14 +116,14 @@ static unsigned int vga_get_window_height(caca_t *kk) | |||
| static void vga_display(caca_t *kk) | |||
| { | |||
| char *screen = (char *)(intptr_t)0x000b8000; | |||
| uint8_t *attr = kk->qq->attr; | |||
| uint32_t *attr = kk->qq->attr; | |||
| uint32_t *chars = kk->qq->chars; | |||
| int n; | |||
| for(n = kk->qq->height * kk->qq->width; n--; ) | |||
| { | |||
| *screen++ = _cucul_utf32_to_cp437(*chars++); | |||
| *screen++ = *attr++; | |||
| *screen++ = _cucul_rgba32_to_ansi8(*attr++); | |||
| } | |||
| } | |||
| @@ -210,8 +210,8 @@ static void win32_display(caca_t *kk) | |||
| #endif | |||
| kk->drv.p->buffer[i].Attributes = | |||
| win32_fg_palette[kk->qq->attr[i] & 0xf] | |||
| | win32_bg_palette[kk->qq->attr[i] >> 4]; | |||
| win32_fg_palette[_cucul_rgba32_to_ansi4fg(kk->qq->attr[i])] | |||
| | win32_bg_palette[_cucul_rgba32_to_ansi4bg(kk->qq->attr[i])]; | |||
| } | |||
| /* Blit the screen buffer */ | |||
| @@ -259,15 +259,16 @@ static void x11_display(caca_t *kk) | |||
| { | |||
| for(x = 0; x < kk->qq->width; x += len) | |||
| { | |||
| uint8_t *attr = kk->qq->attr + x + y * kk->qq->width; | |||
| uint32_t *attr = kk->qq->attr + x + y * kk->qq->width; | |||
| uint8_t bg = _cucul_rgba32_to_ansi4bg(*attr); | |||
| len = 1; | |||
| while(x + len < kk->qq->width | |||
| && (attr[len] >> 4) == (attr[0] >> 4)) | |||
| && _cucul_rgba32_to_ansi4bg(attr[len]) == bg) | |||
| len++; | |||
| XSetForeground(kk->drv.p->dpy, kk->drv.p->gc, | |||
| kk->drv.p->colors[attr[0] >> 4]); | |||
| kk->drv.p->colors[_cucul_rgba32_to_ansi4bg(*attr)]); | |||
| 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, | |||
| len * kk->drv.p->font_width, kk->drv.p->font_height); | |||
| @@ -283,14 +284,14 @@ static void x11_display(caca_t *kk) | |||
| for(x = 0; x < kk->qq->width; x++, chars++) | |||
| { | |||
| uint8_t *attr = kk->qq->attr + x + y * kk->qq->width; | |||
| uint32_t *attr = kk->qq->attr + x + y * kk->qq->width; | |||
| /* Skip spaces */ | |||
| if(*chars == 0x00000020) | |||
| continue; | |||
| XSetForeground(kk->drv.p->dpy, kk->drv.p->gc, | |||
| kk->drv.p->colors[*attr & 0xf]); | |||
| kk->drv.p->colors[_cucul_rgba32_to_ansi4fg(*attr)]); | |||
| /* Plain ASCII, no problem. */ | |||
| if(*chars > 0x00000020 && *chars < 0x00000080) | |||
| @@ -11,6 +11,7 @@ libcucul_la_SOURCES = \ | |||
| canvas.c \ | |||
| transform.c \ | |||
| charset.c \ | |||
| colour.c \ | |||
| math.c \ | |||
| line.c \ | |||
| box.c \ | |||
| @@ -81,7 +81,7 @@ void cucul_putchar(cucul_t *qq, int x, int y, char c) | |||
| c = 0x20; | |||
| qq->chars[x + y * qq->width] = c; | |||
| qq->attr[x + y * qq->width] = (qq->bgcolor << 4) | qq->fgcolor; | |||
| qq->attr[x + y * qq->width] = (qq->bgcolor << 16) | qq->fgcolor; | |||
| } | |||
| /** \brief Print a string. | |||
| @@ -97,8 +97,7 @@ void cucul_putchar(cucul_t *qq, int x, int y, char c) | |||
| */ | |||
| void cucul_putstr(cucul_t *qq, int x, int y, char const *s) | |||
| { | |||
| uint32_t *chars; | |||
| uint8_t *attr; | |||
| uint32_t *chars, *attr; | |||
| unsigned int len; | |||
| if(y < 0 || y >= (int)qq->height || x >= (int)qq->width) | |||
| @@ -124,7 +123,7 @@ void cucul_putstr(cucul_t *qq, int x, int y, char const *s) | |||
| while(len) | |||
| { | |||
| *chars++ = _cucul_utf8_to_utf32(s); | |||
| *attr++ = (qq->bgcolor << 4) | qq->fgcolor; | |||
| *attr++ = (qq->bgcolor << 16) | qq->fgcolor; | |||
| s = _cucul_skip_utf8(s, 1); | |||
| len--; | |||
| @@ -239,7 +238,7 @@ void cucul_blit(cucul_t *dst, int x, int y, | |||
| (endi - starti) * 4); | |||
| memcpy(dst->attr + (j + y) * dst->width + starti + x, | |||
| src->attr + j * src->width + starti, | |||
| (endi - starti) * 1); | |||
| (endi - starti) * 4); | |||
| } | |||
| } | |||
| } | |||
| @@ -255,6 +254,6 @@ void _cucul_putchar32(cucul_t *qq, int x, int y, uint32_t c) | |||
| return; | |||
| qq->chars[x + y * qq->width] = c; | |||
| qq->attr[x + y * qq->width] = (qq->bgcolor << 4) | qq->fgcolor; | |||
| qq->attr[x + y * qq->width] = (qq->bgcolor << 16) | qq->fgcolor; | |||
| } | |||
| @@ -0,0 +1,45 @@ | |||
| /* | |||
| * libcucul Canvas for ultrafast compositing of Unicode letters | |||
| * Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org> | |||
| * All Rights Reserved | |||
| * | |||
| * This library is free software; you can redistribute it and/or | |||
| * modify it under the terms of the Do What The Fuck You Want To | |||
| * Public License, Version 2, as published by Sam Hocevar. See | |||
| * http://sam.zoy.org/wtfpl/COPYING for more details. | |||
| */ | |||
| /** \file colour.c | |||
| * \version \$Id$ | |||
| * \author Sam Hocevar <sam@zoy.org> | |||
| * \brief Colour handling | |||
| * | |||
| * This file contains functions for converting colour values between | |||
| * various colourspaces. | |||
| */ | |||
| #include "config.h" | |||
| #include "cucul.h" | |||
| #include "cucul_internals.h" | |||
| /* FIXME: could this be inlined? */ | |||
| uint8_t _cucul_rgba32_to_ansi8(uint32_t c) | |||
| { | |||
| /* FIXME: we need nearest colour handling for non-ANSI */ | |||
| return (c & 0x0000000f) | ((c & 0x000f0000) >> 12); | |||
| } | |||
| uint8_t _cucul_rgba32_to_ansi4fg(uint32_t c) | |||
| { | |||
| /* FIXME: we need nearest colour handling for non-ANSI */ | |||
| return c & 0x0000000f; | |||
| } | |||
| uint8_t _cucul_rgba32_to_ansi4bg(uint32_t c) | |||
| { | |||
| /* FIXME: we need nearest colour handling for non-ANSI */ | |||
| return (c & 0x000f0000) >> 16; | |||
| } | |||
| @@ -21,6 +21,7 @@ | |||
| #include "config.h" | |||
| #if !defined(__KERNEL__) | |||
| # include <stdio.h> | |||
| # include <stdlib.h> | |||
| # include <string.h> | |||
| #endif | |||
| @@ -93,7 +94,7 @@ cucul_t *cucul_load(void *data, unsigned int size) | |||
| if(!width || !height) | |||
| return NULL; | |||
| if(size != 12 + width * height * 5 + 4) | |||
| if(size != 12 + width * height * 8 + 4) | |||
| return NULL; | |||
| if(buf[size - 4] != 'A' || buf[size - 3] != 'C' | |||
| @@ -107,11 +108,14 @@ cucul_t *cucul_load(void *data, unsigned int size) | |||
| for(n = height * width; n--; ) | |||
| { | |||
| qq->chars[n] = ((uint32_t)buf[12 + 5 * n] << 24) | |||
| | ((uint32_t)buf[13 + 5 * n] << 16) | |||
| | ((uint32_t)buf[14 + 5 * n] << 8) | |||
| | (uint32_t)buf[15 + 5 * n]; | |||
| qq->attr[n] = buf[16 + 5 * n]; | |||
| qq->chars[n] = ((uint32_t)buf[12 + 8 * n] << 24) | |||
| | ((uint32_t)buf[13 + 8 * n] << 16) | |||
| | ((uint32_t)buf[14 + 8 * n] << 8) | |||
| | (uint32_t)buf[15 + 8 * n]; | |||
| qq->attr[n] = ((uint32_t)buf[16 + 8 * n] << 24) | |||
| | ((uint32_t)buf[17 + 8 * n] << 16) | |||
| | ((uint32_t)buf[18 + 8 * n] << 8) | |||
| | (uint32_t)buf[19 + 8 * n]; | |||
| } | |||
| return qq; | |||
| @@ -299,7 +303,7 @@ void _cucul_set_size(cucul_t *qq, unsigned int width, unsigned int height) | |||
| if(new_size > old_size) | |||
| { | |||
| qq->chars = realloc(qq->chars, new_size * sizeof(uint32_t)); | |||
| qq->attr = realloc(qq->attr, new_size * sizeof(uint8_t)); | |||
| qq->attr = realloc(qq->attr, new_size * sizeof(uint32_t)); | |||
| } | |||
| /* Step 2: move line data if necessary. */ | |||
| @@ -325,7 +329,7 @@ void _cucul_set_size(cucul_t *qq, unsigned int width, unsigned int height) | |||
| for(x = width - old_width; x--; ) | |||
| qq->chars[y * width + old_width + x] = (uint32_t)' '; | |||
| memset(qq->attr + y * width + old_width, 0, | |||
| width - old_width); | |||
| (width - old_width) * 4); | |||
| } | |||
| } | |||
| else | |||
| @@ -351,14 +355,14 @@ void _cucul_set_size(cucul_t *qq, unsigned int width, unsigned int height) | |||
| for(x = (height - old_height) * width; x--; ) | |||
| qq->chars[old_height * width + x] = (uint32_t)' '; | |||
| memset(qq->attr + old_height * width, 0, | |||
| (height - old_height) * width); | |||
| (height - old_height) * width * 4); | |||
| } | |||
| /* Step 4: if new area is smaller, resize memory area now. */ | |||
| if(new_size <= old_size) | |||
| { | |||
| qq->chars = realloc(qq->chars, new_size * sizeof(uint32_t)); | |||
| qq->attr = realloc(qq->attr, new_size * sizeof(uint8_t)); | |||
| qq->attr = realloc(qq->attr, new_size * sizeof(uint32_t)); | |||
| } | |||
| /* Recompute the scratch line and the empty line */ | |||
| @@ -37,7 +37,7 @@ struct cucul_context | |||
| unsigned int width, height; | |||
| uint32_t *chars; | |||
| uint8_t *attr; | |||
| uint32_t *attr; | |||
| char *empty_line, *scratch_line; | |||
| enum cucul_color fgcolor; | |||
| @@ -61,6 +61,11 @@ extern uint32_t _cucul_utf8_to_utf32(char const *); | |||
| extern uint8_t _cucul_utf32_to_cp437(uint32_t); | |||
| extern uint32_t _cucul_cp437_to_utf32(uint8_t); | |||
| /* Colour functions */ | |||
| uint8_t _cucul_rgba32_to_ansi8(uint32_t); | |||
| uint8_t _cucul_rgba32_to_ansi4fg(uint32_t); | |||
| uint8_t _cucul_rgba32_to_ansi4bg(uint32_t); | |||
| /* Export functions */ | |||
| extern void _cucul_get_ansi(cucul_t *, struct cucul_export *); | |||
| extern void _cucul_get_html(cucul_t *, struct cucul_export *); | |||
| @@ -58,7 +58,7 @@ void _cucul_get_ansi(cucul_t *qq, struct cucul_export *ex) | |||
| for(y = 0; y < qq->height; y++) | |||
| { | |||
| uint8_t *lineattr = qq->attr + y * qq->width; | |||
| uint32_t *lineattr = qq->attr + y * qq->width; | |||
| uint32_t *linechar = qq->chars + y * qq->width; | |||
| uint8_t prevfg = -1; | |||
| @@ -66,8 +66,8 @@ void _cucul_get_ansi(cucul_t *qq, struct cucul_export *ex) | |||
| for(x = 0; x < qq->width; x++) | |||
| { | |||
| uint8_t fg = palette[lineattr[x] & 0x0f]; | |||
| uint8_t bg = palette[lineattr[x] >> 4]; | |||
| uint8_t fg = _cucul_rgba32_to_ansi4fg(lineattr[x]); | |||
| uint8_t bg = _cucul_rgba32_to_ansi4bg(lineattr[x]); | |||
| uint32_t c = linechar[x]; | |||
| if(fg != prevfg || bg != prevbg) | |||
| @@ -72,12 +72,13 @@ void _cucul_get_html(cucul_t *qq, struct cucul_export *ex) | |||
| for(y = 0; y < qq->height; y++) | |||
| { | |||
| uint8_t *lineattr = qq->attr + y * qq->width; | |||
| uint32_t *lineattr = qq->attr + y * qq->width; | |||
| uint32_t *linechar = qq->chars + y * qq->width; | |||
| for(x = 0; x < qq->width; x += len) | |||
| { | |||
| cur += sprintf(cur, "<span class='b%02x'>", lineattr[x]); | |||
| cur += sprintf(cur, "<span class='b%02x'>", | |||
| _cucul_rgba32_to_ansi8(lineattr[x])); | |||
| for(len = 0; | |||
| x + len < qq->width && lineattr[x + len] == lineattr[x]; | |||
| @@ -141,7 +142,7 @@ void _cucul_get_html3(cucul_t *qq, struct cucul_export *ex) | |||
| for(y = 0; y < qq->height; y++) | |||
| { | |||
| uint8_t *lineattr = qq->attr + y * qq->width; | |||
| uint32_t *lineattr = qq->attr + y * qq->width; | |||
| uint32_t *linechar = qq->chars + y * qq->width; | |||
| cur += sprintf(cur, "<tr>"); | |||
| @@ -156,13 +157,14 @@ void _cucul_get_html3(cucul_t *qq, struct cucul_export *ex) | |||
| while(x + len < qq->width && lineattr[x + len] == lineattr[x]) | |||
| len++; | |||
| cur += sprintf(cur, "<td bgcolor=#%06x", palette[lineattr[x] >> 4]); | |||
| cur += sprintf(cur, "<td bgcolor=#%06x", | |||
| _cucul_rgba32_to_ansi4bg(lineattr[x])); | |||
| if(len > 1) | |||
| cur += sprintf(cur, " colspan=%d", len); | |||
| cur += sprintf(cur, "><font color=#%06x>", | |||
| palette[lineattr[x] & 0x0f]); | |||
| _cucul_rgba32_to_ansi4fg(lineattr[x])); | |||
| for(i = 0; i < len; i++) | |||
| { | |||
| @@ -62,7 +62,7 @@ void _cucul_get_irc(cucul_t *qq, struct cucul_export *ex) | |||
| for(y = 0; y < qq->height; y++) | |||
| { | |||
| uint8_t *lineattr = qq->attr + y * qq->width; | |||
| uint32_t *lineattr = qq->attr + y * qq->width; | |||
| uint32_t *linechar = qq->chars + y * qq->width; | |||
| uint8_t prevfg = -1; | |||
| @@ -70,8 +70,8 @@ void _cucul_get_irc(cucul_t *qq, struct cucul_export *ex) | |||
| for(x = 0; x < qq->width; x++) | |||
| { | |||
| uint8_t fg = palette[lineattr[x] & 0x0f]; | |||
| uint8_t bg = palette[lineattr[x] >> 4]; | |||
| uint8_t fg = palette[_cucul_rgba32_to_ansi4fg(lineattr[x])]; | |||
| uint8_t bg = palette[_cucul_rgba32_to_ansi4bg(lineattr[x])]; | |||
| uint32_t c = linechar[x]; | |||
| if(bg == prevbg) | |||
| @@ -85,12 +85,12 @@ void _cucul_get_ps(cucul_t *qq, struct cucul_export *ex) | |||
| /* Background, drawn using csquare macro defined in header */ | |||
| for(y = qq->height; y--; ) | |||
| { | |||
| uint8_t *lineattr = qq->attr + y * qq->width; | |||
| uint32_t *lineattr = qq->attr + y * qq->width; | |||
| for(x = 0; x < qq->width; x++) | |||
| { | |||
| cur += sprintf(cur, "1 0 translate\n %s csquare\n", | |||
| palette[*lineattr++ >> 4]); | |||
| _cucul_rgba32_to_ansi4bg(*lineattr++)); | |||
| } | |||
| /* Return to beginning of the line, and jump to the next one */ | |||
| @@ -101,7 +101,7 @@ void _cucul_get_ps(cucul_t *qq, struct cucul_export *ex) | |||
| for(y = qq->height; y--; ) | |||
| { | |||
| uint8_t *lineattr = qq->attr + (qq->height - y - 1) * qq->width; | |||
| uint32_t *lineattr = qq->attr + (qq->height - y - 1) * qq->width; | |||
| uint32_t *linechar = qq->chars + (qq->height - y - 1) * qq->width; | |||
| for(x = 0; x < qq->width; x++) | |||
| @@ -111,7 +111,7 @@ void _cucul_get_ps(cucul_t *qq, struct cucul_export *ex) | |||
| cur += sprintf(cur, "newpath\n"); | |||
| cur += sprintf(cur, "%d %d moveto\n", (x + 1) * 6, y * 10); | |||
| cur += sprintf(cur, "%s setrgbcolor\n", | |||
| palette[*lineattr++ & 0x0f]); | |||
| _cucul_rgba32_to_ansi4fg(*lineattr++)); | |||
| if(c < 0x00000020) | |||
| cur += sprintf(cur, "(?) show\n"); | |||
| @@ -82,20 +82,21 @@ void _cucul_get_svg(cucul_t *qq, struct cucul_export *ex) | |||
| /* Background */ | |||
| for(y = 0; y < qq->height; y++) | |||
| { | |||
| uint8_t *lineattr = qq->attr + y * qq->width; | |||
| uint32_t *lineattr = qq->attr + y * qq->width; | |||
| for(x = 0; x < qq->width; x++) | |||
| { | |||
| cur += sprintf(cur, "<rect class=\"b%02x\" x=\"%d\" y=\"%d\"" | |||
| " width=\"6\" height=\"10\"/>\n", | |||
| *lineattr++, x * 6, y * 10); | |||
| _cucul_rgba32_to_ansi8(*lineattr++), | |||
| x * 6, y * 10); | |||
| } | |||
| } | |||
| /* Text */ | |||
| for(y = 0; y < qq->height; y++) | |||
| { | |||
| uint8_t *lineattr = qq->attr + y * qq->width; | |||
| uint32_t *lineattr = qq->attr + y * qq->width; | |||
| uint32_t *linechar = qq->chars + y * qq->width; | |||
| for(x = 0; x < qq->width; x++) | |||
| @@ -103,7 +104,8 @@ void _cucul_get_svg(cucul_t *qq, struct cucul_export *ex) | |||
| uint32_t c = *linechar++; | |||
| cur += sprintf(cur, "<text class=\"f%02x\" x=\"%d\" y=\"%d\">", | |||
| *lineattr++, x * 6, (y * 10) + 10); | |||
| _cucul_rgba32_to_ansi8(*lineattr++), | |||
| x * 6, (y * 10) + 10); | |||
| if(c < 0x00000020) | |||
| cur += sprintf(cur, "?"); | |||
| else if(c > 0x0000007f) | |||
| @@ -38,12 +38,12 @@ static uint32_t rotatechar(uint32_t ch); | |||
| */ | |||
| void cucul_invert(cucul_t *qq) | |||
| { | |||
| uint8_t *attr = qq->attr; | |||
| uint32_t *attr = qq->attr; | |||
| unsigned int i; | |||
| for(i = qq->height * qq->width; i--; ) | |||
| { | |||
| *attr = ~*attr; | |||
| *attr = *attr ^ 0x000f000f; | |||
| attr++; | |||
| } | |||
| } | |||
| @@ -63,13 +63,13 @@ void cucul_flip(cucul_t *qq) | |||
| { | |||
| uint32_t *cleft = qq->chars + y * qq->width; | |||
| uint32_t *cright = cleft + qq->width - 1; | |||
| uint8_t *aleft = qq->attr + y * qq->width; | |||
| uint8_t *aright = aleft + qq->width - 1; | |||
| uint32_t *aleft = qq->attr + y * qq->width; | |||
| uint32_t *aright = aleft + qq->width - 1; | |||
| while(cleft < cright) | |||
| { | |||
| uint32_t ch; | |||
| uint8_t attr; | |||
| uint32_t attr; | |||
| /* Swap attributes */ | |||
| attr = *aright; *aright = *aleft; *aleft = attr; | |||
| @@ -100,13 +100,13 @@ void cucul_flop(cucul_t *qq) | |||
| { | |||
| uint32_t *ctop = qq->chars + x; | |||
| uint32_t *cbottom = ctop + qq->width * (qq->height - 1); | |||
| uint8_t *atop = qq->attr + x; | |||
| uint8_t *abottom = atop + qq->width * (qq->height - 1); | |||
| uint32_t *atop = qq->attr + x; | |||
| uint32_t *abottom = atop + qq->width * (qq->height - 1); | |||
| while(ctop < cbottom) | |||
| { | |||
| uint32_t ch; | |||
| uint8_t attr; | |||
| uint32_t attr; | |||
| /* Swap attributes */ | |||
| attr = *abottom; *abottom = *atop; *atop = attr; | |||
| @@ -135,13 +135,13 @@ void cucul_rotate(cucul_t *qq) | |||
| { | |||
| uint32_t *cbegin = qq->chars; | |||
| uint32_t *cend = cbegin + qq->width * qq->height - 1; | |||
| uint8_t *abegin = qq->attr; | |||
| uint8_t *aend = abegin + qq->width * qq->height - 1; | |||
| uint32_t *abegin = qq->attr; | |||
| uint32_t *aend = abegin + qq->width * qq->height - 1; | |||
| while(cbegin < cend) | |||
| { | |||
| uint32_t ch; | |||
| uint8_t attr; | |||
| uint32_t attr; | |||
| /* Swap attributes */ | |||
| attr = *aend; *aend = *abegin; *abegin = attr; | |||
| @@ -214,7 +214,7 @@ int main(void) | |||
| height = ((uint32_t)buf[8] << 24) | ((uint32_t)buf[9] << 16) | |||
| | ((uint32_t)buf[10] << 8) | (uint32_t)buf[11]; | |||
| size = 12 + width * height * 5 + 4; | |||
| size = 12 + width * height * 8 + 4; | |||
| buf = server->input = realloc(server->input, size); | |||
| read(0, buf + 12, size - 12); | |||