Changeset 637 for libcaca/trunk


Ignore:
Timestamp:
Mar 16, 2006, 7:58:39 PM (15 years ago)
Author:
Sam Hocevar
Message:
  • Fixed Unicode handling and improved coding style in the SVG exporter.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/cucul/export_svg.c

    • Property svn:keywords set to Id
    r621 r637  
    1111
    1212/** \file export.c
    13  *  \version \$Id: export_irc.c 384 2006-03-13 18:07:35Z sam $
     13 *  \version \$Id$
    1414 *  \author Sam Hocevar <sam@zoy.org>
    1515 *  \author Jean-Yves Lamoureux <jylam@lnxscene.org>
     
    3030#include "cucul_internals.h"
    3131
    32 static char const *svg_header =
     32static char const svg_header[] =
    3333    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
    3434    "<svg width=\"%d\" height=\"%d\" viewBox=\"0 0 %d %d\""
    35     " xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" "
    36     "xml:space=\"preserve\" version=\"1.1\"  baseProfile=\"full\">\n"
     35    " xmlns=\"http://www.w3.org/2000/svg\""
     36    " xmlns:xlink=\"http://www.w3.org/1999/xlink\""
     37    " xml:space=\"preserve\" version=\"1.1\"  baseProfile=\"full\">\n"
    3738    " <defs>\n"
    3839    "  <style type=\"text/css\">\n"
    3940    "    <![CDATA[\n";
    40 
    4141
    4242/** \brief Generate SVG representation of current image.
     
    4747void _cucul_get_svg(cucul_t *qq, struct cucul_buffer *ex)
    4848{
    49     char *cur;
    50     int x, y;
    51 
    52 
    5349    static int const palette[] =
    5450    {
     
    5955    };
    6056
     57    char *cur;
     58    unsigned int x, y;
     59
    6160    /* 200 is arbitrary but should be ok */
    6261    ex->size = strlen(svg_header) + (qq->width * qq->height * 200);
     
    6665
    6766    /* Header */
    68     cur += sprintf(cur, svg_header, qq->width*6, qq->height*10, qq->width*6, qq->height*10);
     67    cur += sprintf(cur, svg_header, qq->width * 6, qq->height * 10,
     68                                    qq->width * 6, qq->height * 10);
    6969
    7070    /* Precalc of colors in CSS style  */
    7171    for(x = 0; x < 0x100; x++)
    7272    {
    73         cur += sprintf(cur, ".b%02x {fill:#%06X}\n",
    74                        x,
    75                        palette[x >> 4 ]);
    76 
    77        cur += sprintf(cur, ".f%02x {fill:#%06X}\n",
    78                        x,
    79                        palette[x & 0xf ]);
     73        cur += sprintf(cur, ".b%02x {fill:#%06X}\n", x, palette[x >> 4]);
     74        cur += sprintf(cur, ".f%02x {fill:#%06X}\n", x, palette[x & 0xf]);
    8075    }
    8176
    8277    cur += sprintf(cur, "]]>\n");
    83     cur += sprintf(cur, "</style>\n");
    84     cur += sprintf(cur, "</defs>\n");
    85     cur += sprintf(cur, "<g id=\"mainlayer\" font-size=\"12\">\n");
    86 
     78    cur += sprintf(cur, "  </style>\n");
     79    cur += sprintf(cur, " </defs>\n");
     80    cur += sprintf(cur, " <g id=\"mainlayer\" font-size=\"12\">\n");
    8781
    8882    /* Background */
    89     for(y=0; y<(int)(qq->height);y++) {
    90         uint8_t *lineattr = qq->attr + y * qq->width;
    91         for(x = 0; x < (int)qq->width; x++) {
    92             cur += sprintf(cur, "<rect class=\"b%02x\" x=\"%d\" y=\"%d\" width=\"6\" height=\"10\"/>\n",
    93                            lineattr[x],
    94                            x*6,
    95                            y*10);
    96         }
     83    for(y = 0; y < qq->height; y++)
     84    {
     85        uint8_t *lineattr = qq->attr + y * qq->width;
     86
     87        for(x = 0; x < qq->width; x++)
     88        {
     89            cur += sprintf(cur, "<rect class=\"b%02x\" x=\"%d\" y=\"%d\""
     90                                " width=\"6\" height=\"10\"/>\n",
     91                                *lineattr++, x * 6, y * 10);
     92        }
    9793    }
    9894
    9995    /* Text */
    100     for(y=0; y<(int)(qq->height);y++) {
    101         uint8_t *lineattr = qq->attr + y * qq->width;
    102         uint32_t *linechar = qq->chars + y * qq->width;
    103         for(x = 0; x < (int)qq->width; x++) {
    104             cur += sprintf(cur, "<text  class=\"f%02x\" x=\"%d\" y=\"%d\">%c</text>\n",
    105                            lineattr[x],
    106                            x*6,
    107                            (y*10)+10,
    108                            linechar[x]);
    109         }
     96    for(y = 0; y < qq->height; y++)
     97    {
     98        uint8_t *lineattr = qq->attr + y * qq->width;
     99        uint32_t *linechar = qq->chars + y * qq->width;
     100
     101        for(x = 0; x < qq->width; x++)
     102        {
     103            uint32_t c = *linechar++;
     104
     105            cur += sprintf(cur, "<text class=\"f%02x\" x=\"%d\" y=\"%d\">",
     106                                *lineattr++, x * 6, (y * 10) + 10);
     107            if(c < 0x00000020)
     108                cur += sprintf(cur, "?");
     109            else if(c < 0x00000080)
     110                cur += sprintf(cur, "%c", c);
     111            else
     112                cur += sprintf(cur, "?"); /* FIXME: SVG supports UTF-8 */
     113            cur += sprintf(cur, "</text>\n");
     114        }
    110115    }
    111116
    112 
    113     cur += sprintf(cur, "</g>\n");
     117    cur += sprintf(cur, " </g>\n");
    114118    cur += sprintf(cur, "</svg>\n");
    115119
Note: See TracChangeset for help on using the changeset viewer.