LINUX.ORG.RU

[SVG] Велосипед

 , , ,


0

2

Нудная предыстория: понадобилась мне библиотека для отрисовки SVG для cairo, на что сразу нагуглилась librsvg, но она тянула «всего-лишь» libxml2, glib и т.п. за собой, что означало не только таскание массы «груза» со собой, но и трах со сборкой всего этого на разных платформах, нагугленные далее QSvg и wxSVG также оптимизма не внушали. В результате за вечер была написана большая часть кода для отрисовки этого самого SVG, который:

а) вместился в 5 относительно небольших файлов( самый большой - «кастрированный» rapid_xml.hpp );
б) не требует ничего абсолютно, кроме стандартного STL и cairo( что логично );
в) на удивление работает быстрее хрома даже в дебажном «виде» ( видимо из-за быстрого rapid_xml ), хотя может у меня неправильный хром - FF большие файлы отрисовывает очень быстро;
г) умеет показывать большие файлы, которые отказывается понимать гномовский eog, который вообще плохо работает со сложными изображениями.
д) более-менее( не полностью ) понимает css.

Собс-но на скриншоте:

- AWN;
- XFWM;
- NetBeans;
- результат работы велосипеда.

П.С. сам код выложу через несколько дней как public domain, после приведения его в порядок и дописывания недостающего.

>>> Просмотр (1680x1050, 291 Kb)



Проверено: JB ()

Зачетно.

