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 ()
Последнее исправление: JB (всего исправлений: 1)

вот кстати сравнение отрисовки моего кода и хрома:

http://i.piccy.info/i5/39/16/1401639/1.png

бенчмарки будут уже сделаны после выкладывания кода

П.С. кстати этого львенка GIMP 2.6.10 и eog 2.30.0 почему-то не «съели», хотя изображение очень простое - по сути набор полигонов, даже кривых нет

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

Эх. Если бы на С89 было. Чтобы портировать на встраиваемые системы, где нет С++ компилера, но нужна система отображение.

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

> И еще вопрос по отображению текста. Насколько качественно реализовано?


пока только text работает, tspan, tref - еще нет

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

С текстом все достаточно сложно. Но очень важно для применение в инженерно-прикладной сфере. Я с этой точки зрения присматриваюсь к SVG (уже очень давно).

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

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

Молоток! Так держать! По-больше бы таких адекватных программеров, их очень не хватает

anonymoos ★★★★★
()

Сам пользуюсь cairo очень много, под две системы пишу Linux и Windows (mingw32).

Использую gtk, так что зависимости не страшили, но с использованием libgsvg обломался - в набор gtk2 под win32 эта библиотека не входит, а отдельные найденные бинарники - ни один не заработал. Пришлось срочно ваять парсер/рисователь для svg path.

Желаю успехов в разработке!

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

А и действительно: только заметил, что оно на плюсах... А я даже не думал, что gtk/cairo можно в плюсах использовать. И непонятно, зачем вообще такую библиотечку писать на ООПе.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от 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 ☆☆☆☆☆
()
Ответ на: комментарий от jackLucas

> mingw32

а я на свою голову пользуюсь (неразборчиво) msvc, из «преимуществ» - код получается более переносимым( т.к. точно собирается разными компиляторами ) и варнинги у них с gcc/mingw отличаются, а так да - mingw рулит

Желаю успехов в разработке!


спасибо

aho
() автор топика
Ответ на: комментарий от 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
() автор топика

> но она тянула «всего-лишь» libxml2, glib и т.п. за собой

в итоге вы написали велосипед, который «всего-лишь» тянет за собой libstdc++, и который из сишных проектов использовать нельзя.

неужели не получилось нагуглить либу, которая не тащит за собой glib и libxml2?

waker ★★★★★
()
Ответ на: комментарий от 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 ★★★
()
Ответ на: комментарий от waker

> в итоге вы написали велосипед, который «всего-лишь» тянет за собой libstdc++

вы удивитесь, узнав сколько всего в линуксе «тянет за собой libstdc++», хотя тоже верно - на самом деле тут STL используется всего в 3-4 местах, можно будет его и выкинуть

и который из сишных проектов использовать нельзя.


«наружу», как я уже говорил, отдаются функции, а не класс

неужели не получилось нагуглить либу, которая не тащит за собой glib и libxml2?


нет, не получилось

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

> вы удивитесь, узнав сколько всего в линуксе «тянет за собой libstdc++»

это не повод повторять ошибки.

«наружу», как я уже говорил, отдаются функции, а не класс

как раз классы не проблема, а вот libstdc++ создает ряд проблем

нет, не получилось

что-то мне подсказывает, что вы плохо искали. впрочем, если на либу ушло всего 6-8 часов, почему бы и не велосипед..

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

> это не повод повторять ошибки.

ошибка - это тратить время на написание 100500-го плеера, если говорить про SVG - тот же inkscape написан на С++ и зависит от libstdc++, а они сделали гораздо больше вас, и уж простите - очевидно явно более квалифицированные программисты

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

> толсто

да ладно - создатели blender не гнушаются использовать С++, создатели inkscape аналогично, а тут автор очередного плеера начинает рассказывать, что надо и не надо использовать

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

Ну да , ну да:

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

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

<a><b/></a>

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

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

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

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

не надо так жестко баттхертить. я всего лишь выразил свое мнение со своей колокольни. переходить на оскорбления, и определять квалификацию по фотографии не обязательно. делайте так как считаете нужным :)

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

> да ладно - создатели blender не гнушаются использовать С++, создатели inkscape аналогично,

1. Это намек, что твоя либа будет подобных размеров и заточена только под один продукт.
2. И да, что за манера сравнивать компоненты с продуктами (аки болт с самокатом?)
3. А каким образом свет от ниба создателей blender делает тебя вежливым и равноапостольным с великими ?))

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

