lunasvg is a standalone SVG rendering library in C++

Overview

LunaSVG

lunasvg is a standalone SVG rendering library in C++

svg2png generated PNG

Example

#include <lunasvg/document.h>

using namespace lunasvg;

int main()
{
    auto document = Document::loadFromFile("tiger.svg");
    auto bitmap = document->renderToBitmap();

    // do something useful with the bitmap here.

    return 0;
}

Features

  • Basic Shapes
  • Document Structures
  • Coordinate Systems, Transformations and Units
  • SolidColors
  • Gradients
  • Patterns
  • Masks
  • ClipPaths
  • Markers

TODO

  • Texts
  • Filters
  • Images
  • StyleSheet

Build

git clone https://github.com/sammycage/lunasvg.git
cd lunasvg
mkdir build
cd build
cmake ..
make -j 2

To install lunasvg library.

make install

Demo

While building lunasvg example it generates a simple SVG to PNG converter which can be used to convert SVG file to PNG file.

Run Demo.

svg2png [filename] [resolution] [bgColor]

Support

If you like the work lunasvg is doing please consider a small donation:

Comments
  • Sliding over SVG?

    Sliding over SVG?

    Currently I am using nanosvg on some project and I want to change it with lunasvg because of performance issues. However when I try to render some SVG string I get whole SVG rendered like this (btw I am using translate method to shift the svg.): luna_out

    However I want to process this normally big (7k x 7k) image tile by tile. With nanosvg I could do this with no overhead. Is there any way to achieve this in lunasvg? Currently my code is like this:

    	svgImage = lunasvg::Document::loadFromData(svgStr);
    	svgImage->translate(-x, -y) ;
    	lunasvg::Bitmap bitmap = svgImage->renderToBitmap(width, height);
            
            // opencv section
            auto res = cv::Mat(height, width, CV_8UC4);
    	res.data = bitmap.data();
    	cv::cvtColor(res, res, CV_RGBA2GRAY);
    	res = res > 0;
    
    enhancement 
    opened by erentknn 18
  • Help implementing LayoutImage::render() (with external image rendering support)

    Help implementing LayoutImage::render() (with external image rendering support)

    Hi @sammycage , thank you for this nice library, I'm having fun and for now quite some success integrating it in our EPUB reading application: https://github.com/koreader/koreader/issues/9298#issuecomment-1214427853 We have some good text rendering stack and image drawing stuff, so I'm trying to extend LunaSVG to support <text> and <tspan> and <image> by having it call back into our existing EPUB library. I've been succesful with text and tspan, but I'm a bit stuck with images. I'm requesting your help :)

    I added an imagelement.cpp that builds a LayoutImage object, by just parsing x/y/width/height and href and setting them as attributes of the LayoutImage. I'm currently stuck in LayoutImage::render() - and I have a hard time getting into your RenderState/Canvas/plutovg stuff :/ (understanding in which coordinates they work in, which handle translation & rotation, etc...) It looks to me that I can't use canvas->blend() to have any kind of rotation, and that my only solution is to use ->setTexture() and ->fill() - and that I should use newState.beginGroup/endGroup() if I want any clipping to be ensured - but I can't have it all to work nicely (and when it seems to look good, resizing makes it bad again :/) I hope that for you, there's an easy and obvious solution to my problem, and that you can share your intuition. How would you go from this (that works) to get this horizontal rectangle to be properly drawn with all this <image> and its parents transformations & clips ?:

        auto img = Canvas::create(0,  0, width, height);
        if ( external_context_helper->draw_image_func ) {
            external_context_helper->draw_image_func(external_context_helper, url.c_str(),
                                        img->data(), width, height);
            // this properly fills the img canvas with the requested image content scaled to that canvas
        }
    

    I'm sharing my current mess, if you need more context - but I'm more interested in your from-scratch-approach to solving this problem :)

    void LayoutImage::render(RenderState& state) const
    {
        if(visibility == Visibility::Hidden)
            return;
    
        /* This at least displays something
        BlendInfo info{clipper, masker, opacity, Rect::Invalid};
        RenderState newState(this, state.mode());
        // auto transform = this->transform;
        //transform.translate(x, y);
        newState.transform = transform * state.transform;
        newState.transform.translate(x, y);
        //newState.transform.translate(100, 100);
        //newState.transform.scale(2, 2);
        // newState.beginGroup(state, info);
        int w = static_cast<int>(ceil(width));
        int h = static_cast<int>(ceil(height));
        newState.canvas = Canvas::create(0, 0, width, height);
    
        bool drawn = false;
        if ( external_context_helper->draw_image_func ) {
            drawn = external_context_helper->draw_image_func(external_context_helper, url.c_str(),
                                        newState.canvas->data(), width, height);
        }
        if ( !drawn)
            return;
        Path path;
        path.rect(x, y, width, height, 0, 0);
        // XXX not good with TextureType::Tiled, not much with TextureType::Plain
        state.canvas->setTexture(newState.canvas.get(), TextureType::Tiled, state.transform);
        state.canvas->fill(path, newState.transform, WindRule::NonZero, BlendMode::Src_Over, opacity);
    
        // newState.endGroup(state, info);
        */
        BlendInfo info{clipper, masker, opacity, Rect::Invalid};
        RenderState newState(this, state.mode());
        // auto transform = this->transform;
        //transform.translate(x, y);
        newState.transform = transform * state.transform;
    //    newState.transform.translate(x, y);
        //newState.transform.translate(100, 100);
        //newState.transform.scale(2, 2);
    //    newState.beginGroup(state, info);
        int w = static_cast<int>(ceil(width));
        int h = static_cast<int>(ceil(height));
    
        auto box = newState.transform.map(strokeBoundingBox());
        newState.canvas = Canvas::create(box);
        auto img = Canvas::create(0,  0, width, height);
    
        bool drawn = false;
        if ( external_context_helper->draw_image_func ) {
            drawn = external_context_helper->draw_image_func(external_context_helper, url.c_str(),
                                        img->data(), width, height);
        }
        if ( !drawn)
            return;
        Path path;
        path.rect(x, y, width, height, 0, 0);
        // XXX not good with TextureType::Tiled, not much with TextureType::Plain
        // newState.canvas->setTexture(img.get(), TextureType::Tiled, newState.transform);
        newState.canvas->setTexture(img.get(), TextureType::Tiled, state.transform); // mostly ok, but may be by chance
        newState.canvas->fill(path, newState.transform, WindRule::NonZero, BlendMode::Src, opacity);
        state.canvas->blend(newState.canvas.get(), BlendMode::Src_Over, 1.0);
    
     //   newState.endGroup(state, info);
    }
    

    And this a sample with the various bad stuff I get (mis-rotation, black content in some case, bad positionnning, unwanted tiling/bad sizing :) Firefox | KOReader image

    Any thoughts ?


    Btw, unrelated, but trying SVGs samples from https://commons.wikimedia.org/wiki/User:JoKalliauer/SVG_test_suites/resvg_Issues_details, I got LunaSVG (or at least, my use of it, but I got the crash without my added stuff) to crash with this image: https://upload.wikimedia.org/wikipedia/commons/8/87/Flag-map_of_the_world.svg

    #0  0x00007ffff7ccfce1 in raise () from /lib/x86_64-linux-gnu/libc.so.6
    #1  0x00007ffff7cb9537 in abort () from /lib/x86_64-linux-gnu/libc.so.6
    #2  0x00007ffff7cb940f in ?? () from /lib/x86_64-linux-gnu/libc.so.6
    #3  0x00007ffff7cc8662 in __assert_fail () from /lib/x86_64-linux-gnu/libc.so.6
    #4  0x00007fffe8789dfd in ft_stroke_border_export ([email protected]=0x555556d31ef0, [email protected]=0x5555594f3370)
        at lunasvg/3rdparty/software/sw_ft_stroker.c:666
    #5  0x00007fffe878ae7e in SW_FT_Stroker_ExportBorder ([email protected]=0x555556d31e80, [email protected]=SW_FT_STROKER_BORDER_LEFT, [email protected]=0x5555594f3370)
        at lunasvg/3rdparty/software/sw_ft_stroker.c:1744
    #6  0x00007fffe878ae9a in SW_FT_Stroker_Export (stroker=0x555556d31e80, [email protected]=0x5555594f3370)
        at lunasvg/3rdparty/software/sw_ft_stroker.c:1752
    #7  0x00007fffe8790342 in plutovg_rle_rasterize (rle=<optimized out>, path=<optimized out>, [email protected]=0x555555e4fd70, [email protected]=0x55555898dc20,
        [email protected]=0x555555e4fda8, [email protected]=plutovg_fill_rule_non_zero)
        at lunasvg/3rdparty/plutovg/plutovg-rle.c:257
    #8  0x00007fffe878bb32 in plutovg_stroke_preserve ([email protected]=0x55555898dbf0)
        at lunasvg/3rdparty/plutovg/plutovg.c:472
    #9  0x00007fffe878bb61 in plutovg_stroke (pluto=0x55555898dbf0)
        at lunasvg/3rdparty/plutovg/plutovg.c:431
    #10 0x00007fffe87792bc in lunasvg::Canvas::stroke (this=0x555557982150, path=..., transform=..., width=0.5, cap=lunasvg::LineCap::Butt, join=lunasvg::LineJoin::Miter,
        miterlimit=3.9828999999999999, dash=..., mode=lunasvg::BlendMode::Src_Over, opacity=1)
        at lunasvg/source/canvas.cpp:126
    #11 0x00007fffe8773cb6 in lunasvg::StrokeData::stroke ([email protected]=0x555556731958, state=..., path=...)
        at lunasvg/source/layoutcontext.cpp:344
    #12 0x00007fffe87757b1 in lunasvg::LayoutShape::render (this=0x5555567318b0, state=...)
        at lunasvg/source/layoutcontext.cpp:409
    #13 0x00007fffe877368b in lunasvg::LayoutContainer::renderChildren ([email protected]=0x55555673a3a0, state=...)
        at lunasvg/source/layoutcontext.cpp:88
    #14 0x00007fffe8775405 in lunasvg::LayoutGroup::render (this=0x55555673a3a0, state=...)
        at lunasvg/source/layoutcontext.cpp:179
    #15 0x00007fffe877368b in lunasvg::LayoutContainer::renderChildren ([email protected]=0x55555996d4c0, state=...)
        at lunasvg/source/layoutcontext.cpp:88
    #16 0x00007fffe8775405 in lunasvg::LayoutGroup::render (this=0x55555996d4c0, state=...)
        at lunasvg/source/layoutcontext.cpp:179
    #17 0x00007fffe877368b in lunasvg::LayoutContainer::renderChildren ([email protected]=0x55555670db30, state=...)
        at lunasvg/source/layoutcontext.cpp:88
    #18 0x00007fffe8775405 in lunasvg::LayoutGroup::render (this=0x55555670db30, state=...)
        at lunasvg/source/layoutcontext.cpp:179
    #19 0x00007fffe877368b in lunasvg::LayoutContainer::renderChildren ([email protected]=0x55555670da70, state=...)
        at lunasvg/source/layoutcontext.cpp:88
    #20 0x00007fffe8775405 in lunasvg::LayoutGroup::render (this=0x55555670da70, state=...)
        at lunasvg/source/layoutcontext.cpp:179
    #21 0x00007fffe877368b in lunasvg::LayoutContainer::renderChildren ([email protected]=0x55555994efc0, state=...)
        at lunasvg/source/layoutcontext.cpp:88
    #22 0x00007fffe877529d in lunasvg::LayoutSymbol::render (this=0x55555994efc0, state=...)
        at lunasvg/source/layoutcontext.cpp:159
    #23 0x00007fffe8761648 in lunasvg::Document::render ([email protected]=0x5555599e4390, bitmap=..., matrix=...)
        at lunasvg/source/lunasvg.cpp:378
    #24 0x00007fffe8761871 in lunasvg::Document::renderToBitmap (this=0x5555599e4390, width=562, height=281, [email protected]=0)
        at lunasvg/source/lunasvg.cpp:403
    #25 0x00007fffe8a3d424 in LVSvgImageSource::DecodeFromBuffer ([email protected]=0x55555694e640,
    
    opened by poire-z 16
  • Cannot parse some SVG's tile by tile

    Cannot parse some SVG's tile by tile

    I have two SVG's. One is smaller (12k x 7k) other one is bigger (28k x 32k) I can parse the smaller one tile by tile with no problem. But with other one I get Access Violation error. I triple checked the code and cannot find any problem. Here is a sample code to reproduce it:

    std::vector<std::vector<float>> tileParamList; // coordinates from the json file
    const int width = 1024;
    const int height = 1024;
    auto svgImage = lunasvg::Document::loadFromData(svgStr);
    
    for (int i = 0; i < tileParamList.size(); i++)
    {
    	lunasvg::Bitmap bitmap{ width, height };
    	lunasvg::Matrix matrix{ 1, 0, 0, 1, -tileParamList[i][0], -tileParamList[i][1] };
    	
    	svgImage->render(bitmap, matrix); <----------- HERE
    
    	auto res = cv::Mat(height, width, CV_8UC4);
    	res.data = bitmap.data();
    	cv::cvtColor(res, res, CV_RGBA2GRAY);
    	res = res > 0;
    }
    

    SVG and tileList can be found here: broken.zip And other SVG can be found here (One that works correctly. Note: First few iterations might be blank image.): notbroken.zip

    bug 
    opened by erentknn 15
  • Some gradients don't render correctly

    Some gradients don't render correctly

    Hi!

    Some gradients don't render correctly in LunaSVG, please see these images for an example:

    https://es-de.org/temp/LunaSVG_gradients.png https://es-de.org/temp/NanoSVG_gradients.png

    Here's an example of a problematic file: https://gitlab.com/es-de/emulationstation-de/-/blob/master/themes/slate-DE/n3ds/images/consolegame.svg

    Interestingly it doesn't render correctly in the GitLab SVG renderer either but it does render correctly in both NanoSVG and Inkscape.

    documentation 
    opened by leonstyhre 11
  • Specific image consistently crashes LunaSVG

    Specific image consistently crashes LunaSVG

    Hi!

    Thanks for this incredible library, I'm currently in the process of evaluating whether to switch from NanoSVG to LunaSVG for my application (es-de.org) but I have run into one showstopper bug. The issue is that at least one image makes the library crash consistently (it's rendered correctly by NanoSVG). I'm providing a link to a gzip'ed version of the image. Could you please look into this? Many thanks!

    https://es-de.org/temp/crashes_LunaSVG.svg.gz

    bug question 
    opened by leonstyhre 10
  • SVG image rotation

    SVG image rotation

    How to rotate a final SVG image so that it would be rendered correctly without cropping? It would be nice to have a method to render a rotated and scaled SVG image, like this:

    Bitmap Document::renderToBitmapRotated(double angle, double scale, std::uint32_t backgroundColor) const;

    enhancement 
    opened by viktoras-pal 10
  • How to add this library as external using git submodule?

    How to add this library as external using git submodule?

    I cannot find variables like LUNASVG_INCLUDE_DIRS and LUNASVG_LIBRARIES to use.

    add_subdirectory(${EXTERNAL_DIR}/lunasvg)
    target_include_directories(main PRIVATE ${LUNASVG_INCLUDE_DIRS})
    target_link_libraries(main ${LUNASVG_LIBRARIES})
    
    enhancement question 
    opened by lwyj123 9
  • API for background image

    API for background image

    Using Bitmap(std::uint8_t* data, std::uint32_t width, std::uint32_t height, std::uint32_t stride); one can supply a custom buffer with a background image.

    However, both render and renderToBitmap have a background color. Does this mean that lunasvg will always overwrite the custom background?

    enhancement question 
    opened by zcream 7
  • Text anchor is not working properly

    Text anchor is not working properly

    I'm trying to draw text based off this svg string:

    <svg xmlns="http://www.w3.org/2000/svg" version="1.2" baseProfile="tiny" width="341.33333333333326" height="176" viewBox="-33.33333333333333 1 341.3333333333333 176"></path></g><text x="5" y="160" te
    xt-anchor="end" font-size="40" font-family="Arial" stroke-width="4" stroke="none" fill="black" >A</text><text x="195" y="160" text-anchor="start" font-size="40" font-family="Arial" stroke-width="4" stroke="none" fill="black" >1-327</text></svg>
    

    I tested it online and it works, I'm guessing however some setting inside this svg isn't supported yet? My question is what can I remove or change about this svg while keeping the basic text and text location and have it show up using lunasvg?

    Tested using built 1.4.2 version of the library, or should I be just using master?

    Any help is appreciated, thank you.

    bug question 
    opened by JackGit3 7
  • Edge artifacts (rendering issue)

    Edge artifacts (rendering issue)

    There are some harsh edge artifacts getting rendered by LunaSVG that are not visible with NanoSVG. Maybe the antialiasing around edges is not working as it should or perhaps there is some other problem?

    It's subtle but still clearly visible, see especially the "e" in the following images:

    https://es-de.org/temp/LunaSVG_edge_artifacts.png https://es-de.org/temp/NanoSVG_no_edge_artifacts.png

    Here's a link to the logo: https://gitlab.com/es-de/emulationstation-de/-/blob/master/themes/slate-DE/chailove/images/logo.svg

    documentation enhancement question 
    opened by leonstyhre 6
  • Shape is unexpectedly asymmetric

    Shape is unexpectedly asymmetric

    https://github.com/lichess-org/lila/blob/master/public/piece/cburnett/bK.svg

    <?xml version="1.0" encoding="UTF-8"?>
    <svg xmlns="http://www.w3.org/2000/svg" width="45" height="45">
       <g fill="none" fill-rule="evenodd" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
          <path d="M22.5 11.63V6" stroke-linejoin="miter" />
          <path d="M22.5 25s4.5-7.5 3-10.5c0 0-1-2.5-3-2.5s-3 2.5-3 2.5c-1.5 3 3 10.5 3 10.5" fill="#000" stroke-linecap="butt" stroke-linejoin="miter" />
          <path d="M11.5 37c5.5 3.5 15.5 3.5 21 0v-7s9-4.5 6-10.5c-4-6.5-13.5-3.5-16 4V27v-3.5c-3.5-7.5-13-10.5-16-4-3 6 5 10 5 10V37z" fill="#000" />
          <path d="M20 8h5" stroke-linejoin="miter" />
          <path d="M32 29.5s8.5-4 6.03-9.65C34.15 14 25 18 22.5 24.5l.01 2.1-.01-2.1C20 18 9.906 14 6.997 19.85c-2.497 5.65 4.853 9 4.853 9" stroke="#ececec" />
          <path d="M11.5 30c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0m-21 3.5c5.5-3 15.5-3 21 0" stroke="#ececec" />
       </g>
    </svg>
    

    Expected: image Actual: image

    bug 
    opened by Pospelove 6
  • CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELEASE -Oz crash

    CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELEASE -Oz crash

    platform: Android

    cmake: set(CMAKE_C_FLAGS_RELEASE "-Oz") set(CMAKE_CXX_FLAGS_RELEASE "-Oz")

    hi,when i set CMAKE_C_FLAGS_RELEASE -Oz,lunasvg parse some svg file crash,this is svg file

    <?xml version="1.0" encoding="UTF-8"?> <svg width="280px" height="280px" viewBox="0 0 280 280" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title>v2_detection</title> <defs> <pattern id="pattern-1" width="100%" height="100%" patternUnits="objectBoundingBox"> <use xlink:href="#image-2"></use> </pattern> <image id="image-2" width="170" height="170" xlink:href="data:image/png;base64,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"></image> </defs> <g id="main" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="check" transform="translate(-235.000000, -220.000000)"> <g transform="translate(235.000000, 220.000000)" id="v2_detection"> <g transform="translate(40.000000, 40.000000)"> <circle id="Oval" stroke="#FFFFFF" stroke-width="5" cx="100" cy="100" r="100"></circle> <circle id="specialCircularSymbol" fill="url(#pattern-1)" cx="100" cy="100" r="85"></circle> <circle id="Oval" stroke="#FFFFFF" stroke-width="1.85714286" opacity="0.300000012" cx="100" cy="100" r="65"></circle> <circle id="Oval" stroke="#FFFFFF" stroke-width="2" opacity="0.600000024" cx="100" cy="100" r="40"></circle> <circle id="Oval" fill="#FFFFFF" cx="100" cy="100" r="9"></circle> <line x1="100.111111" y1="100" x2="100.111111" y2="0" id="Line-2" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round"></line> </g> </g> </g> </g> </svg>

    opened by codingBobo 0
  • add <image> support

    add support

    such as this, the image block is lost

    <?xml version="1.0" encoding="UTF-8"?> <svg width="280px" height="280px" viewBox="0 0 280 280" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title>[email protected]</title> <defs> <pattern id="pattern-1" width="100%" height="100%" patternUnits="objectBoundingBox"> <use xlink:href="#image-2"></use> </pattern> <image id="image-2" width="170" height="170" xlink:href="data:image/png;base64,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"></image> </defs> <g id="main" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="check" transform="translate(-235.000000, -220.000000)"> <g transform="translate(235.000000, 220.000000)" id="v2_detection"> <g transform="translate(40.000000, 40.000000)"> <circle id="Oval" stroke="#FFFFFF" stroke-width="5" cx="100" cy="100" r="100"></circle> <circle id="specialCircularSymbol" fill="url(#pattern-1)" cx="100" cy="100" r="85"></circle> <circle id="Oval" stroke="#FFFFFF" stroke-width="1.85714286" opacity="0.300000012" cx="100" cy="100" r="65"></circle> <circle id="Oval" stroke="#FFFFFF" stroke-width="2" opacity="0.600000024" cx="100" cy="100" r="40"></circle> <circle id="Oval" fill="#FFFFFF" cx="100" cy="100" r="9"></circle> <line x1="100.111111" y1="100" x2="100.111111" y2="0" id="Line-2" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round"></line> </g> </g> </g> </g> </svg>

    enhancement 
    opened by codingBobo 0
  • WIP: Use a git submodule for plutovg

    WIP: Use a git submodule for plutovg

    Partially addresses https://github.com/sammycage/lunasvg/issues/110

    Building the examples fails. Error messages:

    /usr/bin/ld: ../3rdparty/plutovg/example/libplutovg.a(plutovg.c.o): in function `stbi_write_bmp':
    plutovg.c:(.text+0x945): multiple definition of `stbi_write_bmp'; CMakeFiles/svg2png.dir/svg2png.cpp.o:svg2png.cpp:(.text+0x60f): first defined here
    /usr/bin/ld: ../3rdparty/plutovg/example/libplutovg.a(plutovg.c.o): in function `stbi_write_tga':
    plutovg.c:(.text+0xdd2): multiple definition of `stbi_write_tga'; CMakeFiles/svg2png.dir/svg2png.cpp.o:svg2png.cpp:(.text+0x6bc): first defined here
    /usr/bin/ld: ../3rdparty/plutovg/example/libplutovg.a(plutovg.c.o): in function `stbi_write_png':
    plutovg.c:(.text+0x3446): multiple definition of `stbi_write_png'; CMakeFiles/svg2png.dir/svg2png.cpp.o:svg2png.cpp:(.text+0x23e8): first defined here
    collect2: error: ld returned 1 exit status
    

    Dynamic linking also fails:

    [100%] Linking CXX shared library liblunasvg.so
    /usr/bin/ld: 3rdparty/plutovg/example/libplutovg.a(plutovg.c.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /usr/bin/ld: 3rdparty/plutovg/example/libplutovg.a(plutovg-blend.c.o): relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /usr/bin/ld: 3rdparty/plutovg/example/libplutovg.a(plutovg-rle.c.o): relocation R_X86_64_32S against `.text' can not be used when making a shared object; recompile with -fPIC
    /usr/bin/ld: 3rdparty/plutovg/example/libplutovg.a(plutovg-font.c.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /usr/bin/ld: 3rdparty/plutovg/example/libplutovg.a(sw_ft_raster.c.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /usr/bin/ld: 3rdparty/plutovg/example/libplutovg.a(sw_ft_stroker.c.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /usr/bin/ld: 3rdparty/plutovg/example/libplutovg.a(sw_ft_math.c.o): relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
    /usr/bin/ld: 3rdparty/plutovg/example/libplutovg.a(plutovg.c.o): warning: relocation against `stbi__flip_vertically_on_write' in read-only section `.text'
    collect2: error: ld returned 1 exit status
    

    Maybe libplutovg can also be compiled as shared library by overriding configuration, as described here

    Suggestions for fixing above welcome, but will keep working on them.

    opened by bkmgit 2
  • accessing the internal objects

    accessing the internal objects

    Hi @sammycage

    This point probably requires a deep discussion, below I try to explain my needs. It would be useful to identify an object inside SVG code in order to change some properties after the SVG file has been loaded in memory.

    Perhaps the attribute ID ( https://www.w3.org/TR/SVG2/struct.html#IDAttribute ) is the right one to identify objects.

    Mainly the purpose is for being able to change colours, lines width, visibility, etc … It would be very useful to get the position and size occupied by every addressable SVG objects

    LunaSVG library should keep a list of SVG objects and expose it in some way The user should inform the library about the object ID and the attribute to change with the new value.

    Regads Rossano

    documentation enhancement question 
    opened by hobbitdev 5
  • Add soversion

    Add soversion

    Also, a soversion must be added to a shared library in order to be packaged. This would do a soversion of 2, because the major version of the project release is 2.

    opened by gombosg 1
Releases(v2.3.5)
Owner
Nwutobo Samuel Ugochukwu
Nwutobo Samuel Ugochukwu
NanoSVG is a simple stupid single-header-file SVG parse

This project is not actively maintained. Nano SVG Parser NanoSVG is a simple stupid single-header-file SVG parse.

Mikko Mononen 1.4k Nov 17, 2022
a Vulkan real-time rendering engine (Windows and Linux).

Luz Engine A Vulkan engine that I'm developing to study and implement modern rendering techniques used by AAA games. Videos on Youtube Features How to

Hadryan Salles 49 Oct 17, 2022
This library provides a cross-platform image loading library in C11 for projects based on our foundation library

Image Library - Public Domain This library provides a cross-platform image loading library in C11 for projects based on our foundation library.

Mattias Jansson 1 Jan 29, 2022
PillowResize library is a C++ porting of the resize method from the Pillow python library.

Pillow Resize Table of Contents Description Compilation Installation Usage Description PillowResize library is a C++ porting of the resize method from

Zuru Tech 47 Nov 17, 2022
GD Graphics Library

GD Graphics (Draw) Library GD is an open source code library for the dynamic creation of images by programmers. GD is written in C, and "wrappers" are

GD Graphics Library 769 Nov 23, 2022
An open source library for face detection in images. The face detection speed can reach 1000FPS.

libfacedetection This is an open source library for CNN-based face detection in images. The CNN model has been converted to static variables in C sour

Shiqi Yu 11.3k Nov 18, 2022
A fast image processing library with low memory needs.

libvips : an image processing library Introduction libvips is a demand-driven, horizontally threaded image processing library. Compared to similar lib

libvips 26 Nov 10, 2022
C++ image processing and machine learning library with using of SIMD: SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX-512, VMX(Altivec) and VSX(Power7), NEON for ARM.

Introduction The Simd Library is a free open source image processing and machine learning library, designed for C and C++ programmers. It provides man

Ihar Yermalayeu 1.7k Nov 23, 2022
Tiny ISO-compliant C++ EXIF and XMP parsing library for JPEG.

TinyEXIF: Tiny ISO-compliant C++ EXIF and XMP parsing library for JPEG Introduction TinyEXIF is a tiny, lightweight C++ library for parsing the metada

cDc 83 Nov 17, 2022
Video++, a C++14 high performance video and image processing library.

Video++ Video++ is a video and image processing library taking advantage of the C++14 standard to ease the writing of fast video and image processing

Matthieu Garrigues 689 Oct 14, 2022
a generic C++ library for image analysis

VIGRA Computer Vision Library Copyright 1998-2013 by Ullrich Koethe This file is part of the VIGRA computer vision library. You may use,

Ullrich Koethe 376 Nov 14, 2022
A C++ library for Background Matting

libovmatting A C++ library for Background Matting using openvino and deep learning models. Now support models such as BackgroundMattingV2, MODNet. App

null 45 Nov 22, 2022
A file dialog library for Dear ImGui

ImFileDialog A simple file dialog library for Dear ImGui. This library supports favorites, actual Windows icons, image previews, zooming in, etc... DI

dfranx 389 Nov 21, 2022
Intel® Open Image Denoise library

Intel Open Image Denoise is an open source library of high-performance, high-quality denoising filters for images rendered with ray tracing

Intel® Open Image Denoise 1.3k Nov 12, 2022
Arduino PNG image decoder library

An 'embedded-friendly' (aka Arduino) PNG image decoding library

Larry Bank 99 Nov 26, 2022
ZT is a zig-contained library that automatically compiles+links ImGui, OpenGL, and GLFW into typed packages.

ZT is a zig-contained library that automatically compiles+links ImGui, OpenGL, and GLFW into typed packages. By zig contained I mean that ZT is intend

null 88 Nov 7, 2022
libvot - A C++11 multi-thread library for image retrieval

libvot is a fast implementation of vocabulary tree, which is an algorithm widely used in image retrieval and computer vision. It usually comprises three components to build a image retrieval system using vocabulary tree: build a k-means tree using sift descriptors from images, register images into the database, query images against the database. I

Tianwei Shen 171 Nov 15, 2022
ppl.cv is a high-performance image processing library of openPPL supporting x86 and cuda platforms.

ppl.cv is a high-performance image processing library of openPPL supporting x86 and cuda platforms.

null 364 Nov 23, 2022