int msPreloadSVGSymbol(symbolObj *symbol) { #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) struct svg_symbol_cache *cache; if(!symbol->renderer_cache) { cache = msSmallCalloc(1,sizeof(struct svg_symbol_cache)); symbol->renderer_free_func = &freeSVGCache; } else { cache = symbol->renderer_cache; } if(cache->svgc) return MS_SUCCESS; #ifdef USE_SVG_CAIRO { unsigned int svg_width, svg_height; int status; status = svg_cairo_create(&cache->svgc); if (status) { msSetError(MS_RENDERERERR, "problem creating cairo svg", "msPreloadSVGSymbol()"); return MS_FAILURE; } status = svg_cairo_parse(cache->svgc, symbol->full_pixmap_path); if (status) { msSetError(MS_RENDERERERR, "problem parsing svg symbol", "msPreloadSVGSymbol()"); return MS_FAILURE; } svg_cairo_get_size (cache->svgc, &svg_width, &svg_height); if (svg_width == 0 || svg_height == 0) { msSetError(MS_RENDERERERR, "problem parsing svg symbol", "msPreloadSVGSymbol()"); return MS_FAILURE; } symbol->sizex = svg_width; symbol->sizey = svg_height; } #else { RsvgDimensionData dim; cache->svgc = rsvg_handle_new_from_file(symbol->full_pixmap_path,NULL); if(!cache->svgc) { msSetError(MS_RENDERERERR,"failed to load svg file %s", "msPreloadSVGSymbol()", symbol->full_pixmap_path); } rsvg_handle_get_dimensions_sub (cache->svgc, &dim, NULL); symbol->sizex = dim.width; symbol->sizey = dim.height; } #endif symbol->renderer_cache = cache; return MS_SUCCESS; #else msSetError(MS_MISCERR, "SVG Symbols requested but is not built with libsvgcairo", "msPreloadSVGSymbol()"); return MS_FAILURE; #endif }
JNIEXPORT void JNICALL Java_org_gnome_rsvg_RsvgHandle_rsvg_1handle_1get_1dimensions_1sub ( JNIEnv* env, jclass cls, jlong _self, jlong _data, jstring _id ) { RsvgHandle* self; RsvgDimensionData* data; const char* id; // convert parameter self self = (RsvgHandle*) _self; // convert parameter data data = (RsvgDimensionData*) _data; // convert parameter id if (_id == NULL) { id = NULL; } else { id = (const char*) bindings_java_getString(env, _id); if (id == NULL) { return; // Java Exception already thrown } } // call function rsvg_handle_get_dimensions_sub(self, data, id); // cleanup parameter self // cleanup parameter data // cleanup parameter id if (id != NULL) { bindings_java_releaseString(id); } }
int main (int argc, char **argv) { GOptionContext *context; char const *fragment; char const **filenames; char const *file; RsvgHandle *handle; RsvgDimensionData dimensions; RsvgPositionData position; GError *error; int exit_code; int i; GOptionEntry options[] = { { "fragment", 'f', 0, G_OPTION_ARG_STRING, &fragment, "The SVG fragment to address.", "<string>" }, { G_OPTION_REMAINING, 0, G_OPTION_FLAG_FILENAME, G_OPTION_ARG_FILENAME_ARRAY, &filenames, NULL, "[FILE...]" }, { NULL } }; rsvg_init (); context = NULL; fragment = NULL; filenames = NULL; handle = NULL; error = NULL; context = g_option_context_new ("- SVG measuring tool."); g_option_context_add_main_entries (context, options, NULL); /* No args? */ if (argc < 2) { show_help (context); exit_code = EXIT_SUCCESS; goto bail; } error = NULL; g_option_context_parse (context, &argc, &argv, &error); if (error) { show_help (context); g_warning ("%s", error->message); exit_code = EXIT_FAILURE; goto bail; } /* Invalid / missing args? */ if (filenames == NULL) { show_help (context); exit_code = EXIT_FAILURE; goto bail; } g_option_context_free (context), context = NULL; for (i = 0; NULL != (file = filenames[i]); i++) { error = NULL; handle = rsvg_handle_new_from_file (file, &error); if (error) { g_warning ("%s", error->message); exit_code = EXIT_FAILURE; goto bail; } if (fragment && handle) { gboolean have_fragment = FALSE; have_fragment |= rsvg_handle_get_dimensions_sub (handle, &dimensions, fragment); have_fragment |= rsvg_handle_get_position_sub (handle, &position, fragment); if (!have_fragment) { g_warning ("%s: fragment `'%s' not found.", file, fragment); exit_code = EXIT_FAILURE; goto bail; } printf ("%s, fragment `%s': x=%d, y=%d, %dx%d, em=%f, ex=%f\n", file, fragment, position.x, position.y, dimensions.width, dimensions.height, dimensions.em, dimensions.ex); } else if (handle) { rsvg_handle_get_dimensions (handle, &dimensions); printf ("%s: %dx%d, em=%f, ex=%f\n", file, dimensions.width, dimensions.height, dimensions.em, dimensions.ex); } else { g_warning ("Could not open file `%s'", file); exit_code = EXIT_FAILURE; goto bail; } g_object_unref (handle), handle = NULL; } exit_code = EXIT_SUCCESS; bail: if (handle) g_object_unref (handle), handle = NULL; if (context) g_option_context_free (context), context = NULL; if (error) g_error_free (error), error = NULL; rsvg_term (); return exit_code; }