mirror of
https://github.com/hyprwm/hyprgraphics.git
synced 2026-05-04 21:07:59 +02:00
image/svg: implement embedded
Some checks are pending
Some checks are pending
This commit is contained in:
parent
8a860f2949
commit
28e17fbf49
3 changed files with 38 additions and 1 deletions
|
|
@ -59,5 +59,38 @@ std::expected<cairo_surface_t*, std::string> SVG::createSurfaceFromSVG(const std
|
|||
cairo_destroy(PCAIRO);
|
||||
g_object_unref(handle);
|
||||
|
||||
return cairoSurface;
|
||||
}
|
||||
|
||||
std::expected<cairo_surface_t*, std::string> SVG::createSurfaceFromData(const std::span<const uint8_t>& data, const Vector2D& size) {
|
||||
if (size.x < 1 || size.y < 1)
|
||||
return std::unexpected("loading svg: invalid size");
|
||||
|
||||
auto cairoSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, size.x, size.y);
|
||||
|
||||
const auto PCAIRO = cairo_create(cairoSurface);
|
||||
|
||||
cairo_save(PCAIRO);
|
||||
cairo_set_operator(PCAIRO, CAIRO_OPERATOR_CLEAR);
|
||||
cairo_paint(PCAIRO);
|
||||
cairo_restore(PCAIRO);
|
||||
|
||||
GError* error = nullptr;
|
||||
|
||||
RsvgHandle* handle = rsvg_handle_new_from_data((unsigned char*)data.data(), data.size(), &error);
|
||||
|
||||
if (!handle)
|
||||
return std::unexpected("loading svg: rsvg failed to read data");
|
||||
|
||||
RsvgRectangle rect = {0, 0, (double)size.x, (double)size.y};
|
||||
|
||||
if (!rsvg_handle_render_document(handle, PCAIRO, &rect, &error))
|
||||
return std::unexpected("loading svg: rsvg failed to render");
|
||||
|
||||
// done
|
||||
cairo_surface_flush(cairoSurface);
|
||||
cairo_destroy(PCAIRO);
|
||||
g_object_unref(handle);
|
||||
|
||||
return cairoSurface;
|
||||
}
|
||||
|
|
@ -8,4 +8,5 @@
|
|||
|
||||
namespace SVG {
|
||||
std::expected<cairo_surface_t*, std::string> createSurfaceFromSVG(const std::string&, const Hyprutils::Math::Vector2D& size);
|
||||
std::expected<cairo_surface_t*, std::string> createSurfaceFromData(const std::span<const uint8_t>&, const Hyprutils::Math::Vector2D& size);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -88,12 +88,15 @@ int main(int argc, char** argv, char** envp) {
|
|||
}
|
||||
|
||||
auto pngBuffer = getImageBuffer("./resource/images/hyprland.png");
|
||||
EXPECT(tryLoadImageFromBuffer(pngBuffer, Hyprgraphics::IMAGE_FORMAT_PNG), true);
|
||||
EXPECT(tryLoadImageFromBuffer(pngBuffer, Hyprgraphics::IMAGE_FORMAT_AUTO), true);
|
||||
|
||||
#ifdef HEIF_FOUND
|
||||
auto avifBuffer = getImageBuffer("./resource/images/hyprland.avif");
|
||||
EXPECT(tryLoadImageFromBuffer(avifBuffer, Hyprgraphics::IMAGE_FORMAT_AVIF), true);
|
||||
#endif
|
||||
|
||||
auto svgBuffer = getImageBuffer("./resource/images/hyprland.svg");
|
||||
EXPECT(tryLoadImageFromBuffer(pngBuffer, Hyprgraphics::IMAGE_FORMAT_AUTO), true);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue