LINUX.ORG.RU
Ответ на: комментарий от Eddy_Em

минусую gd :) очень медленная( относительно ) библиотека и уже заброшенная, тот же cairo хоть и больше, но зато имеет много преимуществ

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

Тормозов не замечал - работает с такой же скоростью, как если бы делать все без нее. Из плюсов - облегчение работы со всякими jpeg'ами да png...

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

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

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

> Тормозов не замечал - работает с такой же скоростью, как если бы делать все без нее

у меня cairo раз в 10 быстрее на больших картинках - 2048x2048 и т.п.

из плюсов - облегчение работы со всякими jpeg'ами да png...


cairo png понимает, jpeg - да, самому пришлось прикручивать

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

> Если работает, зачем что-то трогать?

баги исправлять - опять же их в gd хватает, по-крайней мере мне «повезло» нарваться на несколько, в cairo можно хоть самому исправить - и исправление примут в тот же день

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

> ... jpeg - да, самому пришлось прикручивать

А как получилось прикрутить JPEG? (мне как раз для этого в частности надо)
Попиксельное чтение-вывод после декодирования libjpeg'ом?

И еще вопрос - использовали Cairo в контексте GTK+ или как-то отдельно?

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

> Попиксельное чтение-вывод после декодирования libjpeg'ом?

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

И еще вопрос - использовали Cairo в контексте GTK+ или как-то отдельно?


и с GTK( +quartz, + win32 ), и отдельно

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

> ... использовать cairo_image_surface_create_for_data

Понял. Спасибо за хинт. Буду копать в этом направлении.

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

... и с GTK( +quartz, + win32 ), и отдельно

Данные считываются:

  cairo_surface_t *surface;
  surface = cairo_image_surface_create_for_data (pBuf, CAIRO_FORMAT_RGB24, w, h, stride);

А как их отобразить в это окно?

  cairo_t *cr;
  cr = gdk_cairo_create(widget->window);

Я попробовал так:

  cairo_mask_surface (cr, surface, 0, 0);

Но программа выдает: _test: Fatal IO error 14 (Неправильный адрес) on X server :0.0.

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

А как их отобразить в это окно?

что-то вроде такого:

   cairo_set_operator( cr, CAIRO_OPERATOR_SOURCE );
   cairo_set_source_surface( cr, surface, 0, 0 );
   cairo_rectangle( cr, 0, 0, w, h );
   cairo_fill( cr );
   cairo_destroy( cr );
aho
()
Ответ на: комментарий от pacify

Попробовал:

  cairo_mask (cr, surface);
Выдало: _test: /build/buildd-cairo_1.6.4-7-i386-MtHzYf/cairo-1.6.4/src/cairo.c:87: _cairo_error: Проверочное утверждение `status > CAIRO_STATUS_SUCCESS && status <= CAIRO_STATUS_INVALID_STRIDE' не выполнено. Аварийный останов

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

Да, заработало.

Дело было в размере буфера - я создавал RGB24, как 3 байта на пиксел,
а там (см. значение stride = cairo_format_stride_for_width (CAIRO_FORMAT_RGB24, w))
оно должно быть равно 4. Поэтому данных «не хватало».

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