bool load_image(wmfAPI *API, const char *path) { wmf_error_t error; error = wmf_file_open(API, path); if (error != wmf_E_None) { wmf_api_destroy (API); return False; } return True; }
int wmf2svg_draw (PlotData* pdata) { int status = 0; float wmf_width; float wmf_height; float ratio_wmf; float ratio_bounds; unsigned long flags; unsigned long max_flags; static char* Default_Description = "wmf2svg"; ImageContext IC; wmf_error_t err; wmf_svg_t* ddata = 0; wmfAPI* API = 0; wmfAPI_Options api_options; flags = 0; flags |= WMF_OPT_FUNCTION; api_options.function = wmf_svg_function; flags |= WMF_OPT_ARGS; api_options.argc = pdata->argc; api_options.argv = pdata->argv; #ifndef DEBUG flags |= WMF_OPT_IGNORE_NONFATAL; #endif err = wmf_api_create (&API,flags,&api_options); status = explicit_wmf_error ("wmf_api_create",err); if (status) { if (API) wmf_api_destroy (API); return (status); } err = wmf_file_open (API,pdata->wmf_filename); status = explicit_wmf_error ("wmf_file_open",err); if (status) { wmf_api_destroy (API); return (status); } err = wmf_scan (API,0,&(pdata->options.bbox)); status = explicit_wmf_error ("wmf_scan",err); if (status) { wmf_api_destroy (API); return (status); } /* Okay, got this far, everything seems cool. */ ddata = WMF_SVG_GetData (API); if (pdata->out) { ddata->out = wmf_stream_create (API,pdata->out); } else { ddata->out = wmf_ztream_create (API,pdata->outz); } if (pdata->options.Description) ddata->Description = pdata->options.Description; else ddata->Description = Default_Description; ddata->bbox = pdata->options.bbox; wmf_size (API,&wmf_width,&wmf_height); if ((wmf_width <= 0) || (wmf_height <= 0)) { fputs ("Bad image size - but this error shouldn't occur...\n",stderr); status = 1; wmf_api_destroy (API); return (status); } max_flags = pdata->max_flags; if ((wmf_width > (float) pdata->max_width ) || (wmf_height > (float) pdata->max_height)) { if (max_flags == 0) max_flags = WMF2SVG_MAXPECT; } if (max_flags == WMF2SVG_MAXPECT) /* scale the image */ { ratio_wmf = wmf_height / wmf_width; ratio_bounds = (float) pdata->max_height / (float) pdata->max_width; if (ratio_wmf > ratio_bounds) { ddata->height = pdata->max_height; ddata->width = (unsigned int) ((float) ddata->height / ratio_wmf); } else { ddata->width = pdata->max_width; ddata->height = (unsigned int) ((float) ddata->width * ratio_wmf); } } else if (max_flags == WMF2SVG_MAXSIZE) /* bizarre option, really */ { ddata->width = pdata->max_width; ddata->height = pdata->max_height; } else { ddata->width = (unsigned int) ceil ((double) wmf_width ); ddata->height = (unsigned int) ceil ((double) wmf_height); } if (pdata->inline_images) { ddata->flags |= WMF_SVG_INLINE_IMAGES; } else { IC.number = 0; IC.prefix = (char*) malloc (strlen (pdata->wmf_filename) + 1); if (IC.prefix) { strcpy (IC.prefix,pdata->wmf_filename); if (wmf_strstr (pdata->wmf_filename,".wmf")) { IC.prefix[strlen (pdata->wmf_filename)-4] = 0; } ddata->image.context = (void*) (&IC); ddata->image.name = image_name; } } if (status == 0) { err = wmf_play (API,0,&(pdata->options.bbox)); status = explicit_wmf_error ("wmf_play",err); } wmf_api_destroy (API); return (status); }