Просмотр полной версии : Библиотека Cybergraphics(CGX) для FPC OS4.1
Smalovsky
02.09.2023, 16:58
Хотелось бы освоить библиотеку сайберграфикс на фри Паскале.
В системе в папке LIBS есть файл cybergaphics.l.main. Значит ли это, что библиотека уже установлена?
Нашёл ссылку на описание библиотеки https://www.freepascal.org/daily/packages/arosunits/cybergraphics/index-8.html
Но без примеров кода совершенно ничего не могу понять. Программировал ли кто используя эту библиотеку? Может, кто приведёт какой-нибудь пример кода( можно на си)?
Smalovsky
Ответу по пунктам что такое .l.main и про cybergraphics, сначала про .l.main:
Когда нет нативной powerpc версии какой-то либы, а только старая 68к версия, но мы хотим ее использовать с powerpc кодеса, то у нас есть 2 варианта: сделать вот такие powepc->68k стабы, или юзать EmulateTags(). С EmulateTags() гемора больше и дольше когда речь о большой либе с большим кол-во функций, поэтому в основном делают стабы. Можешь зачитать Migaration Guide о том что такое powerpc->68k стабы, но в целоем, если у тебя есть скажем 68k версия dopus5.library, и ты хочешь ее использовать с нативных amigaos4/ppc бинарников, то ты создаешь dopus5.l.main. И когда код из твоего ос4-ппц бинарника захочет использовать функции 68 либы, система (ramlib если более точно), автоматически сканит на .l.main и если найдено, открывает и берет интерфейс оттуда. Стабы эти не нужно самому писать (хотя можно), они генерятся тулзами типа fd2pragma, fdtrans, IDLtool.
Само имя стаба в целом не важно, не обязательно это .library, может быть .module или пох что. Главное что ramlib в нужном сценарии будет искать "." в имени начиная с конца и как нашлось интерфейс добавляется, и можно юзать ппц кодеса.
Если интересно я писал статейку об этом неск. лет назад (на английском правда) : https://os4coding.net/blog/kas1e/how-build-ppc-stubs-68k-libraries
Далее про cybergraphics : это старая древняя либа, которая в os4 уже давно интегрирована в graphics.library, как и picasso96. Фукнции обеих либ еще могут юзаться, но это уже просто врапперы над graphics.library's функциями, и остались в SDK только ради поддержки старого кодеса, и все. Поэтому на современное amigaos4 , юзать не cgx, не p96 больше не нужно и не рекомендуется. Юзается теперь чисто graphics.library напрямую онли.
Откуда у тебя в Libs: вообще cybegraphics.l.main - хз , но она уже не нужна.
Ну и в целом, паскалем у тебя будет гемор на ОС4, FPC не до конца корректно работает с ОС4 тачками где нужен "alignement", и поэтому некоторые тулзы будут крашится. Плюс паскаль не поддержен в SDK официальном. C ОС4 только C / C++ язык выбора если хочется полного контроля, поддержки и тд.
Smalovsky
10.09.2023, 16:37
Фукнции обеих либ еще могут юзаться, но это уже просто врапперы над graphics.library's функциями, и остались в SDK только ради поддержки старого кодеса, и все. Поэтому на современное amigaos4 , юзать не cgx, не p96 больше не нужно и не рекомендуется. Юзается теперь чисто graphics.library напрямую онли.
Вот что-то я не нахожу на Паскале для agraphics( http://www.alb42.de/fpc-docu/agraphics/index-5.html ) расширенных функций из cgx. Приходится обращаться к киберграфиксу...
Написал программку, которая должна узнать у системы характеристики режимов для 24-битного цвета:
Program CGX_Test;
uses exec, sysutils, utility, intuition,agraphics,cybergraphics;
var
execlist:PList;
cybernode:PCyberModeNode;
cyberitem1:tTagItem;
cyberitem2:tTagItem;
citemarray:array [0..1] of ^tTagItem;
deptharray:array [0..1] of Word;
begin
deptharray[0]:=PIXFMT_BGR24;
deptharray[1]:=PIXFMT_RGB24;
cyberitem1.ti_Tag:=CYBRMREQ_CModelArray;
cyberitem1.ti_Data:=LongWord(@deptharray);
cyberitem2.ti_Tag:=TAG_END;
cyberitem2.ti_Data:=0;
citemarray[0]:=@cyberitem1;
citemarray[1]:=@cyberitem2;
execlist:=AllocCModeListTagList(@citemarray);
if execlist <> nil then writeln('cyber');
cybernode:=PCyberModeNode(execlist^.lh_Head);
repeat
writeln('Mode ',cybernode^.ModeText);
writeln('Width ',cybernode^.Width);
writeln('Height ',cybernode^.Height);
writeln('Depth ',cybernode^.Depth);
writeln();
cybernode:=PCyberModeNode(cybernode^.Node.ln_Succ) ;
until cybernode=nil;
end.
Я писал её без других примеров. Где-то ошибся, так как мне выводятся все видеорежимы, а не те которые я запросил( с 24-битным цветом). Информацию о видеорежимах выводит неправильно. Вот пример вывода:
Mode PicassoIV:1280x720 x15 RGB
Width 720
Height 15
Depth 0
Видно, что Height пишет в Width, Depth пишет в Height. Может, я с указателями ошибся? Хорошо бы какие-нибудь примеры для кберграфикса на си посмотреть. Только, не могу эти примеры найти.
- - - Добавлено - - -
Нашёл какие-то примеры для Ароса. Ну хоть что-то.
https://en.wikibooks.org/wiki/Aros/Developer/Docs/Libraries/CGFX
Smalovsky
18.09.2023, 15:32
Задолбался я с ошибками. Решил просмотреть все видеорежимы с помощью программы:
Program CGX_Test;
uses exec, sysutils, utility, intuition,agraphics,cybergraphics;
var
execlist:PList;
cybernode:PCyberModeNode;
begin
execlist:=AllocCModeListTagList(nil);
if execlist <> nil then writeln('cyber');
cybernode:=PCyberModeNode(execlist^.lh_Head);
while cybernode<>nil do
begin
writeln('Mode ',cybernode^.ModeText);
writeln('Width ',cybernode^.Width);
writeln('Height ',cybernode^.Height);
writeln('Depth ',cybernode^.Depth);
writeln();
cybernode:=PCyberModeNode(cybernode^.Node.ln_Succ) ;
end;
end.
Опять, с ошибками формирует список. Вручную откорректировал указатели на некоторые данные:
Program CGX_Test;
uses exec, sysutils, utility, intuition,agraphics,cybergraphics;
var
execlist:PList;
cybernode:PCyberModeNode;
p:^Word;
begin
execlist:=AllocCModeListTagList(nil);
if execlist <> nil then writeln('cyber');
cybernode:=PCyberModeNode(execlist^.lh_Head);
while cybernode<>nil do
begin
writeln('Mode ',cybernode^.ModeText);
p:=@cybernode^.Width;
writeln('Width ',(p-1)^);
// writeln('Width ',cybernode^.Width);
p:=@cybernode^.Height;
writeln('Height ',(p-1)^);
//writeln('Height ',cybernode^.Height);
p:=@cybernode^.Depth;
writeln('Depth ',(p-1)^);
//writeln('Depth ',cybernode^.Depth);
writeln();
cybernode:=PCyberModeNode(cybernode^.Node.ln_Succ) ;
end;
Выводит видеорежимы правильно. Но другие данные побиты.
Зарегистрируюсь на форуме Фри Паскаля и опишу баги.
- - - Добавлено - - -
Незнаю, что делать. Написал на форум https://forum.lazarus.freepascal.org/index.php/topic,64644.0.html
С паскалем будет гемор, только С будет норм. Паскаль на ОС4 это просто чувак для себя портанул компилятор, и хз чего он там и как и куда и почему сделал. А С официально поддержан, это порт GCC, и все девелоперы на ОС4 именно его юзают.
Smalovsky
20.09.2023, 17:17
С паскалем будет гемор, только С будет норм. Паскаль на ОС4 это просто чувак для себя портанул компилятор, и хз чего он там и как и куда и почему сделал. А С официально поддержан, это порт GCC, и все девелоперы на ОС4 именно его юзают.
Я перешёл на picasso96api. "Пикасуха" нормально завелась. Жду исправления киберграфикса.
- - - Добавлено - - -
Меня просят отправить баг на баг-трейкер, но для этого нужно перевести грамотно мой первый пост на английский https://forum.lazarus.freepascal.org/index.php?topic=64644.msg491790#msg491790
Может, кто поможет с переводом? Перевести нужно только русский текст. Перевод можно отправить прямо в этот топик.
Меня просят отправить баг на баг-трейкер, но для этого нужно перевести грамотно мой первый пост на английский https://forum.lazarus.freepascal.org...1790#msg491790
Может, кто поможет с переводом? Перевести нужно только русский текст. Перевод можно отправить прямо в этот топик.
Hi,
While using AmigaOS4 PPC OS (on WinUAE emulator emulating Amiga4000 with graphics card for me) and FreePascal 3.2.2 for AmigaOS4.1 i do have a problem when trying to use CyberGraphics library:
Firstly, i tried to get videomode's properties with this kind of code:
...Здесь первый кусок кода...
But returned information contain bugs. Heigh, widht, depth and other fields just messed around into TCyberModeNode. So i made a small modification via pointer:
...Здесь второй кусок кода...
So then i have correct widht, height and depth. Other fields i didn't touch, but they messed too.
To whom i should send a bug report ?
The bug itself are:
Wrong return of the AllocCModeListTagList(): Function return a list, elements of which when casting to a pointer type PCyberModeNode and returning of TCyberModeNode by this pointer contain wrong values (they just messed around in wrong fields).
Smalovsky
21.09.2023, 16:28
kas1e, спасибо за работу. Буду пробовать отсылать баг.
Я в "Пикасухе" нашёл пару багов...)) Но их обойти можно.
Ну а что делать?.. Надо пробовать программировать, отсылать баги. Так можно помочь разработчикам. Это мне напоминает историю с компилятором SDCC для спектрума. Поначалу, этим компилятором вообще пользоваться нельзя было - баги в огромных количествах. Потом спектрумисты начали отсылать баг-репорты разработчикам, и компилятор постепенно стали исправалять. Исправили до приличного уровня.
Smalovsky
12.12.2024, 10:41
kas1e, я тут пару графических тестов написал, чтобы оценить скорость библиотеки. Не можешь позапускать на своём железе? У меня на эмуляторе в первом тесте fps 9.4, где выводятся 500 одинаковых кадров в окно 640 на 480, а во втором вообще только fps 2.2, но там динамичная демка работающая 50 секунд. Оба теста выводят в конце результаты работы и окна тестов можно закрыть.
Какое у тебя, кстати, железо? В общем, с эмулятором у меня трэшак.
Тесты во вложении. Скомпилированы и исходники.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot