Я хотел, чтобы рендеринг изображений librsvg работал на моем Mac, чтобы ускорить рендеринг SVG. У великого ответа Иэна Макиннона есть все ингредиенты, но внести изменения в библиотеку сложно. Эти шаги заставили librsvg правильно отображать связанные изображения с относительными путями. Надеюсь, это сэкономит кому-то время.
Сначала я установил librsvg, используя:
brew install --build-from-source librsvg
На момент написания, это устанавливает версию 2.40.13 и необходимые библиотеки для ее сборки. Затем я скачал и распаковал исходный архив в свой домашний каталог:
wget https://download.gnome.org/sources/librsvg/2.40/librsvg-2.40.13.tar.xz
tar jxvf librsvg-2.40.13.tar.xz
cd librsvg-2.40.13
Я отредактировал функцию _rsvg_handle_allow_load
в rsvg-base.c
в этом каталоге, чтобы обойти ограничения загрузки пути, добавив этот код в строке 2275:
2275
2276 goto allow; // Just try and load it!
2277
Мне также нужно было отредактировать функцию rsvg_cairo_surface_new_from_href
в rsvg-image.c
и остановить ее загрузку, используя типы MIME - просто замените функцию следующим образом:
55 if (mime_type) {
56 // loader = gdk_pixbuf_loader_new_with_mime_type (mime_type, error); // This doesn't work on my mac
57 loader = gdk_pixbuf_loader_new (); // This works
58 } else {
59 loader = gdk_pixbuf_loader_new ();
60 }
Мне нужно было использовать эти слегка измененные команды для компиляции и установки измененной библиотеки:
make clean
make install gdk_pixbuf_binarydir=/usr/local/Cellar/librsvg/2.40.13/lib/gdk-pixbuf-2.0/2.10.0/loaders gdk_pixbuf_moduledir=/usr/local/Cellar/librsvg/2.40.13/lib/gdk-pixbuf-2.0/2.10.0/loaders
В зависимости от вашей системы вам может потребоваться добавить sudo к вышеприведенным командам.
Как только это было сделано, я мог рендерить относительные ссылки SVG с помощью инструмента командной строки rsvg-convert
, который устанавливается вместе с librsvg:
rsvg-convert test.svg -o test.png
Мне также удалось использовать ImageMagick для преобразования SVG с относительными ссылками на изображения в файлы PNG, если я установил его после установки librsvg следующим образом:
convert test.svg test.png
Это позволит вам протестировать функцию и производительность rsvg - я обнаружил, что это было в 2-3 раза быстрее, чем Inkscape для моего приложения. Я рекомендую изменить код более разумно, если вы используете его в производственной среде.