LINUX.ORG.RU

svg?


0

0

OH hai

вощем есть такой ?(вопрос) - какие есть либы если таковые есть чтобы подгрузить SVG картинки и растеризовать в нужном размере? :) чтобы потом заюзать в SDL скажем полученый битмап. еще неплохо их и после ресайзить там если надо будет и т.д... только желательно бы простое в использовании что-то с подробной документацией и понятными примерами :)) смотрел librsvg и нифига не понял как это использовать :( в гугле чота мало о подобном..

anonymous

Ответ на: комментарий от anonymous

впрочем libsvg эту они в архив запихали.. документации и примеров не видно :)

anonymous
()

// на C++, преобразует SVG в растр BGRA32
//
// FILE *svg_file - дескриптор открытого SVG файла

#include <cairo/cairo.h>
#include <svg-cairo.h>

#include <cstdio>
#include <cstdlib>

svg_cairo_status_t render_to_mem(FILE *svg_file, unsigned char **buf, int *w, int *h, double scale)
{
    unsigned int svg_width, svg_height;

    svg_cairo_status_t	status;
    cairo_t 		*cr;
    svg_cairo_t		*svgc;
    cairo_surface_t 	*surface;
    double 		dx = 0, dy = 0;
    unsigned int	width, height;

    status = svg_cairo_create(&svgc);

    if(status)
    {
	fprintf(stderr, "Failed to create svg_cairo_t. Exiting.\n");
	return SVG_CAIRO_STATUS_NO_MEMORY;
    }

    status = svg_cairo_parse_file(svgc, svg_file);

    if(status)
	return status;

    svg_cairo_get_size(svgc, &svg_width, &svg_height);

    width = (unsigned int)(scale * svg_width + 0.5);
    height = (unsigned int)(scale * svg_height + 0.5);

    if(!width) width = 1;
    if(!height) height = 1;

    *w = int(width);
    *h = int(height);

    *buf = (unsigned char *)malloc(width * height * 4);

    if(!*buf)
	return SVG_CAIRO_STATUS_NO_MEMORY;

    surface = cairo_image_surface_create_for_data(*buf, CAIRO_FORMAT_ARGB32, width, height, width * 4);

    cr = cairo_create(surface);
    
    cairo_save(cr);
    cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
    cairo_paint(cr);
    cairo_restore(cr);

    cairo_translate(cr, dx, dy);
    cairo_scale(cr, scale, scale);

    /* XXX: This probably doesn't need to be here (eventually) */
    cairo_set_source_rgb(cr, 1, 1, 1);

    status = svg_cairo_render(svgc, cr);

    cairo_surface_destroy(surface);
    cairo_destroy(cr);

    if(status)
	return status;

    svg_cairo_destroy(svgc);

    return status;
}

// Проблема в том, что для этого надо libsvg, cairo, libsvg_cairo, libpixman

alex_custov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.