Так у вас для отрисовки каждого примитива используется отдельная собственная функция? Может, заглянули бы в спецификации SVG2.0 и допилили бы на openGL библиотечку для отображения? А то, чувствую, эти спецификации так на бумаге и останутся... :(

Eddy_Em ☆☆☆☆☆ ()

Не знаю, есть или нет, но ждём эффекты (ссылки, размытие, градиенты и т.д.), анимации и текст.

alltiptop ★★★★★ ()
Ответ на: комментарий от Eddy_Em

> для отрисовки каждого примитива используется отдельная собственная функция?

да - спецификация SVG достаточно большая, так что конечно пришлось разбить все на части

и допилили бы на openGL библиотечку для отображения?


теоретически cairo умеет рисовать с помощью OpenGL, в данный момент что-то там активно пилится, так что наверное и пилить ничего не надо - лучше подождать релиза cairo с его поддержкой

aho ()
Ответ на: комментарий от alltiptop

> Не знаю, есть или нет, но ждём эффекты (ссылки, размытие, градиенты и т.д.), анимации и текст.

текст и градиенты есть, эффектов и анимаций - нет, но планируются

aho ()
Ответ на: комментарий от Eddy_Em

> Используйте gtkglext, зачем ждать?

мне просто это не надо для моих задач, да и пишу под три платформы сразу - поэтому и не хочу завязываться ни на что специфическое, чтоб потом не разгребать отдельно «костыли» под каждую из них

aho ()

>SVG

sodipodi:


Печально…

Deleted ()

но она тянула «всего-лишь» libxml2, glib и т.п. за собой, что означало не только таскание массы «груза» со собой, но и трах со сборкой всего этого на разных платформах

Прикинь: libxml2, glib и т.п., необходимые для librsvg, есть в любой десктопной unix-like системе. И не надо ничего дополнительно таскать и/или собирать.

В результате за вечер была написана большая часть кода

Тебе на Windows пора.

iZEN ★★★★★ ()
Ответ на: комментарий от iZEN

> Прикинь: libxml2, glib и т.п., необходимые для librsvg, есть в любой десктопной unix-like системе.

прикинь - в mac os нет, хотя откуда нищебродам знать

Тебе на Windows пора.


нет уж - сиди там сам

aho ()

Зачетно

Будет круто, если код попадет по назначению.

Jayrome ★★★★★ ()
Ответ на: комментарий от aho

От libxml зависят следующие пакеты:

% pkg_info -R libxml2-2.7.8_1
Information for libxml2-2.7.8_1:

Required by:
avahi-app-0.6.29
avidemux2-2.5.4_2
cairomm-1.9.6
clutter-gtk-0.10.8_1
consolekit-0.4.3
dbus-1.4.6
dbus-glib-0.88
dconf-0.5.1_3
deadbeef-0.4.4
eclipse-3.6.1_1
eclipse-datatools-1.8.1
eclipse-emf-2.6.1
eclipse-gef-3.6.1
eclipse-sqlexplorer-2.2.4_5
eclipse-webtools-3.2.2
eggdbus-0.6_1
eog-2.32.1_2
eog-plugins-2.30.1_2
evince-2.32.0_3
file-roller-2.32.1,1
firefox-4.0_1,1
firefox-i18n-4.0
galculator-1.3.4_3
gconf2-2.32.0_2
gedit-2.30.4_1
gedit-plugins-2.32.0_1
gftp-2.0.19_4
gnome-applets-2.32.1.1_2
gnome-desktop-2.32.1_1
gnome-doc-utils-0.20.3
gnome-icon-theme-2.31.0_1
gnome-keyring-2.32.1
gnome-mount-0.8_7
gnome-mplayer-1.0.0_1
gnome-nettool-2.32.0,1
gnome-panel-2.32.1
gnome-session-2.32.1
gnome-settings-daemon-2.32.1_1
gnome-system-monitor-2.28.2
gnome-themes-2.32.1
gnome-vfs-2.24.4
gstreamer-0.10.32
gstreamer-ffmpeg-0.10.11_1
gstreamer-plugins-0.10.32,3
gstreamer-plugins-a52dec-0.10.17,3
gstreamer-plugins-bad-0.10.21,3
gstreamer-plugins-cdaudio-0.10.21,3
gstreamer-plugins-cdio-0.10.17,3
gstreamer-plugins-core-0.10_12
gstreamer-plugins-dts-0.10.21,3
gstreamer-plugins-dvd-0.10.17,3
gstreamer-plugins-faad-0.10.21,3
gstreamer-plugins-flac-0.10.27,3
gstreamer-plugins-gconf-0.10.27,3
gstreamer-plugins-gio-0.10.32,3
gstreamer-plugins-good-0.10.27,3
gstreamer-plugins-gsm-0.10.21,3
gstreamer-plugins-hal-0.10.27,3
gstreamer-plugins-libmms-0.10.21,3
gstreamer-plugins-libpng-0.10.27,3
gstreamer-plugins-mad-0.10.17,3
gstreamer-plugins-mp3-0.10.0_1
gstreamer-plugins-mpeg2dec-0.10.17,3
gstreamer-plugins-musepack-0.10.21,3
gstreamer-plugins-ogg-0.10.32,3
gstreamer-plugins-pango-0.10.32,3
gstreamer-plugins-shout2-0.10.27,3
gstreamer-plugins-soup-0.10.27,3
gstreamer-plugins-speex-0.10.27,3
gstreamer-plugins-theora-0.10.32,3
gstreamer-plugins-ugly-0.10.17,3
gstreamer-plugins-vorbis-0.10.32,3
gstreamer-plugins-vp8-0.10.21,3
gstreamer-plugins-wavpack-0.10.27,3
gstreamer-plugins-x264-0.10.17,3
gstreamer-plugins-xvid-0.10.21,3
gtk-2.22.1_1
gtk-engines2-2.20.2
gtk-murrina-fancy-clearlooks-0.5_5
gtk-murrine-engine-0.98.1.1
gtkmm-2.22.0
gtksourceview2-2.10.5
gucharmap-2.32.1
gvfs-1.6.6_1
hal-0.5.14_13
hplip-3.11.3
libbluray-0.2.20110219
libbonobo-2.32.0
libbonoboui-2.24.4
libcanberra-0.26
libchamplain-0.8.1
libcroco-0.6.2_1
libgdata-0.6.6
libglade2-2.6.4_4
libgnome-2.32.0
libgnome-keyring-2.32.0
libgnomecanvas-2.30.3
libgnomekbd-2.32.0
libgnomeui-2.24.4
libgsf-1.14.20
libgweather-2.30.3
libnotify-0.5.2
librsvg2-2.32.1_1
libsexy-0.1.11_5
libsoup-2.32.2
libsoup-gnome-2.32.2
libwnck-2.30.6
libxklavier-5.0,1
libxml++-2.32.0
libxslt-1.1.26_2
libxul-1.9.2.16
metacity-2.30.3
midori-0.3.3
mplayer-1.0.r20110329
p5-Net-DBus-0.33.6
pangomm-2.26.3
policykit-0.9_6
policykit-gnome-0.9.2_5
polkit-0.99
poppler-0.14.5
poppler-gtk-0.14.5
py27-dbus-0.83.2
py27-gnome-2.28.1_2
py27-gstreamer-0.10.21
py27-gtk-2.22.0_2
py27-gtksourceview-2.10.1
py27-libxml2-2.7.8_1
py27-vte-0.26.2
rarian-0.8.1
rssowl-1.2.3_7
ru-openoffice.org-3.3.0
swt-3.5.1_2
system-tools-backends-2.10.1
thunderbird-3.1.9
thunderbird-i18n-3.1.9
totem-2.32.0_1
totem-pl-parser-2.32.3
transmission-2.22
transmission-gtk2-2.22
unique-1.1.6_2
upower-0.9.7
vte-0.26.2
webkit-gtk2-1.2.7_1
xscreensaver-5.12_1
xscreensaver-gnome-5.12
zenity-2.32.1
gnome-control-center-2.32.1
shared-mime-info-0.80_1
От glib зависят следующие:
% pkg_info -R glib-2.26.1_1
Information for glib-2.26.1_1:

Required by:
ORBit2-2.14.19
atk-1.32.0
atkmm-2.22.1
avahi-app-0.6.29
avidemux2-2.5.4_2
cairo-1.10.2_2,1
cairomm-1.9.6
clutter-1.4.0
clutter-gtk-0.10.8_1
consolekit-0.4.3
dbus-glib-0.88
dconf-0.5.1_3
deadbeef-0.4.4
desktop-file-utils-0.15_2
eclipse-3.6.1_1
eclipse-datatools-1.8.1
eclipse-emf-2.6.1
eclipse-gef-3.6.1
eclipse-sqlexplorer-2.2.4_5
eclipse-webtools-3.2.2
eggdbus-0.6_1
enchant-1.6.0
eog-2.32.1_2
eog-plugins-2.30.1_2
evince-2.32.0_3
file-roller-2.32.1,1
firefox-4.0_1,1
firefox-i18n-4.0
galculator-1.3.4_3
gamin-0.1.10_4
gconf2-2.32.0_2
gdk-pixbuf-2.22.1
gedit-2.30.4_1
gedit-plugins-2.32.0_1
gftp-2.0.19_4
gio-fam-backend-2.26.1
glibmm-2.25.5,1
gmime-24-2.4.15
gnome-applets-2.32.1.1_2
gnome-desktop-2.32.1_1
gnome-icon-theme-2.31.0_1
gnome-keyring-2.32.1
gnome-menus-2.30.5
gnome-mount-0.8_7
gnome-mplayer-1.0.0_1
gnome-nettool-2.32.0,1
gnome-panel-2.32.1
gnome-session-2.32.1
gnome-settings-daemon-2.32.1_1
gnome-system-monitor-2.28.2
gnome-themes-2.32.1
gnome-vfs-2.24.4
gobject-introspection-0.9.12_1
gstreamer-0.10.32
gstreamer-ffmpeg-0.10.11_1
gstreamer-plugins-0.10.32,3
gstreamer-plugins-a52dec-0.10.17,3
gstreamer-plugins-bad-0.10.21,3
gstreamer-plugins-cdaudio-0.10.21,3
gstreamer-plugins-cdio-0.10.17,3
gstreamer-plugins-core-0.10_12
gstreamer-plugins-dts-0.10.21,3
gstreamer-plugins-dvd-0.10.17,3
gstreamer-plugins-faad-0.10.21,3
gstreamer-plugins-flac-0.10.27,3
gstreamer-plugins-gconf-0.10.27,3
gstreamer-plugins-gio-0.10.32,3
gstreamer-plugins-good-0.10.27,3
gstreamer-plugins-gsm-0.10.21,3
gstreamer-plugins-hal-0.10.27,3
gstreamer-plugins-libmms-0.10.21,3
gstreamer-plugins-libpng-0.10.27,3
gstreamer-plugins-mad-0.10.17,3
gstreamer-plugins-mp3-0.10.0_1
gstreamer-plugins-mpeg2dec-0.10.17,3
gstreamer-plugins-musepack-0.10.21,3
gstreamer-plugins-ogg-0.10.32,3
gstreamer-plugins-pango-0.10.32,3
gstreamer-plugins-shout2-0.10.27,3
gstreamer-plugins-soup-0.10.27,3
gstreamer-plugins-speex-0.10.27,3
gstreamer-plugins-theora-0.10.32,3
gstreamer-plugins-ugly-0.10.17,3
gstreamer-plugins-vorbis-0.10.32,3
gstreamer-plugins-vp8-0.10.21,3
gstreamer-plugins-wavpack-0.10.27,3
gstreamer-plugins-x264-0.10.17,3
gstreamer-plugins-xvid-0.10.21,3
gtk-2.22.1_1
gtk-engines2-2.20.2
gtk-murrina-fancy-clearlooks-0.5_5
gtk-murrine-engine-0.98.1.1
gtkmm-2.22.0
gtksourceview2-2.10.5
gucharmap-2.32.1
gvfs-1.6.6_1
hal-0.5.14_13
hplip-3.11.3
json-glib-0.12.0
libIDL-0.8.14_1
libbonobo-2.32.0
libbonoboui-2.24.4
libcanberra-0.26
libchamplain-0.8.1
libcroco-0.6.2_1
libgdata-0.6.6
libgee-0.6.1
libglade2-2.6.4_4
libgnome-2.32.0
libgnome-keyring-2.32.0
libgnomecanvas-2.30.3
libgnomekbd-2.32.0
libgnomeui-2.24.4
libgsf-1.14.20
libgtop-2.28.3_1
libgweather-2.30.3
libmms-0.5_1
libnotify-0.5.2
librsvg2-2.32.1_1
libsexy-0.1.11_5
libsoup-2.32.2
libsoup-gnome-2.32.2
libspectre-0.2.6
libwnck-2.30.6
libxklavier-5.0,1
libxml++-2.32.0
libxul-1.9.2.16
metacity-2.30.3
midori-0.3.3
mplayer-1.0.r20110329
pango-1.28.3
pangomm-2.26.3
policykit-0.9_6
policykit-gnome-0.9.2_5
polkit-0.99
poppler-0.14.5
poppler-gtk-0.14.5
py27-cairo-1.8.10
py27-dbus-0.83.2
py27-gnome-2.28.1_2
py27-gobject-2.26.0
py27-gstreamer-0.10.21
py27-gtk-2.22.0_2
py27-gtksourceview-2.10.1
py27-orbit-2.24.0
py27-vte-0.26.2
rssowl-1.2.3_7
ru-openoffice.org-3.3.0
swt-3.5.1_2
system-tools-backends-2.10.1
thunderbird-3.1.9
thunderbird-i18n-3.1.9
totem-2.32.0_1
totem-pl-parser-2.32.3
transmission-2.22
transmission-gtk2-2.22
unique-1.1.6_2
upower-0.9.7
vte-0.26.2
webkit-gtk2-1.2.7_1
xscreensaver-5.12_1
xscreensaver-gnome-5.12
zenity-2.32.1
gnome-control-center-2.32.1
shared-mime-info-0.80_1
Глядя на них, как ты думаешь, какие из них точно будут в том или ином виде в Mac OS X, чтобы хотя бы твоя поделка, зависимая пусть только от cairo, там заработала?

iZEN ★★★★★ ()
Ответ на: комментарий от iZEN

> Глядя на них, как ты думаешь, какие из них точно будут в том или ином виде в Mac OS X

никакие

чтобы хотя бы твоя поделка, зависимая пусть только от cairo, там заработала?


я тебе открою секрет - моя «поделка» (с) не требует xorg для работы, и работает «из коробки» на разных дистрибутивах, в том числе и потому, что я не полагаюсь на то, что в каждом из них окажутся нужные версии нужных библиотек

aho ()
Ответ на: комментарий от andreyu

> а что с атрибутами inkscape?

без понятия - это изображение одно из тех, что я нагуглил, когда тестировал работу кода

aho ()
Ответ на: комментарий от aho

прикинь - в mac os нет, хотя откуда нищебродам знать

вот и я думаю откуда...

ls -l /usr/lib/libxml2.*
lrwxr-xr-x  1 root  wheel       15 Feb 10 15:22 /usr/lib/libxml2.2.7.3.dylib -> libxml2.2.dylib
-rwxr-xr-x  1 root  wheel  3758272 Feb 10 15:22 /usr/lib/libxml2.2.dylib
lrwxr-xr-x  1 root  wheel       15 Feb 10 15:22 /usr/lib/libxml2.dylib -> libxml2.2.dylib

uname -a
Darwin chumadann 10.7.3 Darwin Kernel Version 10.7.3: Sun Mar  6 13:37:56 PST 2011; root:xnu-1504.14.2~1/RELEASE_X86_64 x86_64
EvgGad_303 ★★★★★ ()
Ответ на: комментарий от aho

А ловко вы всяким дебилам рот затыкаете. Уважаю. А то развелось полудурков, ни черта ни в чём не понимающих, но считающих себя илитой.

P.S. За планы выложить код отдельное спасибо.

cache ★★ ()
Ответ на: комментарий от EvgGad_303

> Darwin chumadann 10.7.3 Darwin Kernel Version 10.7.3: Sun Mar 6 13:37:56 PST 2011; root:xnu-1504.14.2~1/RELEASE_X86_64 x86_64

О, новенький MacBook Pro последнего поколения. Пацанчик, а ты с какого района?!

Relan ★★★★★ ()
Ответ на: комментарий от roof

> Правда, за вечер сделали?

если точно - то часов 7-8 заняло, в принципе ничего сложного тут нет, потому-что cairo оказался очень удобен для этой задачи, по сути надо было написать только несложный парсер, реализовать «стили» и их иерархию, остальное уже делает cairo

aho ()

У меня была аналогичная задача но только для Qt, как оказаось QtSvg убог более чем полностью в итоге писал свою систему которая создавала полноценные обьекты canvas и QGraphicsItem, работало не медленнее.

stalkerg ★★★★★ ()
Ответ на: комментарий от roof

возможно у меня задача проще, потому-что я взял rapidxml - он построил дерево, а мне уже осталось обработать его и допарсить path, style и пр., кстати что rapidxml, что мой код работают только с оригинальным буфером с текстом, так что из дополнительного расхода памяти - только те самые стили, но там еще есть возможность ускорить работу, потом займусь

aho ()
Ответ на: комментарий от aho

Да, с деревом это хорошо. Мне пришлось инкрементальный парсер писать

roof ★★ ()
Ответ на: комментарий от srgaz

> Прикинь можно поставить)

