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, после приведения его в порядок и дописывания недостающего.



Проверено: JB ()
Последнее исправление: JB (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

> А я даже не думал, что gtk/cairo можно в плюсах использовать

значит вы ничего не знаете про «плюсы» :)

И непонятно, зачем вообще такую библиотечку писать на ООПе.


С++ != ООП, а выбран он по одной простой причине - это RapidXML в виде одного заголовочного файла, для С таких удобных, быстрых и миниатюрных парсеров я не встречал, остальное уже просто «плюшки»:

1. STL - тот же std::sort таки быстрее qsort, std::vector удобней чем ручное выделение/очистка памяти и т.д.;
2. из «ООП» тут всего один класс - чтоб сделать код ощутимо компактней.

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

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

> для С таких удобных, быстрых и миниатюрных парсеров я не встречал,

expat - XML parsing C library
а libexpat1 - считается довольной быстрой и как классика в жанре.

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

> expat - XML parsing C library

я про нее знаю и пользовался раньше - слово «удобный» рядом с ее названием точно ставить нельзя :)

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

Как по мне, так довольно простая библиотечка.

Да и вообще, XML - текстовые файлы, «парсить» их и безо всяких спец. библиотек можно.

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

Ну хз, как пример, tdom сделан на ней и укатывает xml2.

Хм ,«удобство» - часто это ортогональное понятие к быстродействию. K.O.

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

> Да и вообще, XML - текстовые файлы, «парсить» их и безо всяких спец. библиотек можно.

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

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

> Хм ,«удобство» - часто это ортогональное понятие к быстродействию. K.O.

да, к счастью автору RapidXML получилось успешно совместить эти два понятия

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

> но не использовать С++ иногда важнее.

разве что для embedded, хотя и там во всю С++ используют

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

Benchmarking XML Parsers
http://www.xml.com/pub/a/Benchmark/article.html?page=3

И ? И с чего мне говорить, что это будет лучше официальной и валидной
либы :
http://www.hiit.fi/files/fi/da/pdis/python-xml/expat-1.95.8-orig/doc/referenc...

Expat
This library is the creation of James Clark, who's also given us groff (an nroff look-alike), Jade (an implemention of ISO's DSSSL stylesheet language for SGML), XP (a Java XML parser package), XT (a Java XSL engine). James was also the technical lead on the XML Working Group at W3C that produced the XML specification.

Собственно, как увеличить быстродействие ? - да элементарно:
по максимуму забить на сервис, проверки и диагностику ошибок,
и очередная high speed turbo-lib у вас в шляпе.))





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

> И ? И с чего мне говорить, что это будет лучше официальной

rapidxml используется в бусте, а буст - это чуть ли не стандарт С++, а не просто «официальный»

да элементарно: по максимуму забить на сервис, проверки и диагностику ошибок


я открою вам секрет - в rapidxml проверок на валидность больше чем в expat ;)

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


rapidxml используется в бусте, а буст - это чуть ли не стандарт С++,


Это не аргумент и не абсолютная ценность, ну например:
ну зачем мне твой буст в ядре (или сборке) tcl для отображения svg ?
Это абсурд и на который не пойдут разрабы многих ЯП.



я открою вам секрет - в rapidxml проверок на валидность больше чем в expat ;)


Сомнительно. уже expat валиден по определению почти, а rapidxml еще надо попасть в перечень упоминаемых реализаций для xml w3c , и это для начала ))

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

> Это не аргумент и не абсолютная ценность, ну например:

ну зачем мне твой буст в ядре (или сборке) tcl для отображения svg ?


я сам бустом не пользуюсь

Сомнительно. уже expat валиден по определению почти


«How can I get expat to validate my XML documents?»
«You can't. expat is not a validating parser.»

expat FAQ

да и сам expat устроен так, что там проверок вменяемых в принципе нет, это именно случай - «как увеличить быстродействие ? - да элементарно: по максимуму забить на сервис, проверки и диагностику ошибок» (с)

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

Ты путаешь понятие валидный c валидацией

да и сам expat устроен так, что там проверок вменяемых в принципе нет, это именно случай


