Changeset 818


Ignore:
Timestamp:
Apr 19, 2006, 11:07:55 AM (14 years ago)
Author:
Sam Hocevar
Message:
  • Added a new "caca" exporter.
  • Removed most code from the raw driver and replaced it with a call to the caca exporter.
  • Slightly changed the caca export format and updated code accordingly.
  • Improved cacaserver error reporting.
Location:
libcaca/trunk
Files:
4 edited

Legend:

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

    r811 r818  
    5454static void raw_display(caca_display_t *dp)
    5555{
    56     uint32_t *attr = dp->cv->attr;
    57     uint32_t *chars = dp->cv->chars;
    58     uint32_t w, h;
    59     unsigned int n;
     56    cucul_buffer_t *buffer;
    6057
    61     w = dp->cv->width;
    62     h = dp->cv->height;
    63 
    64     fprintf(stdout, "CACA%c%c%c%c%c%c%c%c",
    65                     (w >> 24), (w >> 16) & 0xff, (w >> 8) & 0xff, w & 0xff,
    66                     (h >> 24), (h >> 16) & 0xff, (h >> 8) & 0xff, h & 0xff);
    67 
    68     for(n = dp->cv->height * dp->cv->width; n--; )
    69     {
    70         uint32_t ch = *chars++;
    71         uint32_t a = *attr++;
    72 
    73         fprintf(stdout, "%c%c%c%c%c%c%c%c",
    74                 (ch >> 24), (ch >> 16) & 0xff, (ch >> 8) & 0xff, ch & 0xff,
    75                 (a >> 24), (a >> 16) & 0xff, (a >> 8) & 0xff, a & 0xff);
    76     }
    77 
    78     fprintf(stdout, "ACAC");
     58    buffer = cucul_create_export(dp->cv, "caca");
     59    fwrite(cucul_get_buffer_data(buffer),
     60           cucul_get_buffer_size(buffer), 1, stdout);
    7961    fflush(stdout);
     62    cucul_free_buffer(buffer);
    8063}
    8164
  • libcaca/trunk/cucul/cucul.c

    r815 r818  
    8888    unsigned int width, height, n;
    8989
    90     if(size < 12)
     90    if(size < 16)
    9191        return NULL;
    9292
     
    9494        return NULL;
    9595
    96     width = ((uint32_t)buf[4] << 24) | ((uint32_t)buf[5] << 16)
    97           | ((uint32_t)buf[6] << 8) | (uint32_t)buf[7];
    98     height = ((uint32_t)buf[8] << 24) | ((uint32_t)buf[9] << 16)
     96    if(buf[4] != 'C' || buf[5] != 'A' || buf[6] != 'N' || buf[7] != 'V')
     97        return NULL;
     98
     99    width = ((uint32_t)buf[8] << 24) | ((uint32_t)buf[9] << 16)
    99100           | ((uint32_t)buf[10] << 8) | (uint32_t)buf[11];
     101    height = ((uint32_t)buf[12] << 24) | ((uint32_t)buf[13] << 16)
     102            | ((uint32_t)buf[14] << 8) | (uint32_t)buf[15];
    100103
    101104    if(!width || !height)
    102105        return NULL;
    103106
    104     if(size != 12 + width * height * 8 + 4)
    105         return NULL;
    106 
    107     if(buf[size - 4] != 'A' || buf[size - 3] != 'C'
    108         || buf[size - 2] != 'A' || buf[size - 1] != 'C')
     107    if(size != 16 + width * height * 8)
    109108        return NULL;
    110109
     
    116115    for(n = height * width; n--; )
    117116    {
    118         cv->chars[n] = ((uint32_t)buf[12 + 8 * n] << 24)
    119                      | ((uint32_t)buf[13 + 8 * n] << 16)
    120                      | ((uint32_t)buf[14 + 8 * n] << 8)
    121                      | (uint32_t)buf[15 + 8 * n];
    122         cv->attr[n] = ((uint32_t)buf[16 + 8 * n] << 24)
    123                     | ((uint32_t)buf[17 + 8 * n] << 16)
    124                     | ((uint32_t)buf[18 + 8 * n] << 8)
    125                     | (uint32_t)buf[19 + 8 * n];
     117        cv->chars[n] = ((uint32_t)buf[16 + 0 + 8 * n] << 24)
     118                     | ((uint32_t)buf[16 + 1 + 8 * n] << 16)
     119                     | ((uint32_t)buf[16 + 2 + 8 * n] << 8)
     120                     | (uint32_t)buf[16 + 3 + 8 * n];
     121        cv->attr[n] = ((uint32_t)buf[16 + 4 + 8 * n] << 24)
     122                    | ((uint32_t)buf[16 + 5 + 8 * n] << 16)
     123                    | ((uint32_t)buf[16 + 6 + 8 * n] << 8)
     124                    | (uint32_t)buf[16 + 7 + 8 * n];
    126125    }
    127126
  • libcaca/trunk/cucul/export.c

    r813 r818  
    2828#include "cucul_internals.h"
    2929
     30static void export_caca(cucul_canvas_t *, cucul_buffer_t *);
    3031static void export_ansi(cucul_canvas_t *, cucul_buffer_t *);
    3132static void export_html(cucul_canvas_t *, cucul_buffer_t *);
     
    4546 *  Valid values for \e format are:
    4647 *
     48 *  \li \e "caca": export native libcaca files.
     49 *
    4750 *  \li \e "ansi": export ANSI art (CP437 charset with ANSI colour codes).
    4851 *
     
    7174    ex->data = NULL;
    7275
    73     if(!strcasecmp("ansi", format))
     76    if(!strcasecmp("caca", format))
     77        export_caca(cv, ex);
     78    else if(!strcasecmp("ansi", format))
    7479        export_ansi(cv, ex);
    7580    else if(!strcasecmp("html", format))
     
    108113    static char const * const list[] =
    109114    {
     115        "caca", "native libcaca format",
    110116        "ansi", "ANSI",
    111117        "html", "HTML",
     
    124130 * XXX: the following functions are local.
    125131 */
     132
     133/* Generate a native libcaca canvas file. */
     134static void export_caca(cucul_canvas_t *cv, cucul_buffer_t *ex)
     135{
     136    uint32_t *attr = cv->attr;
     137    uint32_t *chars = cv->chars;
     138    char *cur;
     139    uint32_t w, h;
     140    unsigned int n;
     141
     142    /* 16 bytes for the canvas, 8 bytes for each character cell. */
     143    ex->size = 16 + 8 * cv->width * cv->height;
     144    ex->data = malloc(ex->size);
     145
     146    cur = ex->data;
     147
     148    w = cv->width;
     149    h = cv->height;
     150
     151    cur += sprintf(cur, "CACACANV%c%c%c%c%c%c%c%c",
     152                   (w >> 24), (w >> 16) & 0xff, (w >> 8) & 0xff, w & 0xff,
     153                   (h >> 24), (h >> 16) & 0xff, (h >> 8) & 0xff, h & 0xff);
     154
     155    for(n = cv->height * cv->width; n--; )
     156    {
     157        uint32_t ch = *chars++;
     158        uint32_t a = *attr++;
     159
     160        *cur++ = ch >> 24;
     161        *cur++ = (ch >> 16) & 0xff;
     162        *cur++ = (ch >> 8) & 0xff;
     163        *cur++ = ch & 0xff;
     164
     165        *cur++ = a >> 24;
     166        *cur++ = (a >> 16) & 0xff;
     167        *cur++ = (a >> 8) & 0xff;
     168        *cur++ = a & 0xff;
     169    }
     170}
    126171
    127172/* Generate ANSI representation of current canvas. */
  • libcaca/trunk/src/cacaserver.c

    r813 r818  
    135135    server = malloc(sizeof(struct server));
    136136
    137     server->input = malloc(12);
     137    server->input = malloc(16);
    138138    server->read = 0;
    139139
     
    206206
    207207        /* Read data from stdin */
    208         read(0, buf, 12);
    209 
    210         while(buf[0] != 'C' && buf[1] != 'A' && buf[2] != 'C' && buf[3] != 'A')
    211         {
    212             memmove(buf, buf + 1, 11);
    213             read(0, buf + 11, 1);
    214         }
    215 
    216         width = ((uint32_t)buf[4] << 24) | ((uint32_t)buf[5] << 16)
    217               | ((uint32_t)buf[6] << 8) | (uint32_t)buf[7];
    218         height = ((uint32_t)buf[8] << 24) | ((uint32_t)buf[9] << 16)
     208        read(0, buf, 16);
     209
     210        while(buf[0] != 'C' || buf[1] != 'A' || buf[2] != 'C' || buf[3] != 'A')
     211        {
     212            memmove(buf, buf + 1, 15);
     213            read(0, buf + 15, 1);
     214        }
     215
     216        width = ((uint32_t)buf[8] << 24) | ((uint32_t)buf[9] << 16)
    219217               | ((uint32_t)buf[10] << 8) | (uint32_t)buf[11];
    220 
    221         size = 12 + width * height * 8 + 4;
     218        height = ((uint32_t)buf[12] << 24) | ((uint32_t)buf[13] << 16)
     219                | ((uint32_t)buf[14] << 8) | (uint32_t)buf[15];
     220
     221        size = 16 + width * height * 8;
    222222        buf = server->input = realloc(server->input, size);
    223         read(0, buf + 12, size - 12);
     223        read(0, buf + 16, size - 16);
    224224
    225225        /* Free the previous canvas, if any */
     
    240240
    241241        /* Get ANSI representation of the image and skip the end-of buffer
    242          * linefeed ("\r\n\0", 3 bytes) */
     242         * linefeed ("\r\n", 2 bytes) */
    243243        server->buffer = cucul_create_export(server->canvas, "ansi");
    244         server->buflen -= 3;
     244        server->bufdata = cucul_get_buffer_data(server->buffer);
     245        server->buflen = cucul_get_buffer_size(server->buffer);
     246        server->buflen -= 2;
    245247
    246248        for(i = 0; i < server->client_count; i++)
     
    411413                ret = 0;
    412414            else
     415            {
     416                fprintf(stderr, "client %i failed (%s)\n",
     417                        c->fd, strerror(errno));
    413418                return -1;
     419            }
    414420        }
    415421
     
    459465            ret = 0;
    460466        else
     467        {
     468            fprintf(stderr, "client %i failed (%s)\n", c->fd, strerror(errno));
    461469            return -1;
     470        }
    462471    }
    463472
     
    488497            ret = 0;
    489498        else
     499        {
     500            fprintf(stderr, "client %i failed (%s)\n", c->fd, strerror(errno));
    490501            return -1;
     502        }
    491503    }
    492504
Note: See TracChangeset for help on using the changeset viewer.