Страниц: [1] 2
  Печать  
Автор Тема: PmMem & семейство PgDrawImage  (Прочитано 11680 раз)
Absolut
Full Member
***
Offline Offline

Сообщений: 179


Просмотр профиля
« : Февраля 14, 2008, 07:05:34 pm »

Столкнулся с непонятным эффектом.

Рисую Raw Widget. В нем вывожу помимо линий и прямоугольников ещё картинки через PgDrawPhImagemx(). Всё работает хорошо, в плане отрисовки. Решил добавить в функцию прорисовки PmMemoryContext для исключения мерцания. И что я вижу: линии  рисуются по-прежнему нормально, а вот вместо картинок явно какой-то мусор.

Кто-нибудь с таким сталкивался? Подскажите, плиз, решение.
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #1 : Февраля 18, 2008, 10:06:24 am »

Лучше использовать не Memory Context, а Offscreen Context.
Записан

Absolut
Full Member
***
Offline Offline

Сообщений: 179


Просмотр профиля
« Ответ #2 : Февраля 18, 2008, 02:06:48 pm »

Кхм. Вероятно у меня в PhAB 1.14 для QNX 4.25 такого еще не придумали.
Записан
qnxloder
Sr. Member
****
Offline Offline

Сообщений: 292


Просмотр профиля
« Ответ #3 : Февраля 18, 2008, 03:15:34 pm »

PmMemStart();
PgDrawPhImage();
PmMemStop();
?
Записан
Absolut
Full Member
***
Offline Offline

Сообщений: 179


Просмотр профиля
« Ответ #4 : Февраля 18, 2008, 03:21:33 pm »

qnxloder
PmMemStart();
PgDrawPhImage();
PmMemStop();

Да. Именно эти функции я и пытаюсь использовать:

PmMemCreateMC();
PmMemStart();
PgDrawPhImagemx();  // <- рисует мусор
PmMemFlush();
PmMemStop();
PmMemReleaseMC();
Записан
qnxloder
Sr. Member
****
Offline Offline

Сообщений: 292


Просмотр профиля
« Ответ #5 : Февраля 18, 2008, 03:38:11 pm »

PmMemCreateMC(); - Это надо при старте программы,
PmMemReleaseMC(); - это по завершению,
а в raw_draw_fun, хотя-бы:
PmMemStart();
PgDrawPhImagemx();
PmMemFlush();
PmMemStop();
PgDrawMem();

Название последней функции точно не помню
Записан
Absolut
Full Member
***
Offline Offline

Сообщений: 179


Просмотр профиля
« Ответ #6 : Февраля 18, 2008, 04:14:19 pm »

Что-то я не нашел ничего похожего на PgDrawMem().
Записан
qnxloder
Sr. Member
****
Offline Offline

Сообщений: 292


Просмотр профиля
« Ответ #7 : Февраля 18, 2008, 04:28:14 pm »

Absolut
Что-то я не нашел ничего похожего на PgDrawMem().


PgDrawPhImagemx(mem_context,...);
Записан
Absolut
Full Member
***
Offline Offline

Сообщений: 179


Просмотр профиля
« Ответ #8 : Февраля 18, 2008, 04:31:37 pm »

PgDrawPhImagemx()
Draw an image that's contained in a PhImage_t structure
Synopsis:
int PgDrawPhImagemx( PhPoint_t const *pos,
                     PhImage_t const *image,
                     int flags );
Ни слова о контекстах!
Записан
qnxloder
Sr. Member
****
Offline Offline

Сообщений: 292


Просмотр профиля
« Ответ #9 : Февраля 18, 2008, 06:13:33 pm »

PmMemFlush( mem_context, image );
PgDrawPhImagemx(...image);
Записан
Absolut
Full Member
***
Offline Offline

Сообщений: 179


Просмотр профиля
« Ответ #10 : Февраля 18, 2008, 06:41:51 pm »

PmMemoryContext_t *mc;   
PhImage_t img;
PhPoint_t translation={0,0};
short bpp = 3;
   
Dim.w = 1000;
Dim.h = 1000;   

memset( &img, 0, sizeof(PhImage_t) );
img.type = Pg_IMAGE_DIRECT_888;
img.size = Dim;
img.image = malloc( Dim.w*Dim.h*bpp );
   
mc = PmMemCreateMC( &img, &Dim, &translation );
   
PmMemStart( mc );

PgDrawLine(); // Рисует как надо
PgDrawRect(); // Рисует как надо
PgDrawPhImagemx(); // Вот это глючит !!!

PmMemFlush( mc, &img );
PmMemStop( mc );
PmMemReleaseMC( mc );
   
PgDrawPhImagemx( &translation, &img, NULL ); // Отрисовываю на канву то, что рисовал в контексте (mc)

Но вот почему-то линии, прямоугольники - всё окей. А как только картинка, то глюк. Вот о чем я говорю.
Записан
qnxloder
Sr. Member
****
Offline Offline

Сообщений: 292


Просмотр профиля
« Ответ #11 : Февраля 18, 2008, 06:56:25 pm »

А откуда рисует PgDrawPhImagemx(); ?
Записан
Ivan
Участник
*
Offline Offline

Сообщений: 23


Просмотр профиля
« Ответ #12 : Февраля 18, 2008, 07:36:47 pm »


PmMemFlush( mc, &img );


Не могу сказать как в 4 - не работал, не знаю, а вот в 6, если мне не изменяет память, есть нюансы где лежит img: в разделяемой памяти или локально.
Я всегда использовал разделяемую память.
Записан
Absolut
Full Member
***
Offline Offline

Сообщений: 179


Просмотр профиля
« Ответ #13 : Февраля 18, 2008, 08:07:28 pm »

qnxloder
А откуда рисует PgDrawPhImagemx(); ?


Рисует из глобально доступной, выделенной на этапе инициализации программы памяти. Удивляет то, что без Pm* всё рисует корректно, но, соответственно с мерцанием.

2 Ivan: Надо будет проверить с разделяемой памятью. Пока не проверял.
Записан
qnxloder
Sr. Member
****
Offline Offline

Сообщений: 292


Просмотр профиля
« Ответ #14 : Февраля 19, 2008, 10:26:21 am »

Absolut
Рисует из глобально доступной, выделенной на этапе инициализации программы памяти.

А формат рисунка в этой памяти то-же Pg_IMAGE_DIRECT_888 ?
Хотя я то же использовал SharedMem
Записан
Страниц: [1] 2
  Печать  
 
Перейти в: