Пример #1
0
int renderSVGSymbolCairo(imageObj *img, double x, double y, symbolObj *symbol,
                         symbolStyleObj *style) {
#ifdef USE_SVG_CAIRO
    cairo_renderer *r = CAIRO_RENDERER(img);
    //double ox=symbol->sizex*0.5,oy=symbol->sizey*0.5;

    unsigned int svg_width, svg_height;
    svg_cairo_status_t status;
    svg_cairo_t *svgc;
    double scale;

    //use cache for svg surface
    if(!symbol->renderer_cache) {
        status = svg_cairo_create(&svgc);
        status = svg_cairo_parse_buffer(svgc, symbol->svg_text, strlen(symbol->svg_text));
        if (status) {
            msSetError(MS_RENDERERERR, "problem creating cairo svg", "renderSVGSymbolCairo()");
            return MS_FAILURE;
        }
        symbol->renderer_cache = svgc;
    }
    assert(symbol->renderer_cache);
    svgc=(svg_cairo_t *)symbol->renderer_cache;

    svg_cairo_get_size (svgc, &svg_width, &svg_height);

    //scale such that the SVG is rendered at the desired size in pixels
    scale = style->scale;
    /*
    if (style->scale != 1) {
        scale = MS_MIN(style->scale / (double) svg_width,
                   style->scale / (double) svg_height);
    } else {
        scale = style->scale;
    }
    */

    cairo_save(r->cr);
    cairo_translate(r->cr,x,y);
    cairo_scale(r->cr,scale,scale);

    if (style->rotation != 0) {
        cairo_rotate(r->cr, -style->rotation);
        cairo_translate (r->cr, -(int)svg_width/2, -(int)svg_height/2);
    }
    else
        cairo_translate (r->cr, -(int)svg_width/2, -(int)svg_height/2);

    status = svg_cairo_render(svgc, r->cr);
    cairo_restore(r->cr);
    return MS_SUCCESS;

#else
    msSetError(MS_MISCERR, "SVG Symbols requested but is not built with libsvgcairo",
               "renderSVGSymbolCairo()");
    return MS_FAILURE;
#endif
}
Пример #2
0
int msPreloadSVGSymbol(symbolObj *symbol)
{
#ifdef USE_SVG_CAIRO
    svg_cairo_t *svgc;
    int status;
    unsigned int svg_width, svg_height;

    if(symbol->svg_cairo_surface)
        return MS_SUCCESS;

    if(!symbol->svg_text)
        return MS_FAILURE;

    status = svg_cairo_create(&svgc);
    if (status) {
        msSetError(MS_RENDERERERR, "problem creating cairo svg", "msPreloadSVGSymbol()");
        return MS_FAILURE;
    }
    status = svg_cairo_parse_buffer(svgc, symbol->svg_text, strlen(symbol->svg_text));
    if (status) {
        msSetError(MS_RENDERERERR, "problem parsing svg symbol", "msPreloadSVGSymbol()");
        return MS_FAILURE;
    }
    svg_cairo_get_size (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;

    symbol->svg_cairo_surface = (void *)svgc;

    return MS_SUCCESS;

#else
    msSetError(MS_MISCERR, "SVG Symbols requested but is not built with libsvgcairo",
               "msPreloadSVGSymbol()");
    return MS_FAILURE;
#endif
}
Пример #3
0
int msPreloadSVGSymbol(symbolObj *symbol)
{
#ifdef USE_SVG_CAIRO
    int status;
    unsigned int svg_width, svg_height;
    struct svg_symbol_cache *cache;

    if(!symbol->renderer_cache) {
        cache = msSmallCalloc(1,sizeof(struct svg_symbol_cache));
    } else {
        cache = symbol->renderer_cache;
    }
    if(cache->svgc)
        return MS_SUCCESS;

    if (!symbol->svg_text) {
        FILE *stream;
        long int file_len;

        if ((stream = fopen(symbol->full_pixmap_path, "rb")) == NULL) {
            msSetError(MS_IOERR, "Could not open svg file %s", "msPreloadSVGSymbol()",symbol->full_pixmap_path);
            return (MS_FAILURE);
        }
        fseek(stream, 0, SEEK_END);
        file_len = ftell(stream);
        rewind(stream);
        symbol->svg_text = (char*) msSmallMalloc(sizeof (char) * file_len);
        if (1 != fread(symbol->svg_text, file_len, 1, stream)) {
            msSetError(MS_IOERR, "failed to read %d bytes from svg file %s", "loadSymbol()", file_len, symbol->full_pixmap_path);
            free(symbol->svg_text);
            return MS_FAILURE;
        }
        symbol->svg_text[file_len - 1] = '\0';
        fclose(stream);
    }

    status = svg_cairo_create(&cache->svgc);
    if (status) {
        msSetError(MS_RENDERERERR, "problem creating cairo svg", "msPreloadSVGSymbol()");
        return MS_FAILURE;
    }
    status = svg_cairo_parse_buffer(cache->svgc, symbol->svg_text, strlen(symbol->svg_text));
    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;
    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
}