image/svg: implement embedded
Some checks are pending
Build & Test (Arch) / Arch: Build and Test (gcc) (push) Waiting to run
Build & Test (Arch) / Arch: Build and Test (clang) (push) Waiting to run
Build & Test / nix (hyprgraphics) (push) Waiting to run
Build & Test / nix (hyprgraphics-with-tests) (push) Waiting to run

This commit is contained in:
Vaxry 2025-12-28 15:25:39 +01:00
parent 8a860f2949
commit 28e17fbf49
Signed by: vaxry
GPG key ID: 665806380871D640
3 changed files with 38 additions and 1 deletions

View file

@ -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;
}

View file

@ -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);
};

View file

@ -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;
}