прикинь - я в курсе

aho ()
Ответ на: комментарий от aho

> > а что с атрибутами inkscape?

без понятия - это изображение одно из тех, что я нагуглил, когда тестировал работу кода


Не, мне интересно, как вы поступаете с этими атрибутами в своем парсере.

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

> Не, мне интересно, как вы поступаете с этими атрибутами в своем парсере.

просто пропускаю, их можно было бы использовать, если б я писал редактор, или просмотрщик, но у меня была задача - просто отрисовать svg для cairo

aho ()
Ответ на: комментарий от aho

ты glib поищи, умник

а чего его искать? его там и не должно быть, хотя можно поставить. тем более на сайте librsvg писано

It is lightweight and portable, requiring only libxml and libart

libxml имеется, libart вроде зависимостей не имеет.

EvgGad_303 ★★★★★ ()
Ответ на: комментарий от Relan

>>Пацанчик, а ты с какого района?!

а чо, на семки приглашаешь?

EvgGad_303 ★★★★★ ()
Ответ на: комментарий от andreyu

Вот-вот, задолбали уже знак @ использовать не по делу. Он читается ка «at» user@home = user AT home — указывает на отношение географической принадлежности.

А «Пили и Выкладывай» должно писаться как «Пили & Выкладывай»

unanimous ★★★★★ ()
Ответ на: комментарий от unanimous

> А «Пили и Выкладывай» должно писаться как «Пили & Выкладывай»

Ты не в теме, хотя и прав формально %)

tailgunner ★★★★★ ()

За разработку зачет. За оформление зачет. Итог: зачет автоматом.

Igron ★★★★★ ()

Этож логотип ABC - буржуйская тв сеть

wingrime ()
Ответ на: комментарий от EvgGad_303

> тем более на сайте librsvg писано

It is lightweight and portable, requiring only libxml and libart


этот сайт 6 лет не обновлялся :) сейчас зависимостей у librsvg вагон и маленькая тележка

aho ()

цвет фона просто идеален.

doctorx ★★★★ ()

Без бенчмарков даже смотреть не буду

zenden ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.