Changeset 603 for libcaca/trunk


Ignore:
Timestamp:
Mar 14, 2006, 5:51:38 PM (15 years ago)
Author:
Jean-Yves Lamoureux
Message:
  • Postscript exporter now kinda works. Paper size to be fixed
File:
1 edited

Legend:

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

    r602 r603  
    3131
    3232
    33 char ps_header[] = {"%%! \n \
    34 %%%% libcaca PDF export      \n \
    35 %%%%LanguageLevel: 2 \n \
    36 %%%%Pages: 1 \n \
    37 %%%%DocumentData: Clean7Bit \n \
    38 /csquare { \n \
    39         newpath \n \
    40         0 0 moveto \n \
    41         0 1 rlineto \n \
    42         1 0 rlineto \n \
    43         0 -1 rlineto \n \
    44         closepath \n \
    45         setrgbcolor \n \
    46         fill \n \
    47 } def \n \
    48 /S { \n \
    49   Show \n \
    50 } bind def \n \
    51  \n \
    52  \n \
    53 /Times-Roman findfont \n \
    54 8 scalefont \n \
    55 setfont\n \
    56 6 10 scale \n"};
    57 
    58 
     33char ps_header[] = {"%%! \n "
     34                    "%%%% libcaca PDF export      \n "
     35                    "%%%%LanguageLevel: 2 \n "
     36                    "%%%%Pages: 1 \n "
     37                    "%%%%DocumentData: Clean7Bit \n "
     38                    "/csquare { \n "
     39                    "        newpath \n "
     40                    "        0 0 moveto \n "
     41                    "        0 1 rlineto \n "
     42                    "        1 0 rlineto \n "
     43                    "        0 -1 rlineto \n "
     44                    "        closepath \n "
     45                    "        setrgbcolor \n "
     46                    "        fill \n "
     47                    "} def \n "
     48                    "/S { \n "
     49                    "  Show \n "
     50                    "} bind def \n "
     51                    " \n "
     52                    " \n "
     53                    "/Courier-Bold findfont \n "
     54                    "8 scalefont \n "
     55                    "setfont\n "
     56                    "gsave \n "
     57                    "6 10 scale \n"};
    5958
    6059
     
    6665char* cucul_get_ps(cucul_t *qq, int *size)
    6766{
     67    char *cur;
     68    int x, y;
    6869
    6970    static float const paletteR[] =
    70     {
    71         0,   0,   0,   0,
    72         0.5, 0.5, 0.5, 0.5,
    73         0.5, 0.5, 0.5, 0.5,
    74         1.0, 1.0, 1.0, 1.0,
    75     };
     71        {
     72            0,   0,   0,   0,
     73            0.5, 0.5, 0.5, 0.5,
     74            0.5, 0.5, 0.5, 0.5,
     75            1.0, 1.0, 1.0, 1.0,
     76        };
    7677    static float const paletteG[] =
    77     {
    78         0, 0, 0.5, 0.5,
    79         0, 0, 0.5, 0.5,
    80         0, 0, 1.0, 1.0,
    81         0, 0, 1.0, 1.0,
    82     };
     78        {
     79            0, 0, 0.5, 0.5,
     80            0, 0, 0.5, 0.5,
     81            0, 0, 1.0, 1.0,
     82            0, 0, 1.0, 1.0,
     83        };
    8384    static float const paletteB[] =
    84     {
    85         0, 0.5, 0,   0.5,
    86         0, 0.5, 0,   0.5,
    87         0, 1.0, 0.5, 1.0,
    88         0, 1.0, 0,   1.0,
    89     };
     85        {
     86            0, 0.5, 0,   0.5,
     87            0, 0.5, 0,   0.5,
     88            0, 1.0, 0.5, 1.0,
     89            0, 1.0, 0,   1.0,
     90        };
    9091
    91 
    92     char *cur;
    93     unsigned int x, y;
    9492
    9593    if(qq->ps_buffer)
    9694        free(qq->ps_buffer);
    9795
    98     /* 400 is arbitrary and needs to be precised */
    99     qq->ps_buffer = malloc((strlen(ps_header) + (qq->height*qq->width)*400) * sizeof(char));
     96    /* 200 is arbitrary but should be ok */
     97    qq->ps_buffer = malloc((strlen(ps_header) + (qq->height*qq->width)*200) * sizeof(char));
    10098    cur = qq->ps_buffer;
    10199
     
    105103
    106104    /* Background, drawn using csquare macro defined in header */
    107     for(y=0;y<qq->height; y++) {
     105    for(y=(int)(qq->height-1);y>=0; y--) {
    108106        uint8_t *lineattr = qq->attr + y * qq->width;
    109107
    110         for(x = 0; x < qq->width; x++) {
     108        for(x = 0; x < (int)qq->width; x++) {
    111109            float bgR = paletteR[lineattr[x] >> 4];
    112110            float bgG = paletteG[lineattr[x] >> 4];
     
    123121    }
    124122
    125     /* Text. FIXME, doesn't work yet */
    126     cur += sprintf(cur, "1 1 scale\n");
    127     cur += sprintf(cur, "newpath\n0 0 moveto\n");
    128     for(y=0;y<qq->height; y++) {
    129         uint8_t *lineattr = qq->attr + y * qq->width;
     123    cur += sprintf(cur, "grestore\n");  // Restore normal transformation matrix
     124    for(y=(int)(qq->height-1);y>=0; y--) {
     125        uint8_t  *lineattr = qq->attr + y * qq->width;
    130126        uint32_t *linechar = qq->chars + y * qq->width;
    131127
    132         for(x = 0; x < qq->width; x++) {
     128        for(x = 0; x < (int)qq->width; x++) {
    133129            uint32_t cR = linechar[x];
    134130            float fgR = paletteR[lineattr[x] & 0x0f];
     
    136132            float fgB = paletteB[lineattr[x] & 0x0f];
    137133
     134            cur += sprintf(cur, "newpath\n%d %d moveto\n", (x+1)*6, (y)*10);
    138135            cur += sprintf(cur, "%f %f %f setrgbcolor\n", fgR, fgG, fgB);
    139             cur += sprintf(cur, "1 0 translate\n");
    140             cur += sprintf(cur, "{%c} \n", cR);
     136            cur += sprintf(cur, "(%c) show\n", cR);
    141137
    142138        }
    143         cur += sprintf(cur, "%d 1 translate \n", -qq->width);
    144139    }
    145140
     
    149144    /* Crop to really used size */
    150145    *size = (strlen(qq->ps_buffer) + 1) * sizeof(char);
     146
    151147    qq->ps_buffer = realloc(qq->ps_buffer, *size);
    152148
Note: See TracChangeset for help on using the changeset viewer.