c++ - para - ¿Cómo escribo una imagen en un archivo SVG usando cairo?
svg image html5 (3)
Tengo un código que se ve así:
cairo_surface_t * surface = cairo_svg_surface_create("0.svg", 512, 512);
cairo_t * context = cairo_create(surface);
int * data = new int[512*512];
// fill the data...
cairo_surface_t * image_surface =
cairo_image_surface_for_data(data, 512, 512, 512*4);
cairo_set_source_surface(context, image_surface, 0, 0);
cairo_paint(context);
// do some other drawing ...
cairo_surface_flush(surface);
cairo_surface_finish(surface);
cairo_surface_destroy(surface);
cairo_destroy(context);
Sin embargo, el svg siempre aparece dañado. La imagen no está escrita correctamente, y todos los comandos de dibujo siguientes no funcionan. Cambiar el tipo de superficie a PS, es decir:
cairo_surface_t * surface = cairo_ps_surface_create("0.ps", 512, 512);
produce un documento PS perfectamente correcto. Cualquier ayuda para arreglar el SVG sería apreciada.
EDITAR: Olvidé proporcionar información sobre la versión. Cairo 1.10.2 dado por cairo_version_string (). g ++ 4.52 ejecutándose en Ubuntu 11.04
EDITAR (2): Ok, he rastreado esto hasta los problemas de PNG con cairo y descubrí que cairo_surface_write_to_png tampoco se comporta como se esperaba. Tanto esta función como el intento de incrustar una imagen en un SVG provocan "errores de falta de memoria", y todavía no sé por qué.
No puedo encontrar cairo_image_surface_for_data
en la documentación de Cairo. ¿ Quisiste decir cairo_image_surface_create_for_data ? Si es así, debe usar cairo_format_stride_for_width
para calcular el tamaño de la matriz, y los datos de mapas de bits deben estar en el formato que Cairo espera. Dado que ambas salidas están dañadas, esto sugiere fuertemente que el problema está con la entrada .
Parece que se olvidó de especificar la versión de SVG como:
cairo_svg_surface_restrict_to_version (surface, CAIRO_SVG_VERSION_1_2);
Puedes hacer esto inmediatamente después de crear la superficie.
Quizás publicar el SVG simple resultante puede ayudar.