Страниц: [1]
  Печать  
Автор Тема: PgSetPalette и Pg_PALSET_GLOBAL  (Прочитано 5389 раз)
3xs
Участник
*
Offline Offline

Сообщений: 7


Просмотр профиля
« : Июня 17, 2008, 07:30:16 pm »

Я хочу рулить физической палитрой в своем приложении QNX 6.3
Приложение имеет указатель на видеопамять и рисует прямо в нее (Photon тоже запущен).
Включен графический режим с глубиной цвета 8 бит.
После подготовки палитры и вызова функции:
PgSetPalette(Pal,0,0,256,Pg_PALSET_GLOBAL,0) изображение на экране не меняет цвет (палитра не меняется) и вызов PgGetPalette возвращает туже палитру, которая была до вызова PgSetPalette. В чем может быть причина?
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #1 : Июня 18, 2008, 03:29:54 pm »

PgFlush() ?
Записан

lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #2 : Июня 18, 2008, 03:31:58 pm »

И ещё флажок EXPOSE нарисовать надо:
        PgSetPalette(savedpal, 0, 0, _Pg_MAX_PALETTE, Pg_PALSET_GLOBAL | Pg_PALSET_FORCE_EXPOSE, 0);
        PgFlush();
Записан

3xs
Участник
*
Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #3 : Июня 18, 2008, 04:40:25 pm »

2 lestat: Нет, к сожалению PgFlush не помогает.
Насколько я понял флажок Pg_PALSET_FORCE_EXPOSE нужен для форсирования перерисовки всех окон. У меня их нет.
Пример тестового кода который не работает:
<CODE>
    PdOffscreenContext_t* ctx;
    int res;
    PhRid_t rid_array[10];    
    PgColor_t cls[_Pg_MAX_PALETTE];
    PgColor_t waspal[_Pg_MAX_PALETTE];
    int i;
    char* flb;

    if (PtInit(NULL) == -1)
       PtExit(EXIT_FAILURE);
    if( PdGetDevices(rid_array, 10) > 0)
    {
        PdSetTargetDevice(NULL, rid_array[0] );
        ctx=PdCreateOffscreenContext(0,1280,1024,Pg_OSC_MAIN_DISPLAY | Pg_OSC_MEM_PAGE_ALIGN);
        flb=PdGetOffscreenContextPtr(ctx);
        //Заполняем 256 цветами
        for(i=0;i<256;i++)
        {
       memset(&flb[i*1280],i,500);           
        }
   for(i=0;i<_Pg_MAX_PALETTE;i++)
   {
       cls=PgRGB(255,255,255);
   }
   res=PgGetPalette(waspal);
   res=PgSetPalette(cls, 0,0,_Pg_MAX_PALETTE,Pg_PALSET_GLOBAL,0);
   PgFlush();
   res=PgGetPalette(waspal);
   sleep(10);
</CODE>
Кроме того, последний вызов GetPalette возвращает ту же палитру, что и первый.
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #4 : Июня 18, 2008, 05:01:21 pm »

Какая видеокарта ?

Можно попробовать ещё и PgWaitHWIdle(); после PgFlush(); хотя врядли - перепрограммирование палитры в стриминг операции не входит.

Попробуй:
PgSetPalette(cls, 0, -1, 0, 0, 0); перед вызовом настоящей PgSetPalette();

Попробуй www.libsdl.org - скомпили SDL и запусти testpalette тест.
Записан

3xs
Участник
*
Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #5 : Июня 18, 2008, 09:04:24 pm »

2 lestat: спасибо, собрал SDL там все работает, понял в чем разница.
Записан
Страниц: [1]
  Печать  
 
Перейти в: