as bold or underline. No higher level support for these yet, but at
least everything is consistent.
* Created cucul_set_attr_ansi() and cucul_set_attr_argb() which are bound
to replace cucul_set_color() and cucul_set_truecolor().
tags/v0.99.beta14
| @@ -130,7 +130,8 @@ enum caca_feature | |||
| #define caca_get_mouse_y() caca_get_mouse_y(__caca0_dp) | |||
| #define caca_set_color(x, y) \ | |||
| (__caca0_fg = (x), __caca0_bg = (y), cucul_set_color(__caca0_cv, x, y)) | |||
| (__caca0_fg = (x), __caca0_bg = (y), \ | |||
| cucul_set_attr_ansi(__caca0_cv, x, y, 0)) | |||
| #define caca_get_fg_color() __caca0_fg | |||
| #define caca_get_bg_color() __caca0_bg | |||
| #define caca_get_color_name cucul_get_color_name | |||
| @@ -97,7 +97,7 @@ static unsigned int conio_get_display_height(caca_display_t *dp) | |||
| static void conio_display(caca_display_t *dp) | |||
| { | |||
| char *screen = dp->drv.p->screen; | |||
| uint32_t *attr = dp->cv->attr; | |||
| uint32_t *attrs = dp->cv->attrs; | |||
| uint32_t *chars = dp->cv->chars; | |||
| unsigned int n; | |||
| @@ -107,13 +107,13 @@ static void conio_display(caca_display_t *dp) | |||
| if(n && *chars == CUCUL_MAGIC_FULLWIDTH) | |||
| { | |||
| *screen++ = '['; | |||
| *screen++ = _cucul_argb32_to_ansi8(*attr++); | |||
| *screen++ = _cucul_attr_to_ansi8(*attrs++); | |||
| ch = ']'; | |||
| chars++; | |||
| n--; | |||
| } | |||
| *screen++ = ch; | |||
| *screen++ = _cucul_argb32_to_ansi8(*attr++); | |||
| *screen++ = _cucul_attr_to_ansi8(*attrs++); | |||
| } | |||
| # if defined(SCREENUPDATE_IN_PC_H) | |||
| ScreenUpdate(dp->drv.p->screen); | |||
| @@ -214,12 +214,12 @@ static void gl_display(caca_display_t *dp) | |||
| line = 0; | |||
| for(y = 0; y < dp->drv.p->height; y += dp->drv.p->font_height) | |||
| { | |||
| uint32_t *attr = dp->cv->attr + line * dp->cv->width; | |||
| uint32_t *attrs = dp->cv->attrs + line * dp->cv->width; | |||
| /* FIXME: optimise using stride */ | |||
| for(x = 0; x < dp->drv.p->width; x += dp->drv.p->font_width) | |||
| { | |||
| uint16_t bg = _cucul_argb32_to_rgb12bg(*attr++); | |||
| uint16_t bg = _cucul_attr_to_rgb12bg(*attrs++); | |||
| glColor4b(((bg & 0xf00) >> 8) * 8, | |||
| ((bg & 0x0f0) >> 4) * 8, | |||
| @@ -244,10 +244,10 @@ static void gl_display(caca_display_t *dp) | |||
| line = 0; | |||
| for(y = 0; y < dp->drv.p->height; y += dp->drv.p->font_height, line++) | |||
| { | |||
| uint32_t *attr = dp->cv->attr + line * dp->cv->width; | |||
| uint32_t *attrs = dp->cv->attrs + line * dp->cv->width; | |||
| uint32_t *chars = dp->cv->chars + line * dp->cv->width; | |||
| for(x = 0; x < dp->drv.p->width; x += dp->drv.p->font_width, attr++) | |||
| for(x = 0; x < dp->drv.p->width; x += dp->drv.p->font_width, attrs++) | |||
| { | |||
| uint32_t ch = *chars++; | |||
| uint16_t fg; | |||
| @@ -271,7 +271,7 @@ static void gl_display(caca_display_t *dp) | |||
| dp->drv.p->txid[b + ch | |||
| - (uint32_t)dp->drv.p->blocks[i]]); | |||
| fg = _cucul_argb32_to_rgb12fg(*attr); | |||
| fg = _cucul_attr_to_rgb12fg(*attrs); | |||
| glColor3b(((fg & 0xf00) >> 8) * 8, | |||
| ((fg & 0x0f0) >> 4) * 8, | |||
| (fg & 0x00f) * 8); | |||
| @@ -291,7 +291,7 @@ static void gl_display(caca_display_t *dp) | |||
| if(fullwidth) | |||
| { | |||
| chars++; attr++; x += dp->drv.p->font_width; | |||
| chars++; attrs++; x += dp->drv.p->font_width; | |||
| } | |||
| } | |||
| } | |||
| @@ -196,14 +196,14 @@ static unsigned int ncurses_get_display_height(caca_display_t *dp) | |||
| static void ncurses_display(caca_display_t *dp) | |||
| { | |||
| int x, y; | |||
| uint32_t *attr = dp->cv->attr; | |||
| uint32_t *attrs = dp->cv->attrs; | |||
| uint32_t *chars = dp->cv->chars; | |||
| for(y = 0; y < (int)dp->cv->height; y++) | |||
| { | |||
| move(y, 0); | |||
| for(x = dp->cv->width; x--; ) | |||
| { | |||
| attrset(dp->drv.p->attr[_cucul_argb32_to_ansi8(*attr++)]); | |||
| attrset(dp->drv.p->attr[_cucul_attr_to_ansi8(*attrs++)]); | |||
| ncurses_write_utf32(*chars++); | |||
| } | |||
| } | |||
| @@ -201,7 +201,7 @@ static unsigned int slang_get_display_height(caca_display_t *dp) | |||
| static void slang_display(caca_display_t *dp) | |||
| { | |||
| int x, y; | |||
| uint32_t *attr = dp->cv->attr; | |||
| uint32_t *attrs = dp->cv->attrs; | |||
| uint32_t *chars = dp->cv->chars; | |||
| for(y = 0; y < (int)dp->cv->height; y++) | |||
| { | |||
| @@ -217,8 +217,8 @@ static void slang_display(caca_display_t *dp) | |||
| * here for, and in cases where SLang does not render | |||
| * bright backgrounds, it's just fucked up. */ | |||
| #if 0 | |||
| uint8_t fgcolor = _cucul_argb32_to_ansi4fg(*attr); | |||
| uint8_t bgcolor = _cucul_argb32_to_ansi4bg(*attr); | |||
| uint8_t fgcolor = _cucul_attr_to_ansi4fg(*attrs); | |||
| uint8_t bgcolor = _cucul_attr_to_ansi4bg(*attrs); | |||
| if(fgcolor == bgcolor) | |||
| { | |||
| @@ -231,16 +231,16 @@ static void slang_display(caca_display_t *dp) | |||
| fgcolor = CUCUL_COLOR_WHITE; | |||
| SLsmg_set_color(slang_assoc[fgcolor + 16 * bgcolor]); | |||
| SLsmg_write_char(' '); | |||
| attr++; | |||
| attrs++; | |||
| } | |||
| else | |||
| #endif | |||
| { | |||
| SLsmg_set_color(slang_assoc[_cucul_argb32_to_ansi8(*attr++)]); | |||
| SLsmg_set_color(slang_assoc[_cucul_attr_to_ansi8(*attrs++)]); | |||
| slang_write_utf32(ch); | |||
| } | |||
| #else | |||
| SLsmg_set_color(_cucul_argb32_to_ansi8(*attr++)); | |||
| SLsmg_set_color(_cucul_attr_to_ansi8(*attrs++)); | |||
| slang_write_utf32(ch); | |||
| #endif | |||
| } | |||
| @@ -115,7 +115,7 @@ static unsigned int vga_get_display_height(caca_display_t *dp) | |||
| static void vga_display(caca_display_t *dp) | |||
| { | |||
| char *screen = (char *)(intptr_t)0x000b8000; | |||
| uint32_t *attr = dp->cv->attr; | |||
| uint32_t *attrs = dp->cv->attrs; | |||
| uint32_t *chars = dp->cv->chars; | |||
| int n; | |||
| @@ -125,13 +125,13 @@ static void vga_display(caca_display_t *dp) | |||
| if(n && *chars == CUCUL_MAGIC_FULLWIDTH) | |||
| { | |||
| *screen++ = '['; | |||
| *screen++ = _cucul_argb32_to_ansi8(*attr++); | |||
| *screen++ = _cucul_attr_to_ansi8(*attrs++); | |||
| ch = ']'; | |||
| chars++; | |||
| n--; | |||
| } | |||
| *screen++ = ch; | |||
| *screen++ = _cucul_argb32_to_ansi8(*attr++); | |||
| *screen++ = _cucul_attr_to_ansi8(*attrs++); | |||
| } | |||
| } | |||
| @@ -190,7 +190,7 @@ static void win32_display(caca_display_t *dp) | |||
| COORD size, pos; | |||
| SMALL_RECT rect; | |||
| CHAR_INFO *buffer = dp->drv.p->buffer; | |||
| uint32_t *attr = dp->cv->attr; | |||
| uint32_t *attrs = dp->cv->attrs; | |||
| uint32_t *chars = dp->cv->chars; | |||
| unsigned int n; | |||
| @@ -214,9 +214,9 @@ static void win32_display(caca_display_t *dp) | |||
| #endif | |||
| buffer->Attributes = | |||
| win32_fg_palette[_cucul_argb32_to_ansi4fg(*attr)] | |||
| | win32_bg_palette[_cucul_argb32_to_ansi4bg(*attr)]; | |||
| attr++; | |||
| win32_fg_palette[_cucul_attr_to_ansi4fg(*attrs)] | |||
| | win32_bg_palette[_cucul_attr_to_ansi4bg(*attrs)]; | |||
| attrs++; | |||
| buffer++; | |||
| } | |||
| @@ -246,12 +246,12 @@ static void x11_display(caca_display_t *dp) | |||
| { | |||
| for(x = 0; x < dp->cv->width; x += len) | |||
| { | |||
| uint32_t *attr = dp->cv->attr + x + y * dp->cv->width; | |||
| uint16_t bg = _cucul_argb32_to_rgb12bg(*attr); | |||
| uint32_t *attrs = dp->cv->attrs + x + y * dp->cv->width; | |||
| uint16_t bg = _cucul_attr_to_rgb12bg(*attrs); | |||
| len = 1; | |||
| while(x + len < dp->cv->width | |||
| && _cucul_argb32_to_rgb12bg(attr[len]) == bg) | |||
| && _cucul_attr_to_rgb12bg(attrs[len]) == bg) | |||
| len++; | |||
| XSetForeground(dp->drv.p->dpy, dp->drv.p->gc, | |||
| @@ -271,7 +271,7 @@ static void x11_display(caca_display_t *dp) | |||
| for(x = 0; x < dp->cv->width; x++, chars++) | |||
| { | |||
| uint32_t *attr = dp->cv->attr + x + y * dp->cv->width; | |||
| uint32_t *attrs = dp->cv->attrs + x + y * dp->cv->width; | |||
| /* Skip spaces */ | |||
| if(*chars <= 0x00000020) | |||
| @@ -281,7 +281,7 @@ static void x11_display(caca_display_t *dp) | |||
| continue; | |||
| XSetForeground(dp->drv.p->dpy, dp->drv.p->gc, | |||
| dp->drv.p->colors[_cucul_argb32_to_rgb12fg(*attr)]); | |||
| dp->drv.p->colors[_cucul_attr_to_rgb12fg(*attrs)]); | |||
| /* Plain ASCII, no problem. */ | |||
| if(*chars > 0x00000020 && *chars < 0x00000080) | |||
| @@ -86,8 +86,8 @@ int cucul_putchar(cucul_canvas_t *cv, int x, int y, unsigned long int ch) | |||
| return 0; | |||
| curchar = cv->chars + x + y * cv->width; | |||
| curattr = cv->attr + x + y * cv->width; | |||
| attr = (cv->bgcolor << 16) | cv->fgcolor; | |||
| curattr = cv->attrs + x + y * cv->width; | |||
| attr = cv->curattr; | |||
| /* When overwriting the right part of a fullwidth character, | |||
| * replace its left part with a space. */ | |||
| @@ -253,13 +253,13 @@ int cucul_printf(cucul_canvas_t *cv, int x, int y, char const *format, ...) | |||
| */ | |||
| int cucul_clear_canvas(cucul_canvas_t *cv) | |||
| { | |||
| uint32_t color = (cv->bgcolor << 16) | cv->fgcolor; | |||
| uint32_t attr = cv->curattr; | |||
| unsigned int n; | |||
| for(n = cv->width * cv->height; n--; ) | |||
| { | |||
| cv->chars[n] = (uint32_t)' '; | |||
| cv->attr[n] = color; | |||
| cv->attrs[n] = attr; | |||
| } | |||
| return 0; | |||
| @@ -325,13 +325,13 @@ int cucul_blit(cucul_canvas_t *dst, int x, int y, | |||
| continue; | |||
| dst->chars[dstix + i] = src->chars[srcix + i]; | |||
| dst->attr[dstix + i] = src->attr[srcix + i]; | |||
| dst->attrs[dstix + i] = src->attrs[srcix + i]; | |||
| } | |||
| } | |||
| else | |||
| { | |||
| memcpy(dst->chars + dstix, src->chars + srcix, (stride) * 4); | |||
| memcpy(dst->attr + dstix, src->attr + srcix, (stride) * 4); | |||
| memcpy(dst->chars + dstix, src->chars + srcix, stride * 4); | |||
| memcpy(dst->attrs + dstix, src->attrs + srcix, stride * 4); | |||
| } | |||
| /* Fix split fullwidth chars */ | |||
| @@ -392,10 +392,10 @@ int cucul_set_canvas_boundaries(cucul_canvas_t *cv, int x, int y, | |||
| cucul_blit(new, -x, -y, cv, NULL); | |||
| free(cv->allchars[f]); | |||
| free(cv->allattr[f]); | |||
| free(cv->allattrs[f]); | |||
| } | |||
| free(cv->allchars); | |||
| free(cv->allattr); | |||
| free(cv->allattrs); | |||
| memcpy(cv, new, sizeof(cucul_canvas_t)); | |||
| free(new); | |||
| @@ -28,33 +28,75 @@ | |||
| /* RGB colours for the ANSI palette. There is no real standard, so we | |||
| * use the same values as gnome-terminal. The 7th colour (brown) is a bit | |||
| * special. */ | |||
| * special: 0xfa50 instead of 0xfaa0. */ | |||
| static const uint16_t ansitab[16] = | |||
| { | |||
| 0xf000, 0xf00a, 0xf0a0, 0xf0aa, 0xfa00, 0xfa0a, 0xfa50, 0xfaaa, | |||
| 0xf555, 0xf55f, 0xf5f5, 0xf5ff, 0xff55, 0xff5f, 0xfff5, 0xffff, | |||
| }; | |||
| /** \brief Set the default colour pair. | |||
| /** \brief Set the default character attribute. | |||
| * | |||
| * Set the default ANSI colour pair for drawing. String functions such as | |||
| * Set the default character attribute for drawing. Attributes define | |||
| * foreground and background colour, transparency, bold, italics and | |||
| * underline styles, as well as blink. String functions such as | |||
| * caca_printf() and graphical primitive functions such as caca_draw_line() | |||
| * will use these colours. | |||
| * will use this attribute. | |||
| * | |||
| * The attribute value is a 32-bit integer as returned by cucul_get_attr(). | |||
| * For more user-friendly versions of this function, see cucul_set_attr_ansi() | |||
| * and cucul_set_attr_argb(). | |||
| * | |||
| * If an error occurs, -1 is returned and \b errno is set accordingly: | |||
| * - \c EINVAL The attribute value is out of the 32-bit range. | |||
| * | |||
| * \param cv A handle to the libcucul canvas. | |||
| * \param attr The requested attribute value. | |||
| * \return 0 in case of success, -1 if an error occurred. | |||
| */ | |||
| int cucul_set_attr(cucul_canvas_t *cv, unsigned long int attr) | |||
| { | |||
| if(sizeof(unsigned long int) > sizeof(uint32_t) && attr > 0xffffffff) | |||
| { | |||
| #if defined(HAVE_ERRNO_H) | |||
| errno = EINVAL; | |||
| #endif | |||
| return -1; | |||
| } | |||
| cv->curattr = attr; | |||
| return 0; | |||
| } | |||
| /** \brief Set the default colour pair and text style (ANSI version). | |||
| * | |||
| * Set the default ANSI colour pair and text style for drawing. String | |||
| * functions such as caca_printf() and graphical primitive functions such as | |||
| * caca_draw_line() will use these attributes. | |||
| * | |||
| * Color values are those defined in cucul.h, such as CUCUL_COLOR_RED | |||
| * or CUCUL_COLOR_TRANSPARENT. | |||
| * | |||
| * Style values are those defined in cucul.h, such as CUCUL_STYLE_UNDERLINE | |||
| * or CUCUL_STYLE_BLINK. The values can be ORed to set several styles at | |||
| * the same time. | |||
| * | |||
| * If an error occurs, -1 is returned and \b errno is set accordingly: | |||
| * - \c EINVAL At least one of the colour values is invalid. | |||
| * - \c EINVAL The colour values and/or the style mask are invalid. | |||
| * | |||
| * \param cv A handle to the libcucul canvas. | |||
| * \param fg The requested foreground colour. | |||
| * \param bg The requested background colour. | |||
| * \param style The requested text styles. | |||
| * \return 0 in case of success, -1 if an error occurred. | |||
| */ | |||
| int cucul_set_color(cucul_canvas_t *cv, unsigned char fg, unsigned char bg) | |||
| int cucul_set_attr_ansi(cucul_canvas_t *cv, unsigned char fg, unsigned char bg, | |||
| unsigned char style) | |||
| { | |||
| if(fg > 0x20 || bg > 0x20) | |||
| uint32_t attr; | |||
| if(fg > 0x20 || bg > 0x20 || style > 0x0f) | |||
| { | |||
| #if defined(HAVE_ERRNO_H) | |||
| errno = EINVAL; | |||
| @@ -62,33 +104,51 @@ int cucul_set_color(cucul_canvas_t *cv, unsigned char fg, unsigned char bg) | |||
| return -1; | |||
| } | |||
| cv->fgcolor = fg; | |||
| cv->bgcolor = bg; | |||
| attr = ((uint32_t)bg << 20) | ((uint32_t)fg << 4); | |||
| if(style) | |||
| attr |= (0x02004801 * style) & 0x10011001; | |||
| cv->curattr = attr; | |||
| return 0; | |||
| } | |||
| /** \brief Set the default colour pair (truecolor version). | |||
| /* Legacy function for old programs */ | |||
| int cucul_set_color(cucul_canvas_t *cv, unsigned char fg, unsigned char bg) | |||
| { | |||
| return cucul_set_attr_ansi(cv, fg, bg, 0); | |||
| } | |||
| /** \brief Set the default colour pair and text style (truecolor version). | |||
| * | |||
| * Set the default colour pair for drawing. String functions such as | |||
| * caca_printf() and graphical primitive functions such as caca_draw_line() | |||
| * will use these colours. | |||
| * Set the default colour pair and text style for drawing. String | |||
| * functions such as caca_printf() and graphical primitive functions such as | |||
| * caca_draw_line() will use these attributes. | |||
| * | |||
| * Colors are 16-bit ARGB values, each component being coded on 4 bits. For | |||
| * instance, 0xf088 is solid dark cyan (A=15 R=0 G=8 B=8), and 0x8fff is | |||
| * white with 50% alpha (A=8 R=15 G=15 B=15). | |||
| * | |||
| * Style values are those defined in cucul.h, such as CUCUL_STYLE_UNDERLINE | |||
| * or CUCUL_STYLE_BLINK. The values can be ORed to set several styles at | |||
| * the same time. | |||
| * | |||
| * If an error occurs, -1 is returned and \b errno is set accordingly: | |||
| * - \c EINVAL At least one of the colour values is invalid. | |||
| * | |||
| * \param cv A handle to the libcucul canvas. | |||
| * \param fg The requested foreground colour. | |||
| * \param bg The requested background colour. | |||
| * \param style The requested text styles. | |||
| * \return 0 in case of success, -1 if an error occurred. | |||
| */ | |||
| int cucul_set_truecolor(cucul_canvas_t *cv, unsigned int fg, unsigned int bg) | |||
| int cucul_set_attr_argb(cucul_canvas_t *cv, unsigned int fg, unsigned int bg, | |||
| unsigned char style) | |||
| { | |||
| if(fg > 0xffff || bg > 0xffff) | |||
| uint32_t attr; | |||
| if(fg > 0xffff || bg > 0xffff || style > 0x0f) | |||
| { | |||
| #if defined(HAVE_ERRNO_H) | |||
| errno = EINVAL; | |||
| @@ -102,39 +162,58 @@ int cucul_set_truecolor(cucul_canvas_t *cv, unsigned int fg, unsigned int bg) | |||
| if(bg < 0x100) | |||
| bg += 0x100; | |||
| cv->fgcolor = fg; | |||
| cv->bgcolor = bg; | |||
| attr = (((uint32_t)bg << 16) | (uint32_t)fg) & 0xeffeeffe; | |||
| if(style) | |||
| attr |= (0x02004801 * style) & 0x10011001; | |||
| cv->curattr = attr; | |||
| return 0; | |||
| } | |||
| /** \brief Get the colour pair at the given coordinates. | |||
| /* Legacy function for old programs */ | |||
| int cucul_set_truecolor(cucul_canvas_t *cv, unsigned int fg, unsigned int bg) | |||
| { | |||
| return cucul_set_attr_argb(cv, fg, bg, 0); | |||
| } | |||
| /** \brief Get the text attribute at the given coordinates. | |||
| * | |||
| * Get the internal \e libcucul colour pair value of the character at the | |||
| * given coordinates. The colour pair value has 32 significant bits: the | |||
| * lower 16 bits are for the foreground colour, the higher 16 bits are for | |||
| * the background. | |||
| * Get the internal \e libcucul attribute value of the character at the | |||
| * given coordinates. The attribute value has 32 significant bits, | |||
| * organised as follows from MSB to LSB: | |||
| * - 3 bits for the background alpha | |||
| * - 1 bit for the blink flag | |||
| * - 4 bits for the background red component | |||
| * - 4 bits for the background green component | |||
| * - 3 bits for the background blue component | |||
| * - 1 bit for the underline flag | |||
| * - 3 bits for the foreground alpha | |||
| * - 1 bit for the italics flag | |||
| * - 4 bits for the foreground red component | |||
| * - 4 bits for the foreground green component | |||
| * - 3 bits for the foreground blue component | |||
| * - 1 bit for the bold flag | |||
| * | |||
| * If the coordinates are outside the canvas boundaries, the current colour | |||
| * pair is returned. | |||
| * If the coordinates are outside the canvas boundaries, the current | |||
| * attribute is returned. | |||
| * | |||
| * This function never fails. | |||
| * | |||
| * \param cv A handle to the libcucul canvas. | |||
| * \param x X coordinate. | |||
| * \param y Y coordinate. | |||
| * \param ch The requested colour pair value. | |||
| * \return The character always returns 0. | |||
| * \return The requested attribute. | |||
| */ | |||
| unsigned long int cucul_get_color(cucul_canvas_t *cv, int x, int y) | |||
| unsigned long int cucul_get_attr(cucul_canvas_t *cv, int x, int y) | |||
| { | |||
| if(x < 0 || x >= (int)cv->width || y < 0 || y >= (int)cv->height) | |||
| return ((uint32_t)cv->bgcolor << 16) | (uint32_t)cv->fgcolor; | |||
| return (unsigned long int)cv->curattr; | |||
| return (unsigned long int)cv->attr[x + y * cv->width]; | |||
| return (unsigned long int)cv->attrs[x + y * cv->width]; | |||
| } | |||
| /* | |||
| * XXX: the following functions are local | |||
| */ | |||
| @@ -143,13 +222,14 @@ static uint8_t nearest_ansi(uint16_t argb16, uint8_t def) | |||
| { | |||
| unsigned int i, best, dist; | |||
| if(argb16 < CUCUL_COLOR_DEFAULT) | |||
| return argb16; | |||
| if(argb16 == (argb16 & 0x00f0)) | |||
| return argb16 >> 4; | |||
| if(argb16 == CUCUL_COLOR_DEFAULT || argb16 == CUCUL_COLOR_TRANSPARENT) | |||
| if(argb16 == (CUCUL_COLOR_DEFAULT << 4) | |||
| || argb16 == (CUCUL_COLOR_TRANSPARENT << 4)) | |||
| return def; | |||
| if(argb16 < 0x5fff) /* too transparent, return default colour */ | |||
| if(argb16 < 0x6fff) /* too transparent, return default colour */ | |||
| return def; | |||
| best = def; | |||
| @@ -181,52 +261,52 @@ static uint8_t nearest_ansi(uint16_t argb16, uint8_t def) | |||
| return best; | |||
| } | |||
| uint8_t _cucul_argb32_to_ansi8(uint32_t ch) | |||
| uint8_t _cucul_attr_to_ansi8(uint32_t attr) | |||
| { | |||
| uint16_t fg = ch & 0xffff; | |||
| uint16_t bg = ch >> 16; | |||
| uint16_t fg = attr & 0xeffe; | |||
| uint16_t bg = (attr >> 16) & 0xeffe; | |||
| return nearest_ansi(fg, CUCUL_COLOR_LIGHTGRAY) | |||
| | (nearest_ansi(bg, CUCUL_COLOR_BLACK) << 4); | |||
| } | |||
| uint8_t _cucul_argb32_to_ansi4fg(uint32_t ch) | |||
| uint8_t _cucul_attr_to_ansi4fg(uint32_t attr) | |||
| { | |||
| return nearest_ansi(ch & 0xffff, CUCUL_COLOR_LIGHTGRAY); | |||
| return nearest_ansi(attr & 0xeffe, CUCUL_COLOR_LIGHTGRAY); | |||
| } | |||
| uint8_t _cucul_argb32_to_ansi4bg(uint32_t ch) | |||
| uint8_t _cucul_attr_to_ansi4bg(uint32_t attr) | |||
| { | |||
| return nearest_ansi(ch >> 16, CUCUL_COLOR_BLACK); | |||
| return nearest_ansi((attr >> 16) & 0xeffe, CUCUL_COLOR_BLACK); | |||
| } | |||
| uint16_t _cucul_argb32_to_rgb12fg(uint32_t ch) | |||
| uint16_t _cucul_attr_to_rgb12fg(uint32_t attr) | |||
| { | |||
| uint16_t fg = ch & 0xffff; | |||
| uint16_t fg = attr & 0xeffe; | |||
| if(fg < CUCUL_COLOR_DEFAULT) | |||
| return ansitab[fg] & 0x0fff; | |||
| if(fg == (fg & 0x00f0)) | |||
| return ansitab[fg >> 4] & 0x0fff; | |||
| if(fg == CUCUL_COLOR_DEFAULT) | |||
| if(fg == (CUCUL_COLOR_DEFAULT << 4)) | |||
| return ansitab[CUCUL_COLOR_LIGHTGRAY] & 0x0fff; | |||
| if(fg == CUCUL_COLOR_TRANSPARENT) | |||
| if(fg == (CUCUL_COLOR_TRANSPARENT << 4)) | |||
| return ansitab[CUCUL_COLOR_LIGHTGRAY] & 0x0fff; | |||
| return fg & 0x0fff; | |||
| } | |||
| uint16_t _cucul_argb32_to_rgb12bg(uint32_t ch) | |||
| uint16_t _cucul_attr_to_rgb12bg(uint32_t attr) | |||
| { | |||
| uint16_t bg = ch >> 16; | |||
| uint16_t bg = (attr >> 16) & 0xeffe; | |||
| if(bg < CUCUL_COLOR_DEFAULT) | |||
| return ansitab[bg] & 0x0fff; | |||
| if(bg == (bg & 0x00f0)) | |||
| return ansitab[bg >> 4] & 0x0fff; | |||
| if(bg == CUCUL_COLOR_DEFAULT) | |||
| if(bg == (CUCUL_COLOR_DEFAULT << 4)) | |||
| return ansitab[CUCUL_COLOR_BLACK] & 0x0fff; | |||
| if(bg == CUCUL_COLOR_TRANSPARENT) | |||
| if(bg == (CUCUL_COLOR_TRANSPARENT << 4)) | |||
| return ansitab[CUCUL_COLOR_BLACK] & 0x0fff; | |||
| return bg & 0x0fff; | |||
| @@ -237,33 +317,33 @@ uint16_t _cucul_argb32_to_rgb12bg(uint32_t ch) | |||
| | ((uint32_t)((i & 0x0f0) >> 4) * 0x001100) \ | |||
| | ((uint32_t)(i & 0x00f) * 0x000011)) | |||
| uint32_t _cucul_argb32_to_rgb24fg(uint32_t ch) | |||
| uint32_t _cucul_attr_to_rgb24fg(uint32_t attr) | |||
| { | |||
| return RGB12TO24(_cucul_argb32_to_rgb12fg(ch)); | |||
| return RGB12TO24(_cucul_attr_to_rgb12fg(attr)); | |||
| } | |||
| uint32_t _cucul_argb32_to_rgb24bg(uint32_t ch) | |||
| uint32_t _cucul_attr_to_rgb24bg(uint32_t attr) | |||
| { | |||
| return RGB12TO24(_cucul_argb32_to_rgb12bg(ch)); | |||
| return RGB12TO24(_cucul_attr_to_rgb12bg(attr)); | |||
| } | |||
| void _cucul_argb32_to_argb4(uint32_t ch, uint8_t argb[8]) | |||
| void _cucul_attr_to_argb4(uint32_t attr, uint8_t argb[8]) | |||
| { | |||
| uint16_t fg = ch & 0xffff; | |||
| uint16_t bg = ch >> 16; | |||
| uint16_t fg = attr & 0xeffe; | |||
| uint16_t bg = (attr >> 16) & 0xeffe; | |||
| if(fg < CUCUL_COLOR_DEFAULT) | |||
| fg = ansitab[fg]; | |||
| else if(fg == CUCUL_COLOR_DEFAULT) | |||
| if(fg == (fg & 0x00f0)) | |||
| fg = ansitab[fg >> 4]; | |||
| else if(fg == (CUCUL_COLOR_DEFAULT << 4)) | |||
| fg = ansitab[CUCUL_COLOR_LIGHTGRAY]; | |||
| else if(fg == CUCUL_COLOR_TRANSPARENT) | |||
| else if(fg == (CUCUL_COLOR_TRANSPARENT << 4)) | |||
| fg = 0x0fff; | |||
| if(bg < CUCUL_COLOR_DEFAULT) | |||
| bg = ansitab[bg]; | |||
| else if(bg == CUCUL_COLOR_DEFAULT) | |||
| if(bg == (bg & 0x00f0)) | |||
| bg = ansitab[bg >> 4]; | |||
| else if(bg == (CUCUL_COLOR_DEFAULT << 4)) | |||
| bg = ansitab[CUCUL_COLOR_BLACK]; | |||
| else if(bg == CUCUL_COLOR_TRANSPARENT) | |||
| else if(bg == (CUCUL_COLOR_TRANSPARENT << 4)) | |||
| bg = 0x0fff; | |||
| argb[0] = bg >> 12; | |||
| @@ -59,12 +59,11 @@ cucul_canvas_t * cucul_create_canvas(unsigned int width, unsigned int height) | |||
| cv->refcount = 0; | |||
| cv->fgcolor = CUCUL_COLOR_DEFAULT; | |||
| cv->bgcolor = CUCUL_COLOR_TRANSPARENT; | |||
| cv->curattr = (CUCUL_COLOR_DEFAULT << 20) | (CUCUL_COLOR_TRANSPARENT < 4); | |||
| cv->width = cv->height = 0; | |||
| cv->chars = NULL; | |||
| cv->attr = NULL; | |||
| cv->attrs = NULL; | |||
| cv->frame = 0; | |||
| cv->framecount = 1; | |||
| @@ -74,22 +73,22 @@ cucul_canvas_t * cucul_create_canvas(unsigned int width, unsigned int height) | |||
| free(cv); | |||
| goto nomem; | |||
| } | |||
| cv->allattr = malloc(sizeof(uint32_t *)); | |||
| if(!cv->allattr) | |||
| cv->allattrs = malloc(sizeof(uint32_t *)); | |||
| if(!cv->allattrs) | |||
| { | |||
| free(cv->allchars); | |||
| free(cv); | |||
| goto nomem; | |||
| } | |||
| cv->allchars[0] = NULL; | |||
| cv->allattr[0] = NULL; | |||
| cv->allattrs[0] = NULL; | |||
| if(_cucul_set_canvas_size(cv, width, height) < 0) | |||
| { | |||
| #if defined(HAVE_ERRNO_H) | |||
| int saved_errno = errno; | |||
| #endif | |||
| free(cv->allattr); | |||
| free(cv->allattrs); | |||
| free(cv->allchars); | |||
| free(cv); | |||
| #if defined(HAVE_ERRNO_H) | |||
| @@ -246,11 +245,11 @@ int cucul_free_canvas(cucul_canvas_t *cv) | |||
| for(f = 0; f < cv->framecount; f++) | |||
| { | |||
| free(cv->allchars[f]); | |||
| free(cv->allattr[f]); | |||
| free(cv->allattrs[f]); | |||
| } | |||
| free(cv->allchars); | |||
| free(cv->allattr); | |||
| free(cv->allattrs); | |||
| free(cv); | |||
| return 0; | |||
| @@ -304,9 +303,9 @@ int _cucul_set_canvas_size(cucul_canvas_t *cv, unsigned int width, | |||
| { | |||
| cv->allchars[f] = realloc(cv->allchars[f], | |||
| new_size * sizeof(uint32_t)); | |||
| cv->allattr[f] = realloc(cv->allattr[f], | |||
| cv->allattrs[f] = realloc(cv->allattrs[f], | |||
| new_size * sizeof(uint32_t)); | |||
| if(!cv->allchars[f] || !cv->allattr[f]) | |||
| if(!cv->allchars[f] || !cv->allattrs[f]) | |||
| { | |||
| #if defined(HAVE_ERRNO_H) | |||
| errno = ENOMEM; | |||
| @@ -330,23 +329,23 @@ int _cucul_set_canvas_size(cucul_canvas_t *cv, unsigned int width, | |||
| for(f = 0; f < cv->framecount; f++) | |||
| { | |||
| uint32_t *chars = cv->allchars[f]; | |||
| uint32_t *attr = cv->allattr[f]; | |||
| uint32_t *attrs = cv->allattrs[f]; | |||
| for(y = height < old_height ? height : old_height; y--; ) | |||
| { | |||
| uint32_t color = (cv->bgcolor << 16) | cv->fgcolor; | |||
| uint32_t attr = cv->curattr; | |||
| for(x = old_width; x--; ) | |||
| { | |||
| chars[y * width + x] = chars[y * old_width + x]; | |||
| attr[y * width + x] = attr[y * old_width + x]; | |||
| attrs[y * width + x] = attrs[y * old_width + x]; | |||
| } | |||
| /* Zero the end of the line */ | |||
| for(x = width - old_width; x--; ) | |||
| { | |||
| chars[y * width + old_width + x] = (uint32_t)' '; | |||
| attr[y * width + old_width + x] = color; | |||
| attrs[y * width + old_width + x] = attr; | |||
| } | |||
| } | |||
| } | |||
| @@ -360,14 +359,14 @@ int _cucul_set_canvas_size(cucul_canvas_t *cv, unsigned int width, | |||
| for(f = 0; f < cv->framecount; f++) | |||
| { | |||
| uint32_t *chars = cv->allchars[f]; | |||
| uint32_t *attr = cv->allattr[f]; | |||
| uint32_t *attrs = cv->allattrs[f]; | |||
| for(y = 1; y < lines; y++) | |||
| { | |||
| for(x = 0; x < width; x++) | |||
| { | |||
| chars[y * width + x] = chars[y * old_width + x]; | |||
| attr[y * width + x] = attr[y * old_width + x]; | |||
| attrs[y * width + x] = attrs[y * old_width + x]; | |||
| } | |||
| } | |||
| } | |||
| @@ -379,14 +378,14 @@ int _cucul_set_canvas_size(cucul_canvas_t *cv, unsigned int width, | |||
| for(f = 0; f < cv->framecount; f++) | |||
| { | |||
| uint32_t *chars = cv->allchars[f]; | |||
| uint32_t *attr = cv->allattr[f]; | |||
| uint32_t color = (cv->bgcolor << 16) | cv->fgcolor; | |||
| uint32_t *attrs = cv->allattrs[f]; | |||
| uint32_t attr = cv->curattr; | |||
| /* Zero the bottom of the screen */ | |||
| for(x = (height - old_height) * width; x--; ) | |||
| { | |||
| chars[old_height * width + x] = (uint32_t)' '; | |||
| attr[old_height * width + x] = color; | |||
| attrs[old_height * width + x] = attr; | |||
| } | |||
| } | |||
| } | |||
| @@ -398,9 +397,9 @@ int _cucul_set_canvas_size(cucul_canvas_t *cv, unsigned int width, | |||
| { | |||
| cv->allchars[f] = realloc(cv->allchars[f], | |||
| new_size * sizeof(uint32_t)); | |||
| cv->allattr[f] = realloc(cv->allattr[f], | |||
| cv->allattrs[f] = realloc(cv->allattrs[f], | |||
| new_size * sizeof(uint32_t)); | |||
| if(!cv->allchars[f] || !cv->allattr[f]) | |||
| if(!cv->allchars[f] || !cv->allattrs[f]) | |||
| { | |||
| #if defined(HAVE_ERRNO_H) | |||
| errno = ENOMEM; | |||
| @@ -412,7 +411,7 @@ int _cucul_set_canvas_size(cucul_canvas_t *cv, unsigned int width, | |||
| /* Reset the current frame shortcut */ | |||
| cv->chars = cv->allchars[cv->frame]; | |||
| cv->attr = cv->allattr[cv->frame]; | |||
| cv->attrs = cv->allattrs[cv->frame]; | |||
| return 0; | |||
| } | |||
| @@ -40,9 +40,10 @@ typedef struct cucul_buffer cucul_buffer_t; | |||
| /** font structure */ | |||
| typedef struct cucul_font cucul_font_t; | |||
| /** \defgroup colour libcucul colour definitions | |||
| /** \defgroup attributes libcucul attribute definitions | |||
| * | |||
| * Colours that can be used with cucul_set_color(). | |||
| * Colours and styles that can be used with cucul_set_attr_ansi() and | |||
| * cucul_set_attr_argb(). | |||
| * | |||
| * @{ */ | |||
| #define CUCUL_COLOR_BLACK 0x00 /**< The colour index for black. */ | |||
| @@ -63,6 +64,11 @@ typedef struct cucul_font cucul_font_t; | |||
| #define CUCUL_COLOR_WHITE 0x0f /**< The colour index for white. */ | |||
| #define CUCUL_COLOR_DEFAULT 0x10 /**< The output driver's default colour. */ | |||
| #define CUCUL_COLOR_TRANSPARENT 0x20 /**< The transparent colour. */ | |||
| #define CUCUL_STYLE_BOLD 0x01 /**< The style mask for bold. */ | |||
| #define CUCUL_STYLE_ITALICS 0x02 /**< The style mask for italics. */ | |||
| #define CUCUL_STYLE_UNDERLINE 0x04 /**< The style mask for underline. */ | |||
| #define CUCUL_STYLE_BLINK 0x08 /**< The style mask for blink. */ | |||
| /* @} */ | |||
| /** \defgroup cucul libcucul basic functions | |||
| @@ -98,9 +104,12 @@ int cucul_free_buffer(cucul_buffer_t *); | |||
| * | |||
| * @{ */ | |||
| #define CUCUL_MAGIC_FULLWIDTH 0x000ffffe /**< Used to indicate that the previous character was a fullwidth glyph. */ | |||
| int cucul_set_color(cucul_canvas_t *, unsigned char, unsigned char); | |||
| int cucul_set_truecolor(cucul_canvas_t *, unsigned int, unsigned int); | |||
| unsigned long int cucul_get_color(cucul_canvas_t *, int, int); | |||
| int cucul_set_attr(cucul_canvas_t *, unsigned long int); | |||
| int cucul_set_attr_ansi(cucul_canvas_t *, unsigned char, unsigned char, | |||
| unsigned char); | |||
| int cucul_set_attr_argb(cucul_canvas_t *, unsigned int, unsigned int, | |||
| unsigned char); | |||
| unsigned long int cucul_get_attr(cucul_canvas_t *, int, int); | |||
| char const *cucul_get_color_name(unsigned int); | |||
| int cucul_putchar(cucul_canvas_t *, int, int, unsigned long int); | |||
| unsigned long int cucul_getchar(cucul_canvas_t *, int, int); | |||
| @@ -111,6 +120,9 @@ int cucul_blit(cucul_canvas_t *, int, int, cucul_canvas_t const *, | |||
| cucul_canvas_t const *); | |||
| int cucul_set_canvas_boundaries(cucul_canvas_t *, int, int, | |||
| unsigned int, unsigned int); | |||
| /* Legacy stuff */ | |||
| int cucul_set_color(cucul_canvas_t *, unsigned char, unsigned char); | |||
| int cucul_set_truecolor(cucul_canvas_t *, unsigned int, unsigned int); | |||
| /* @} */ | |||
| /** \defgroup transform libcucul canvas transformation | |||
| @@ -25,16 +25,15 @@ struct cucul_canvas | |||
| /* Shortcut to the active frame */ | |||
| uint32_t *chars; | |||
| uint32_t *attr; | |||
| uint32_t *attrs; | |||
| /* Frame information */ | |||
| unsigned int frame, framecount; | |||
| uint32_t **allchars; | |||
| uint32_t **allattr; | |||
| uint32_t **allattrs; | |||
| /* Painting context */ | |||
| uint16_t fgcolor; | |||
| uint16_t bgcolor; | |||
| uint32_t curattr; | |||
| unsigned int refcount; | |||
| }; | |||
| @@ -58,13 +57,13 @@ extern unsigned int _cucul_strlen_utf8(char const *); | |||
| extern char const *_cucul_skip_utf8(char const *, unsigned int); | |||
| /* Colour functions */ | |||
| uint8_t _cucul_argb32_to_ansi8(uint32_t); | |||
| uint8_t _cucul_argb32_to_ansi4fg(uint32_t); | |||
| uint8_t _cucul_argb32_to_ansi4bg(uint32_t); | |||
| uint16_t _cucul_argb32_to_rgb12fg(uint32_t); | |||
| uint16_t _cucul_argb32_to_rgb12bg(uint32_t); | |||
| uint32_t _cucul_argb32_to_rgb24fg(uint32_t); | |||
| uint32_t _cucul_argb32_to_rgb24bg(uint32_t); | |||
| void _cucul_argb32_to_argb4(uint32_t, uint8_t[8]); | |||
| uint8_t _cucul_attr_to_ansi8(uint32_t); | |||
| uint8_t _cucul_attr_to_ansi4fg(uint32_t); | |||
| uint8_t _cucul_attr_to_ansi4bg(uint32_t); | |||
| uint16_t _cucul_attr_to_rgb12fg(uint32_t); | |||
| uint16_t _cucul_attr_to_rgb12bg(uint32_t); | |||
| uint32_t _cucul_attr_to_rgb24fg(uint32_t); | |||
| uint32_t _cucul_attr_to_rgb24bg(uint32_t); | |||
| void _cucul_attr_to_argb4(uint32_t, uint8_t[8]); | |||
| #endif /* __CUCUL_INTERNALS_H__ */ | |||
| @@ -153,7 +153,7 @@ char const * const * cucul_get_export_list(void) | |||
| /* Generate a native libcaca canvas file. */ | |||
| static int export_caca(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| { | |||
| uint32_t *attr = cv->attr; | |||
| uint32_t *attrs = cv->attrs; | |||
| uint32_t *chars = cv->chars; | |||
| char *cur; | |||
| uint32_t w, h; | |||
| @@ -177,7 +177,7 @@ static int export_caca(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| for(n = cv->height * cv->width; n--; ) | |||
| { | |||
| uint32_t ch = *chars++; | |||
| uint32_t a = *attr++; | |||
| uint32_t a = *attrs++; | |||
| *cur++ = ch >> 24; | |||
| *cur++ = (ch >> 16) & 0xff; | |||
| @@ -215,7 +215,7 @@ static int export_utf8(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| for(y = 0; y < cv->height; y++) | |||
| { | |||
| uint32_t *lineattr = cv->attr + y * cv->width; | |||
| uint32_t *lineattr = cv->attrs + y * cv->width; | |||
| uint32_t *linechar = cv->chars + y * cv->width; | |||
| uint8_t prevfg = 0x10; | |||
| @@ -230,10 +230,10 @@ static int export_utf8(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| if(ch == CUCUL_MAGIC_FULLWIDTH) | |||
| continue; | |||
| fg = ((attr & 0xffff) == CUCUL_COLOR_DEFAULT) ? | |||
| 0x10 : palette[_cucul_argb32_to_ansi4fg(attr)]; | |||
| bg = ((attr >> 16) == CUCUL_COLOR_TRANSPARENT) ? | |||
| 0x10 : palette[_cucul_argb32_to_ansi4bg(attr)]; | |||
| fg = ((attr & 0xeffe) == (CUCUL_COLOR_DEFAULT << 4)) ? | |||
| 0x10 : palette[_cucul_attr_to_ansi4fg(attr)]; | |||
| bg = (((attr >> 16) & 0xeffe) == (CUCUL_COLOR_TRANSPARENT << 4)) ? | |||
| 0x10 : palette[_cucul_attr_to_ansi4bg(attr)]; | |||
| /* TODO: the [0 could be omitted in some cases */ | |||
| if(fg != prevfg || bg != prevbg) | |||
| @@ -297,13 +297,13 @@ static int export_ansi(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| for(y = 0; y < cv->height; y++) | |||
| { | |||
| uint32_t *lineattr = cv->attr + y * cv->width; | |||
| uint32_t *lineattr = cv->attrs + y * cv->width; | |||
| uint32_t *linechar = cv->chars + y * cv->width; | |||
| for(x = 0; x < cv->width; x++) | |||
| { | |||
| uint8_t fg = palette[_cucul_argb32_to_ansi4fg(lineattr[x])]; | |||
| uint8_t bg = palette[_cucul_argb32_to_ansi4bg(lineattr[x])]; | |||
| uint8_t fg = palette[_cucul_attr_to_ansi4fg(lineattr[x])]; | |||
| uint8_t bg = palette[_cucul_attr_to_ansi4bg(lineattr[x])]; | |||
| uint32_t ch = linechar[x]; | |||
| if(ch == CUCUL_MAGIC_FULLWIDTH) | |||
| @@ -376,15 +376,15 @@ static int export_html(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| for(y = 0; y < cv->height; y++) | |||
| { | |||
| uint32_t *lineattr = cv->attr + y * cv->width; | |||
| uint32_t *lineattr = cv->attrs + y * cv->width; | |||
| uint32_t *linechar = cv->chars + y * cv->width; | |||
| for(x = 0; x < cv->width; x += len) | |||
| { | |||
| cur += sprintf(cur, "<span style=\"color:#%.03x;" | |||
| "background-color:#%.03x\">", | |||
| _cucul_argb32_to_rgb12fg(lineattr[x]), | |||
| _cucul_argb32_to_rgb12bg(lineattr[x])); | |||
| _cucul_attr_to_rgb12fg(lineattr[x]), | |||
| _cucul_attr_to_rgb12bg(lineattr[x])); | |||
| for(len = 0; | |||
| x + len < cv->width && lineattr[x + len] == lineattr[x]; | |||
| @@ -441,7 +441,7 @@ static int export_html3(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| for(y = 0; y < cv->height; y++) | |||
| { | |||
| uint32_t *lineattr = cv->attr + y * cv->width; | |||
| uint32_t *lineattr = cv->attrs + y * cv->width; | |||
| uint32_t *linechar = cv->chars + y * cv->width; | |||
| cur += sprintf(cur, "<tr>"); | |||
| @@ -457,13 +457,13 @@ static int export_html3(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| len++; | |||
| cur += sprintf(cur, "<td bgcolor=#%.06lx", (unsigned long int) | |||
| _cucul_argb32_to_rgb24bg(lineattr[x])); | |||
| _cucul_attr_to_rgb24bg(lineattr[x])); | |||
| if(len > 1) | |||
| cur += sprintf(cur, " colspan=%d", len); | |||
| cur += sprintf(cur, "><font color=#%.06lx>", (unsigned long int) | |||
| _cucul_argb32_to_rgb24fg(lineattr[x])); | |||
| _cucul_attr_to_rgb24fg(lineattr[x])); | |||
| for(i = 0; i < len; i++) | |||
| { | |||
| @@ -521,7 +521,7 @@ static int export_irc(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| for(y = 0; y < cv->height; y++) | |||
| { | |||
| uint32_t *lineattr = cv->attr + y * cv->width; | |||
| uint32_t *lineattr = cv->attrs + y * cv->width; | |||
| uint32_t *linechar = cv->chars + y * cv->width; | |||
| uint8_t prevfg = 0x10; | |||
| @@ -530,17 +530,17 @@ static int export_irc(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| for(x = 0; x < cv->width; x++) | |||
| { | |||
| uint32_t attr = lineattr[x]; | |||
| uint8_t fg = palette[_cucul_argb32_to_ansi4fg(attr)]; | |||
| uint8_t bg = palette[_cucul_argb32_to_ansi4bg(attr)]; | |||
| uint8_t fg = palette[_cucul_attr_to_ansi4fg(attr)]; | |||
| uint8_t bg = palette[_cucul_attr_to_ansi4bg(attr)]; | |||
| uint32_t ch = linechar[x]; | |||
| if(ch == CUCUL_MAGIC_FULLWIDTH) | |||
| continue; | |||
| if((attr & 0xffff) == CUCUL_COLOR_DEFAULT) | |||
| if((attr & 0xeffe) == (CUCUL_COLOR_DEFAULT << 4)) | |||
| fg = 0x10; | |||
| if((attr >> 16) == CUCUL_COLOR_TRANSPARENT) | |||
| if(((attr >> 16) & 0xeffe) == (CUCUL_COLOR_TRANSPARENT << 4)) | |||
| bg = 0x10; | |||
| /* TODO: optimise series of same fg / same bg | |||
| @@ -644,12 +644,12 @@ static int export_ps(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| /* Background, drawn using csquare macro defined in header */ | |||
| for(y = cv->height; y--; ) | |||
| { | |||
| uint32_t *lineattr = cv->attr + y * cv->width; | |||
| uint32_t *lineattr = cv->attrs + y * cv->width; | |||
| for(x = 0; x < cv->width; x++) | |||
| { | |||
| uint8_t argb[8]; | |||
| _cucul_argb32_to_argb4(*lineattr++, argb); | |||
| _cucul_attr_to_argb4(*lineattr++, argb); | |||
| cur += sprintf(cur, "1 0 translate\n %f %f %f csquare\n", | |||
| (float)argb[1] * (1.0 / 0xf), | |||
| (float)argb[2] * (1.0 / 0xf), | |||
| @@ -665,7 +665,7 @@ static int export_ps(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| for(y = cv->height; y--; ) | |||
| { | |||
| uint32_t *lineattr = cv->attr + (cv->height - y - 1) * cv->width; | |||
| uint32_t *lineattr = cv->attrs + (cv->height - y - 1) * cv->width; | |||
| uint32_t *linechar = cv->chars + (cv->height - y - 1) * cv->width; | |||
| for(x = 0; x < cv->width; x++) | |||
| @@ -673,7 +673,7 @@ static int export_ps(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| uint8_t argb[8]; | |||
| uint32_t ch = *linechar++; | |||
| _cucul_argb32_to_argb4(*lineattr++, argb); | |||
| _cucul_attr_to_argb4(*lineattr++, argb); | |||
| cur += sprintf(cur, "newpath\n"); | |||
| cur += sprintf(cur, "%d %d moveto\n", (x + 1) * 6, y * 10 + 2); | |||
| @@ -738,13 +738,13 @@ static int export_svg(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| /* Background */ | |||
| for(y = 0; y < cv->height; y++) | |||
| { | |||
| uint32_t *lineattr = cv->attr + y * cv->width; | |||
| uint32_t *lineattr = cv->attrs + y * cv->width; | |||
| for(x = 0; x < cv->width; x++) | |||
| { | |||
| cur += sprintf(cur, "<rect style=\"fill:#%.03x\" x=\"%d\" y=\"%d\"" | |||
| " width=\"6\" height=\"10\"/>\n", | |||
| _cucul_argb32_to_rgb12bg(*lineattr++), | |||
| _cucul_attr_to_rgb12bg(*lineattr++), | |||
| x * 6, y * 10); | |||
| } | |||
| } | |||
| @@ -752,7 +752,7 @@ static int export_svg(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| /* Text */ | |||
| for(y = 0; y < cv->height; y++) | |||
| { | |||
| uint32_t *lineattr = cv->attr + y * cv->width; | |||
| uint32_t *lineattr = cv->attrs + y * cv->width; | |||
| uint32_t *linechar = cv->chars + y * cv->width; | |||
| for(x = 0; x < cv->width; x++) | |||
| @@ -767,7 +767,7 @@ static int export_svg(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||
| cur += sprintf(cur, "<text style=\"fill:#%.03x\" " | |||
| "x=\"%d\" y=\"%d\">", | |||
| _cucul_argb32_to_rgb12fg(*lineattr++), | |||
| _cucul_attr_to_rgb12fg(*lineattr++), | |||
| x * 6, (y * 10) + 8); | |||
| if(ch < 0x00000020) | |||
| @@ -420,7 +420,7 @@ int cucul_render_canvas(cucul_canvas_t *cv, cucul_font_t *f, | |||
| unsigned int starty = y * f->header.height; | |||
| unsigned int startx = x * f->header.width; | |||
| uint32_t ch = cv->chars[y * cv->width + x]; | |||
| uint32_t attr = cv->attr[y * cv->width + x]; | |||
| uint32_t attr = cv->attrs[y * cv->width + x]; | |||
| unsigned int b, i, j; | |||
| struct glyph_info *g; | |||
| @@ -444,7 +444,7 @@ int cucul_render_canvas(cucul_canvas_t *cv, cucul_font_t *f, | |||
| g = &f->glyph_list[f->block_list[b].index | |||
| + ch - f->block_list[b].start]; | |||
| _cucul_argb32_to_argb4(attr, argb); | |||
| _cucul_attr_to_argb4(attr, argb); | |||
| /* Step 1: unpack glyph */ | |||
| switch(f->header.bpp) | |||
| @@ -172,7 +172,7 @@ static cucul_canvas_t *import_caca(void const *data, unsigned int size) | |||
| | ((uint32_t)buf[16 + 1 + 8 * n] << 16) | |||
| | ((uint32_t)buf[16 + 2 + 8 * n] << 8) | |||
| | (uint32_t)buf[16 + 3 + 8 * n]; | |||
| cv->attr[n] = ((uint32_t)buf[16 + 4 + 8 * n] << 24) | |||
| cv->attrs[n] = ((uint32_t)buf[16 + 4 + 8 * n] << 24) | |||
| | ((uint32_t)buf[16 + 5 + 8 * n] << 16) | |||
| | ((uint32_t)buf[16 + 6 + 8 * n] << 8) | |||
| | (uint32_t)buf[16 + 7 + 8 * n]; | |||
| @@ -72,7 +72,7 @@ int cucul_set_canvas_frame(cucul_canvas_t *cv, unsigned int frame) | |||
| cv->frame = frame; | |||
| cv->chars = cv->allchars[cv->frame]; | |||
| cv->attr = cv->allattr[cv->frame]; | |||
| cv->attrs = cv->allattrs[cv->frame]; | |||
| return 0; | |||
| } | |||
| @@ -107,24 +107,24 @@ int cucul_create_canvas_frame(cucul_canvas_t *cv, unsigned int frame) | |||
| cv->framecount++; | |||
| cv->allchars = realloc(cv->allchars, sizeof(uint32_t *) * cv->framecount); | |||
| cv->allattr = realloc(cv->allattr, sizeof(uint32_t *) * cv->framecount); | |||
| cv->allattrs = realloc(cv->allattrs, sizeof(uint32_t *) * cv->framecount); | |||
| for(f = cv->framecount - 1; f > frame; f--) | |||
| { | |||
| cv->allchars[f] = cv->allchars[f - 1]; | |||
| cv->allattr[f] = cv->allattr[f - 1]; | |||
| cv->allattrs[f] = cv->allattrs[f - 1]; | |||
| } | |||
| cv->allchars[frame] = malloc(size); | |||
| memcpy(cv->allchars[frame], cv->chars, size); | |||
| cv->allattr[frame] = malloc(size); | |||
| memcpy(cv->allattr[frame], cv->attr, size); | |||
| cv->allattrs[frame] = malloc(size); | |||
| memcpy(cv->allattrs[frame], cv->attrs, size); | |||
| if(cv->frame >= frame) | |||
| cv->frame++; | |||
| cv->chars = cv->allchars[cv->frame]; | |||
| cv->attr = cv->allattr[cv->frame]; | |||
| cv->attrs = cv->allattrs[cv->frame]; | |||
| return 0; | |||
| } | |||
| @@ -171,17 +171,17 @@ int cucul_free_canvas_frame(cucul_canvas_t *cv, unsigned int frame) | |||
| } | |||
| free(cv->allchars[frame]); | |||
| free(cv->allattr[frame]); | |||
| free(cv->allattrs[frame]); | |||
| for(f = frame + 1; f < cv->framecount; f++) | |||
| { | |||
| cv->allchars[f - 1] = cv->allchars[f]; | |||
| cv->allattr[f - 1] = cv->allattr[f]; | |||
| cv->allattrs[f - 1] = cv->allattrs[f]; | |||
| } | |||
| cv->framecount--; | |||
| cv->allchars = realloc(cv->allchars, sizeof(uint32_t *) * cv->framecount); | |||
| cv->allattr = realloc(cv->allattr, sizeof(uint32_t *) * cv->framecount); | |||
| cv->allattrs = realloc(cv->allattrs, sizeof(uint32_t *) * cv->framecount); | |||
| if(cv->frame > frame) | |||
| cv->frame--; | |||
| @@ -189,7 +189,7 @@ int cucul_free_canvas_frame(cucul_canvas_t *cv, unsigned int frame) | |||
| cv->frame = 0; | |||
| cv->chars = cv->allchars[cv->frame]; | |||
| cv->attr = cv->allattr[cv->frame]; | |||
| cv->attrs = cv->allattrs[cv->frame]; | |||
| return 0; | |||
| } | |||
| @@ -40,13 +40,13 @@ static uint32_t rotatechar(uint32_t ch); | |||
| */ | |||
| int cucul_invert(cucul_canvas_t *cv) | |||
| { | |||
| uint32_t *attr = cv->attr; | |||
| uint32_t *attrs = cv->attrs; | |||
| unsigned int i; | |||
| for(i = cv->height * cv->width; i--; ) | |||
| { | |||
| *attr = *attr ^ 0x000f000f; | |||
| attr++; | |||
| *attrs = *attrs ^ 0x000f000f; | |||
| attrs++; | |||
| } | |||
| return 0; | |||
| @@ -70,7 +70,7 @@ int cucul_flip(cucul_canvas_t *cv) | |||
| { | |||
| uint32_t *cleft = cv->chars + y * cv->width; | |||
| uint32_t *cright = cleft + cv->width - 1; | |||
| uint32_t *aleft = cv->attr + y * cv->width; | |||
| uint32_t *aleft = cv->attrs + y * cv->width; | |||
| uint32_t *aright = aleft + cv->width - 1; | |||
| while(cleft < cright) | |||
| @@ -127,7 +127,7 @@ int cucul_flop(cucul_canvas_t *cv) | |||
| { | |||
| uint32_t *ctop = cv->chars + x; | |||
| uint32_t *cbottom = ctop + cv->width * (cv->height - 1); | |||
| uint32_t *atop = cv->attr + x; | |||
| uint32_t *atop = cv->attrs + x; | |||
| uint32_t *abottom = atop + cv->width * (cv->height - 1); | |||
| while(ctop < cbottom) | |||
| @@ -166,7 +166,7 @@ int cucul_rotate(cucul_canvas_t *cv) | |||
| { | |||
| uint32_t *cbegin = cv->chars; | |||
| uint32_t *cend = cbegin + cv->width * cv->height - 1; | |||
| uint32_t *abegin = cv->attr; | |||
| uint32_t *abegin = cv->attrs; | |||
| uint32_t *aend = abegin + cv->width * cv->height - 1; | |||
| unsigned int y; | |||