Ну да , ну да:
exapt.h
...
enum XML_Error {
XML_ERROR_NONE,
XML_ERROR_NO_MEMORY,
XML_ERROR_SYNTAX,
XML_ERROR_NO_ELEMENTS,
XML_ERROR_INVALID_TOKEN,
XML_ERROR_UNCLOSED_TOKEN,
XML_ERROR_PARTIAL_CHAR,
XML_ERROR_TAG_MISMATCH,
XML_ERROR_DUPLICATE_ATTRIBUTE,
XML_ERROR_JUNK_AFTER_DOC_ELEMENT,
XML_ERROR_PARAM_ENTITY_REF,
XML_ERROR_UNDEFINED_ENTITY,
XML_ERROR_RECURSIVE_ENTITY_REF,
XML_ERROR_ASYNC_ENTITY,
XML_ERROR_BAD_CHAR_REF,
XML_ERROR_BINARY_ENTITY_REF,
XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF,
XML_ERROR_MISPLACED_XML_PI,
XML_ERROR_UNKNOWN_ENCODING,
XML_ERROR_INCORRECT_ENCODING,
XML_ERROR_UNCLOSED_CDATA_SECTION,
XML_ERROR_EXTERNAL_ENTITY_HANDLING,
XML_ERROR_NOT_STANDALONE,
XML_ERROR_UNEXPECTED_STATE,
XML_ERROR_ENTITY_DECLARED_IN_PE,
XML_ERROR_FEATURE_REQUIRES_XML_DTD,
XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING,
/* Added in 1.95.7. */
XML_ERROR_UNBOUND_PREFIX,
/* Added in 1.95.8. */
XML_ERROR_UNDECLARING_PREFIX,
XML_ERROR_INCOMPLETE_PE,
XML_ERROR_XML_DECL,
XML_ERROR_TEXT_DECL,
XML_ERROR_PUBLICID,
XML_ERROR_SUSPENDED,
XML_ERROR_NOT_SUSPENDED,
XML_ERROR_ABORTED,
XML_ERROR_FINISHED,
XML_ERROR_SUSPEND_PE,
/* Added in 2.0. */
XML_ERROR_RESERVED_PREFIX_XML,
XML_ERROR_RESERVED_PREFIX_XMLNS,
XML_ERROR_RESERVED_NAMESPACE_URI
};


Ну в принципе, ничего удивительного )
От аргументов, что «ничего нет для энтого дела», мы перешли к селф-тестам и набросам.))
И именно мне надо что-то аргументированно доказывать. sic !




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

Ну да , ну да:

было бы странно, если б парсер не умел обрабатывать подобные ошибки :) а вот такое, например, expat уже прекрасно пропускает:

<!DOCTYPE list [
<!ELEMENT list (P*)> ]>

<a><b/></a>

И именно мне надо что-то аргументированно доказывать. sic !

ну да - вам ведь не понравился выбор парсера :) хотя наверное опять же языка, а не парсера

П.С. таки в rapidxml проверки на таком же уровне где-то как и в expat, я был не прав, когда сказал, что их там больше

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

Только компиляторов для C++ мало нормальных. Например, под QNX4 и многие другие встраиваемые системы. Но от того, что они встраиваемые не отпадает необходимость отображать на них информацию даже векторно. Распарсить XML на C очень просто через expat (очень миниатюрный парсер и очень быстрый). Понятно, что нужно еще построить дерево.

Я бы поучаствовал в разработке, если бы Вы согласились на такой поворот разработки.

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

> Распарсить XML на C очень просто через expat (очень миниатюрный парсер и очень быстрый). Понятно, что нужно еще построить дерево.

да, это не проблема

Я бы поучаствовал в разработке, если бы Вы согласились на такой поворот разработки.


большое спасибо за предложение, но изначально я планировал написать что-то «легкое», которое как и rapidxml можно было бы потом «собрать» в один .hpp файл, и использовать без всяких линковок, сделав только #include, т.е. наверное я «забью» на анимации и уже сейчас буду идти в этом направлении - реализовывать все оставшееся простое подряд и оформлять на шаблонах в таком виде, потому-что еще одна librsvg никому не нужна, а простой заголовочный файл - легко и удобно использовать, хотя наверняка многие назовут это извращением, и будут правы :)

П.С. кстати совсем забыл, для embedded можно использовать эту библиотеку:

http://cairographics.org/snapshots/libsvg-0.1.4.tar.gz
http://cairographics.org/snapshots/libsvg-cairo-0.1.6.tar.gz

ее забросили давно, хотел ее брать для допиливания - но лицензия мне не подошла( GPL ), но:

1) она работает с expat
2) вроде бы ничего не требует другого

возможно вам она подойдет

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

хотел ее брать для допиливания - но лицензия мне не подошла( GPL )

А в чем проблема-то? Или ваш продукт будет несвободным?

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

> А в чем проблема-то? Или ваш продукт будет несвободным?

да, мне надо это в том числе и для работы

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

> Вот так - сказал, как отрезал.

И сразу весь интерес к своему продукту отбил :)


почему? public domain же будет - хочешь перебивай на GPL, хочешь - используй так

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