将 SVG 加载为 Cairo 图像表面的最佳方法是什么?
What is the best way to load SVG as Cairo image surface?
我有一个基于 libCairo 的简单 C++ 程序,用于绘制一些图像(例如,将一个图像放到另一个图像上,写一些文本,等等)。我需要加载一些 SVG 文件(以避免缩放伪像),然后将它们绘制到从 PNG 加载的表面上。
我有一个包含 cairo_t
上下文的包装器 class,并允许从该上下文获取表面:
cairo_surface_t *CairoImage::getSurface() {
return cairo_get_target(context);
}
我目前这样加载 SVG 文件:
CairoImage::CairoImage(const char *path, double width, double height) {
auto surface = cairo_svg_surface_create(path, width, height);
context = cairo_create(surface);
}
这就是我将图像绘制到另一个图像上的方式:
cairo_set_source_surface(context, image.getSurface(), 0, 0);
cairo_rectangle(context, x, y, image.getWidth(), image.getHeight());
cairo_clip(context);
cairo_paint(context);
cairo_reset_clip(context);
但它不起作用(它只是不绘制任何东西)。如何解决?
Cairo 可以写入 SVG 文件,但不能读取 它们。
您需要像 librsvg 这样的工具来加载 SVG 文件。我只是试图让 Google 给我一个简短的 librsvg 示例,但没有找到。
我有一个基于 libCairo 的简单 C++ 程序,用于绘制一些图像(例如,将一个图像放到另一个图像上,写一些文本,等等)。我需要加载一些 SVG 文件(以避免缩放伪像),然后将它们绘制到从 PNG 加载的表面上。
我有一个包含 cairo_t
上下文的包装器 class,并允许从该上下文获取表面:
cairo_surface_t *CairoImage::getSurface() {
return cairo_get_target(context);
}
我目前这样加载 SVG 文件:
CairoImage::CairoImage(const char *path, double width, double height) {
auto surface = cairo_svg_surface_create(path, width, height);
context = cairo_create(surface);
}
这就是我将图像绘制到另一个图像上的方式:
cairo_set_source_surface(context, image.getSurface(), 0, 0);
cairo_rectangle(context, x, y, image.getWidth(), image.getHeight());
cairo_clip(context);
cairo_paint(context);
cairo_reset_clip(context);
但它不起作用(它只是不绘制任何东西)。如何解决?
Cairo 可以写入 SVG 文件,但不能读取 它们。
您需要像 librsvg 这样的工具来加载 SVG 文件。我只是试图让 Google 给我一个简短的 librsvg 示例,但没有找到。