| @@ -31,15 +31,15 @@ | |||||
| #include "cucul.h" | #include "cucul.h" | ||||
| #include "cucul_internals.h" | #include "cucul_internals.h" | ||||
| static void export_caca(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static void export_ansi(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static void export_utf8(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static void export_html(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static void export_html3(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static void export_irc(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static void export_ps(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static void export_svg(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static void export_tga(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static int export_caca(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static int export_ansi(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static int export_utf8(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static int export_html(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static int export_html3(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static int export_irc(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static int export_ps(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static int export_svg(cucul_canvas_t *, cucul_buffer_t *); | |||||
| static int export_tga(cucul_canvas_t *, cucul_buffer_t *); | |||||
| /** \brief Export a canvas into a foreign format. | /** \brief Export a canvas into a foreign format. | ||||
| * | * | ||||
| @@ -60,7 +60,7 @@ static void export_tga(cucul_canvas_t *, cucul_buffer_t *); | |||||
| * - \c "tga": export a TGA image. | * - \c "tga": export a TGA image. | ||||
| * | * | ||||
| * If an error occurs, NULL is returned and \b errno is set accordingly: | * If an error occurs, NULL is returned and \b errno is set accordingly: | ||||
| * - \c EINVAL Invalid format requested. | |||||
| * - \c EINVAL Unsupported format requested. | |||||
| * - \c ENOMEM Not enough memory to allocate output buffer. | * - \c ENOMEM Not enough memory to allocate output buffer. | ||||
| * | * | ||||
| * \param cv A libcucul canvas | * \param cv A libcucul canvas | ||||
| @@ -70,6 +70,7 @@ static void export_tga(cucul_canvas_t *, cucul_buffer_t *); | |||||
| cucul_buffer_t * cucul_export_canvas(cucul_canvas_t *cv, char const *format) | cucul_buffer_t * cucul_export_canvas(cucul_canvas_t *cv, char const *format) | ||||
| { | { | ||||
| cucul_buffer_t *ex; | cucul_buffer_t *ex; | ||||
| int ret = -1; | |||||
| ex = malloc(sizeof(cucul_buffer_t)); | ex = malloc(sizeof(cucul_buffer_t)); | ||||
| if(!ex) | if(!ex) | ||||
| @@ -85,25 +86,25 @@ cucul_buffer_t * cucul_export_canvas(cucul_canvas_t *cv, char const *format) | |||||
| ex->user_data = 0; | ex->user_data = 0; | ||||
| if(!strcasecmp("caca", format)) | if(!strcasecmp("caca", format)) | ||||
| export_caca(cv, ex); | |||||
| ret = export_caca(cv, ex); | |||||
| else if(!strcasecmp("ansi", format)) | else if(!strcasecmp("ansi", format)) | ||||
| export_ansi(cv, ex); | |||||
| ret = export_ansi(cv, ex); | |||||
| else if(!strcasecmp("utf8", format)) | else if(!strcasecmp("utf8", format)) | ||||
| export_utf8(cv, ex); | |||||
| ret = export_utf8(cv, ex); | |||||
| else if(!strcasecmp("html", format)) | else if(!strcasecmp("html", format)) | ||||
| export_html(cv, ex); | |||||
| ret = export_html(cv, ex); | |||||
| else if(!strcasecmp("html3", format)) | else if(!strcasecmp("html3", format)) | ||||
| export_html3(cv, ex); | |||||
| ret = export_html3(cv, ex); | |||||
| else if(!strcasecmp("irc", format)) | else if(!strcasecmp("irc", format)) | ||||
| export_irc(cv, ex); | |||||
| ret = export_irc(cv, ex); | |||||
| else if(!strcasecmp("ps", format)) | else if(!strcasecmp("ps", format)) | ||||
| export_ps(cv, ex); | |||||
| ret = export_ps(cv, ex); | |||||
| else if(!strcasecmp("svg", format)) | else if(!strcasecmp("svg", format)) | ||||
| export_svg(cv, ex); | |||||
| ret = export_svg(cv, ex); | |||||
| else if(!strcasecmp("tga", format)) | else if(!strcasecmp("tga", format)) | ||||
| export_tga(cv, ex); | |||||
| ret = export_tga(cv, ex); | |||||
| if(ex->size == 0) | |||||
| if(ret < 0) | |||||
| { | { | ||||
| free(ex); | free(ex); | ||||
| #if defined(HAVE_ERRNO_H) | #if defined(HAVE_ERRNO_H) | ||||
| @@ -150,7 +151,7 @@ char const * const * cucul_get_export_list(void) | |||||
| */ | */ | ||||
| /* Generate a native libcaca canvas file. */ | /* Generate a native libcaca canvas file. */ | ||||
| static void export_caca(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| static int export_caca(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| { | { | ||||
| uint32_t *attr = cv->attr; | uint32_t *attr = cv->attr; | ||||
| uint32_t *chars = cv->chars; | uint32_t *chars = cv->chars; | ||||
| @@ -188,10 +189,12 @@ static void export_caca(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| *cur++ = (a >> 8) & 0xff; | *cur++ = (a >> 8) & 0xff; | ||||
| *cur++ = a & 0xff; | *cur++ = a & 0xff; | ||||
| } | } | ||||
| return 0; | |||||
| } | } | ||||
| /* Generate UTF-8 representation of current canvas. */ | /* Generate UTF-8 representation of current canvas. */ | ||||
| static void export_utf8(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| static int export_utf8(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| { | { | ||||
| static uint8_t const palette[] = | static uint8_t const palette[] = | ||||
| { | { | ||||
| @@ -265,10 +268,12 @@ static void export_utf8(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| /* Crop to really used size */ | /* Crop to really used size */ | ||||
| ex->size = (uintptr_t)(cur - ex->data); | ex->size = (uintptr_t)(cur - ex->data); | ||||
| ex->data = realloc(ex->data, ex->size); | ex->data = realloc(ex->data, ex->size); | ||||
| return 0; | |||||
| } | } | ||||
| /* Generate ANSI representation of current canvas. */ | /* Generate ANSI representation of current canvas. */ | ||||
| static void export_ansi(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| static int export_ansi(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| { | { | ||||
| static uint8_t const palette[] = | static uint8_t const palette[] = | ||||
| { | { | ||||
| @@ -341,10 +346,12 @@ static void export_ansi(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| /* Crop to really used size */ | /* Crop to really used size */ | ||||
| ex->size = (uintptr_t)(cur - ex->data); | ex->size = (uintptr_t)(cur - ex->data); | ||||
| ex->data = realloc(ex->data, ex->size); | ex->data = realloc(ex->data, ex->size); | ||||
| return 0; | |||||
| } | } | ||||
| /* Generate HTML representation of current canvas. */ | /* Generate HTML representation of current canvas. */ | ||||
| static void export_html(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| static int export_html(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| { | { | ||||
| char *cur; | char *cur; | ||||
| unsigned int x, y, len; | unsigned int x, y, len; | ||||
| @@ -405,13 +412,15 @@ static void export_html(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| /* Crop to really used size */ | /* Crop to really used size */ | ||||
| ex->size = strlen(ex->data) + 1; | ex->size = strlen(ex->data) + 1; | ||||
| ex->data = realloc(ex->data, ex->size); | ex->data = realloc(ex->data, ex->size); | ||||
| return 0; | |||||
| } | } | ||||
| /* Export an HTML3 document. This function is way bigger than export_html(), | /* Export an HTML3 document. This function is way bigger than export_html(), | ||||
| * but permits viewing in old browsers (or limited ones such as links). It | * but permits viewing in old browsers (or limited ones such as links). It | ||||
| * will not work under gecko (mozilla rendering engine) unless you set a | * will not work under gecko (mozilla rendering engine) unless you set a | ||||
| * correct header. */ | * correct header. */ | ||||
| static void export_html3(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| static int export_html3(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| { | { | ||||
| char *cur; | char *cur; | ||||
| unsigned int x, y, len; | unsigned int x, y, len; | ||||
| @@ -479,10 +488,12 @@ static void export_html3(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| /* Crop to really used size */ | /* Crop to really used size */ | ||||
| ex->size = (uintptr_t)(cur - ex->data); | ex->size = (uintptr_t)(cur - ex->data); | ||||
| ex->data = realloc(ex->data, ex->size); | ex->data = realloc(ex->data, ex->size); | ||||
| return 0; | |||||
| } | } | ||||
| /* Export a text file with IRC colours */ | /* Export a text file with IRC colours */ | ||||
| static void export_irc(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| static int export_irc(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| { | { | ||||
| static uint8_t const palette[] = | static uint8_t const palette[] = | ||||
| { | { | ||||
| @@ -578,10 +589,12 @@ static void export_irc(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| /* Crop to really used size */ | /* Crop to really used size */ | ||||
| ex->size = (uintptr_t)(cur - ex->data); | ex->size = (uintptr_t)(cur - ex->data); | ||||
| ex->data = realloc(ex->data, ex->size); | ex->data = realloc(ex->data, ex->size); | ||||
| return 0; | |||||
| } | } | ||||
| /* Export a PostScript document. */ | /* Export a PostScript document. */ | ||||
| static void export_ps(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| static int export_ps(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| { | { | ||||
| static char const *ps_header = | static char const *ps_header = | ||||
| "%!\n" | "%!\n" | ||||
| @@ -612,7 +625,7 @@ static void export_ps(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| unsigned int x, y; | unsigned int x, y; | ||||
| /* 200 is arbitrary but should be ok */ | /* 200 is arbitrary but should be ok */ | ||||
| ex->size = strlen(ps_header) + (cv->width * cv->height * 200); | |||||
| ex->size = strlen(ps_header) + 100 + cv->height * (32 + cv->width * 200); | |||||
| ex->data = malloc(ex->size); | ex->data = malloc(ex->size); | ||||
| cur = ex->data; | cur = ex->data; | ||||
| @@ -685,10 +698,12 @@ static void export_ps(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| /* Crop to really used size */ | /* Crop to really used size */ | ||||
| ex->size = (uintptr_t)(cur - ex->data); | ex->size = (uintptr_t)(cur - ex->data); | ||||
| ex->data = realloc(ex->data, ex->size); | ex->data = realloc(ex->data, ex->size); | ||||
| return 0; | |||||
| } | } | ||||
| /* Export an SVG vector image */ | /* Export an SVG vector image */ | ||||
| static void export_svg(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| static int export_svg(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| { | { | ||||
| static char const svg_header[] = | static char const svg_header[] = | ||||
| "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" | "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" | ||||
| @@ -701,7 +716,7 @@ static void export_svg(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| unsigned int x, y; | unsigned int x, y; | ||||
| /* 200 is arbitrary but should be ok */ | /* 200 is arbitrary but should be ok */ | ||||
| ex->size = strlen(svg_header) + (cv->width * cv->height * 200); | |||||
| ex->size = strlen(svg_header) + 128 + cv->width * cv->height * 200; | |||||
| ex->data = malloc(ex->size); | ex->data = malloc(ex->size); | ||||
| cur = ex->data; | cur = ex->data; | ||||
| @@ -769,19 +784,21 @@ static void export_svg(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| /* Crop to really used size */ | /* Crop to really used size */ | ||||
| ex->size = (uintptr_t)(cur - ex->data); | ex->size = (uintptr_t)(cur - ex->data); | ||||
| ex->data = realloc(ex->data, ex->size); | ex->data = realloc(ex->data, ex->size); | ||||
| return 0; | |||||
| } | } | ||||
| /* Export a TGA image */ | /* Export a TGA image */ | ||||
| static void export_tga(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| static int export_tga(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| { | { | ||||
| char const * const * fontlist; | |||||
| char const * const *fontlist; | |||||
| char * cur; | char * cur; | ||||
| cucul_font_t *f; | cucul_font_t *f; | ||||
| unsigned int i, w, h; | unsigned int i, w, h; | ||||
| fontlist = cucul_get_font_list(); | fontlist = cucul_get_font_list(); | ||||
| if(!fontlist[0]) | if(!fontlist[0]) | ||||
| return; | |||||
| return -1; | |||||
| f = cucul_load_font(fontlist[0], 0); | f = cucul_load_font(fontlist[0], 0); | ||||
| @@ -825,5 +842,7 @@ static void export_tga(cucul_canvas_t *cv, cucul_buffer_t *ex) | |||||
| } | } | ||||
| cucul_free_font(f); | cucul_free_font(f); | ||||
| return 0; | |||||
| } | } | ||||