[amirus] Re: CGX

  • From: poweramiga@xxxxxxxxxx
  • To: amirus@xxxxxxxxxxxxx
  • Date: Tue, 12 Jul 2005 15:42:43 +0300

Hello 
On 12.07.05, Maxim Ilyn wrote:\n

MI>  Хотябы поочередно кадры видеоряда или игрушки.
MI>  По-моему через WritePixelArray как-то некузяво гораздо лучше подготовить

Почему не кузяво? Вполне нормально и работоспособно. По скорости если и 
уступает, то райне
незначительно.

MI>  кадр заранее и переключать на него. Оптимально - отрисовывать в память
MI>  видяхи и после отрисовки переключать на него. Возможно ли ?

Да можно. Я пользовался двумя обоими способами.  В зависимости от поведения 
системы программа
выбирала нужный.
Итак.
Сначала откроем экран. Попробую на сях написать :)  Если ошибусь поправте. Я 
только в начале пути...

cgxscr = OpenScreenTagList(*cgxsreentags); теги вообщем ничем от обычных не 
отличаются.
scr = *cgxscr;
scr = *(scr+sc_RastPort+rpBitMap); чует моё  сердце, что эти две строчи 
написаны неправильно :)
cgxbitmaplock = LockBitMapTagList(scr,
                                                                    
LBMI_WIDTH,cgxbitmap_width,
                                                                    
LBMI_HEIGHT,cgxbitmap_height,
                                                                    
LBMI_DEPTH,cgxbitmap_dept,
                                                                    
LBMI_PIXFMT,cgxbitmap_pixfmt,                                                   
             
LBMI_BYTESPERPIX,cgxbitmap_bytesperpix,
                                                                   
LBMI_BYTESPERROW,cgxbitmap_bytesperrow,
                                                                   
LBMI_BASEADDRESS,cgxbitmap_baseaddress,
                                                                    TAG_END)

в cgxbitmap_baseaddress лежат вожделенные "битмапы" и в них спокойно можно 
писать напрямую.
только предварительно  нужно проверить (сразу после открытия экрана), что 
выделенная под экран память непрерывна и вообще киберграфична :)
scr = *cgxscr;
scr = *(scr+sc_RastPort+rpBitMap);
a=GetCyberMapAttr(scr, CYBRMATTR_ISCYBERGFX);
b=GetCyberMapAttr(scr, CYBRMATTR_ISLINEARMEM);

не забыть про глубину экрана и про, то что форматов расположения может быть 
несколько RGBA, ARGB,
RGB например. Это всё вроде в ID экрана должно быть.

MI>  Можно конечно получить формат пикселей и адрес битплана через :

MI>      UnLockBitMap(LockBitMapTags(CyberScreen->RastPort.BitMap,
MI>                                 LBMI_PIXFMT, (ULONG)&pixfmt,
MI>                                 LBMI_BASEADDRESS, (ULONG)&baseaddress,
MI>                                 TAG_END));

MI>  И уже напрямую писать в этот адрес экрана, но по-моему это не системно.

Моё мнение. Системно, ТО ЧТО РАБОТАЕТ. Не только у тебя.

MI>  PS: Ты был прав - при попытке открыть 15bit экран - открывает 16,
MI>  а при любом 24bit - ARGB32. Ну да ладно, нам проще и по словам выровнено.

Угу. Я на вуду прикалывался в прошлом году. Там кстати 24 бита открывалось 
вроде.

Regards


Other related posts: