From e48078c585c0546a915f4594d12dd6d93657c3a6 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Thu, 16 Mar 2006 18:09:26 +0000 Subject: [PATCH] * Optimised for speed and space, fixed a few bugs, and improved coding style in the PS exporter (vieux porc !). --- cucul/export_ps.c | 134 ++++++++++++++++++++-------------------------- 1 file changed, 57 insertions(+), 77 deletions(-) diff --git a/cucul/export_ps.c b/cucul/export_ps.c index c39d66b..a8358fe 100644 --- a/cucul/export_ps.c +++ b/cucul/export_ps.c @@ -10,7 +10,7 @@ */ /** \file export.c - * \version \$Id: export_irc.c 384 2006-03-13 18:07:35Z sam $ + * \version \$Id$ * \author Sam Hocevar * \author Jean-Yves Lamoureux * \brief Export function @@ -30,29 +30,30 @@ #include "cucul_internals.h" static char const *ps_header = - "%%! \n" - "%%%% libcaca PDF export \n" - "%%%%LanguageLevel: 2 \n" - "%%%%Pages: 1 \n" - "%%%%DocumentData: Clean7Bit \n" - "/csquare { \n" - " newpath \n" - " 0 0 moveto \n" - " 0 1 rlineto \n" - " 1 0 rlineto \n" - " 0 -1 rlineto \n" - " closepath \n" - " setrgbcolor \n" - " fill \n" - "} def \n" - "/S { \n" - " Show \n" - "} bind def \n" - "/Courier-Bold findfont \n" - "8 scalefont \n" + //"%!PS-Adobe-2.0\n" + "%!\n" + "%% libcaca PDF export\n" + "%%LanguageLevel: 2\n" + "%%Pages: 1\n" + "%%DocumentData: Clean7Bit\n" + "/csquare {\n" + " newpath\n" + " 0 0 moveto\n" + " 0 1 rlineto\n" + " 1 0 rlineto\n" + " 0 -1 rlineto\n" + " closepath\n" + " setrgbcolor\n" + " fill\n" + "} def\n" + "/S {\n" + " Show\n" + "} bind def\n" + "/Courier-Bold findfont\n" + "8 scalefont\n" "setfont\n" - "gsave \n" - "6 10 scale \n"; + "gsave\n" + "6 10 scale\n"; /** \brief Generate Postscript representation of current image. * @@ -61,31 +62,17 @@ static char const *ps_header = */ void _cucul_get_ps(cucul_t *qq, struct cucul_buffer *ex) { - char *cur; - int x, y; - - static float const paletteR[] = - { - 0, 0, 0, 0, - 0.5, 0.5, 0.5, 0.5, - 0.5, 0.5, 0.5, 0.5, - 1.0, 1.0, 1.0, 1.0, - }; - static float const paletteG[] = - { - 0, 0, 0.5, 0.5, - 0, 0, 0.5, 0.5, - 0, 0, 1.0, 1.0, - 0, 0, 1.0, 1.0, - }; - static float const paletteB[] = - { - 0, 0.5, 0, 0.5, - 0, 0.5, 0, 0.5, - 0, 1.0, 0.5, 1.0, - 0, 1.0, 0, 1.0, - }; + static char const * const palette[] = + { + "0.0 0.0 0.0", "0.0 0.0 0.5", "0.0 0.5 0.0", "0.0 0.5 0.5", + "0.5 0.0 0.0", "0.5 0.0 0.5", "0.5 0.5 0.0", "0.5 0.5 0.5", + + "0.2 0.2 0.2", "0.2 0.2 1.0", "0.2 1.0 0.2", "0.2 1.0 1.0", + "1.0 0.2 0.2", "1.0 0.2 1.0", "1.0 1.0 0.2", "1.0 1.0 1.0", + }; + char *cur; + unsigned int x, y; /* 200 is arbitrary but should be ok */ ex->size = strlen(ps_header) + (qq->width * qq->height * 200); @@ -97,48 +84,41 @@ void _cucul_get_ps(cucul_t *qq, struct cucul_buffer *ex) cur += sprintf(cur, "%s", ps_header); /* Background, drawn using csquare macro defined in header */ - for(y=(int)(qq->height-1);y>=0; y--) { + for(y = qq->height; y--; ) + { uint8_t *lineattr = qq->attr + y * qq->width; - for(x = 0; x < (int)qq->width; x++) { - float bgR = paletteR[lineattr[x] >> 4]; - float bgG = paletteG[lineattr[x] >> 4]; - float bgB = paletteB[lineattr[x] >> 4]; - - - cur += sprintf(cur, "1 0 translate \n %f %f %f csquare\n", bgR, bgG, bgB); - } - - /* Return to beginning of the line, and jump to the next one */ - cur += sprintf(cur, "%d 1 translate \n", -qq->width); - + for(x = 0; x < qq->width; x++) + { + cur += sprintf(cur, "1 0 translate\n %s csquare\n", + palette[*lineattr++ >> 4]); + } + /* Return to beginning of the line, and jump to the next one */ + cur += sprintf(cur, "-%d 1 translate\n", qq->width); } - cur += sprintf(cur, "grestore\n"); // Restore normal transformation matrix - for(y=(int)(qq->height-1);y>=0; y--) { - uint8_t *lineattr = qq->attr + y * qq->width; - uint32_t *linechar = qq->chars + y * qq->width; - - for(x = 0; x < (int)qq->width; x++) { - uint32_t cR = linechar[x]; - float fgR = paletteR[lineattr[x] & 0x0f]; - float fgG = paletteG[lineattr[x] & 0x0f]; - float fgB = paletteB[lineattr[x] & 0x0f]; + cur += sprintf(cur, "grestore\n"); /* Restore transformation matrix */ - cur += sprintf(cur, "newpath\n%d %d moveto\n", (x+1)*6, (y)*10); - cur += sprintf(cur, "%f %f %f setrgbcolor\n", fgR, fgG, fgB); - cur += sprintf(cur, "(%c) show\n", cR); + for(y = qq->height; y--; ) + { + uint8_t *lineattr = qq->attr + y * qq->width; + uint32_t *linechar = qq->chars + y * qq->width; - } + for(x = 0; x < qq->width; x++) + { + 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]); + cur += sprintf(cur, "(%c) show\n", *linechar++ & 0x7f); + } } - - cur += sprintf(cur, "showpage"); + cur += sprintf(cur, "showpage\n"); /* Crop to really used size */ ex->size = strlen(ex->buffer) + 1; ex->buffer = realloc(ex->buffer, ex->size); - }