Гхрм, извини, что встреваю, но deadbeef - это отличная программа(сам не пользуюсь ибо фанат Qmmp, но другим линуксоидам рекомендую). А твоя библиотека, ну, как бы так сказать, вот она то как раз и очередная из 100500. Это я к чему - поумерь наезды, принимай конструктивную критику, посылай троллей на йух, ну и сам не тролль других.

// Выдохнул

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

не надо так жестко баттхертить

у вас очень хорошая фантазия :)

всего лишь выразил свое мнение со своей колокольни

это вы правильно сделали

и определять квалификацию по фотографии не обязательно

и не пытался, что вы, вот открыл ваш код, выбрал случайный файл, пролистал вниз в произвольное место, попал на код для загрузки обычного плейлиста:

    for (uint32_t i = 0; i < cnt; i++) {
        it = pl_item_alloc ();
        if (!it) {
            goto load_fail;
        }
        uint16_t l;
        // fname
        if (fread (&l, 1, 2, fp) != 2) {
            goto load_fail;
        }
        it->fname = malloc (l+1);
        if (fread (it->fname, 1, l, fp) != l) {
            goto load_fail;
        }
        it->fname[l] = 0;
        // decoder
        uint8_t ll;
        if (fread (&ll, 1, 1, fp) != 1) {
            goto load_fail;
        }
        if (ll >= 20) {
            goto load_fail;
        }
        if (ll) {
            char decoder[20];
            if (fread (decoder, 1, ll, fp) != ll) {
                goto load_fail;
            }
            decoder[ll] = 0;
            it->decoder_id = plug_get_decoder_id (decoder);
        }
        else {
            it->decoder_id = NULL;
        }
        // tracknum
        if (fread (&l, 1, 2, fp) != 2) {
            goto load_fail;
        }
        it->tracknum = l;
        // startsample
        if (fread (&it->startsample, 1, 4, fp) != 4) {
            goto load_fail;
...

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

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

> Это намек, что твоя либа будет подобных размеров и заточена только под один продукт.

нет, конечно, как раз «прибитость» и размер кода на С и не позволили мне его использовать

А каким образом свет от ниба создателей blender делает тебя вежливым и равноапостольным с великими ?))


а я не настолько глуп, чтоб огульно говорить, что что-то не надо, потому-что мне нравится

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

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

если бы вы не были уже замечены ранее в тупом троллинге, что С++ не нужен, - «выпадов» бы и не было

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

> в тупом троллинге, что С++ не нужен

никакого троллинга — я действительно считаю, что он не нужен. хотя вполне нормально его использую в работе, а также применяю чужие библиотеки на c++. у каждого свой опыт и свое мнение. вашу точку зрения оспаривать я не собираюсь.

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

p.s. мне неприятно читать сообщения, полные личной неприязни ко мне, поэтому просто добавляю вас в игнор. извините, что посмел написать в вашу тему.

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

> но deadbeef - это отличная программа

когда я пробовал - она упала на добавлении файлов, может просто была ранняя версия, хотя судя по коду - падать оно может легко

А твоя библиотека, ну, как бы так сказать, вот она то как раз и очередная из 100500.


абсолютно верно - я так даже скрин назвал, это даже не библиотека - так несколько файлов под специфическую задачу

принимай конструктивную критику


ну так нет ее, пришел один - С++ не нужен, пришел второй - С++ не нужен, есть expat на С, пришел третий - С++ не нужен, я понимаю - у людей может быть такая точка зрения, но если каждый начнет то и делать, что везде писать - «С говно - оно падает», «Java тормозит», «C++ не нужен», «PHP для лузеров» и т.п., то наверное ничего хорошего из этого не выйдет

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

> Напиши новый редактор для растровых изображений!

сейчас пишу такое:

http://i.piccy.info/i5/28/50/1405028/1.png

как раз добавляю поддержку SVG и слои, так что можно было бы взять за основу, также взять ImageMagic, чтоб не заморачиваться, и получить что-то рабочее, но на действительно хороший редактор надо будет потратить уйму времени, много чего узнать о том, как на самом деле надо было сделать и т.д., один не потяну точно, мне бы закончить свое сначала :)

aho
() автор топика

Извините, что не по теме: можно узнать название темы Metacity и цветовой схемы GTK (Qt)?

An12
()
Ответ на: комментарий от 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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.