Board.KolibriOS.org

Official KolibriOS board
It is currently Wed May 22, 2019 12:31 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 118 posts ]  Go to page Previous 14 5 6 7 8 Next
Author Message
PostPosted: Sun Sep 13, 2009 12:20 am 
Offline
Kernel Optimizer
User avatar

Joined: Mon Jan 16, 2006 7:58 pm
Posts: 657
Простая библиотека шрифтов.
Альфа версия 0.00001 Автор <Lrz>
Для демострации примера вам необходимо сделать следующее:
1) поместить библиотеку fonts_lib.obj в дирректорию с примером font_ex.kex или лучше будет поместить библиотеку в /sys/lib
2) скопировать файл font01.ksf в дирректорию /sys/FONTS
3) с любого места можно запускать пример font_ex.kex

PS/ прежде чем что-либо писать читаем с начала тему.
Раз ни кто не портировал шрифты, значит пока будет жить со своим форматом шрифтов.
Если есть возражения - портируйте любой другой шрифт - я совсем не против.


Attachments:
kolibri_fonts.png
kolibri_fonts.png [ 4.1 KiB | Viewed 4039 times ]
font_lib.7z [3.43 KiB]
Downloaded 162 times
Top
   
PostPosted: Sun Sep 13, 2009 12:32 am 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 811
<Lrz> wrote:
Раз ни кто не портировал шрифты, значит пока будет жить со своим форматом шрифтов.

Я недавно тоже подумывал о своем формате шрифта. Вот приведу пример, пока конечно использовать нельзя, но зато шрифт векторный.


Attachments:
File comment: это в будущем может стать векторным шрифтом
v_font.7z [6.18 KiB]
Downloaded 159 times
Top
   
PostPosted: Sun Sep 13, 2009 12:43 am 
<Lrz>
Хорошая работа!
Я вот закончу с компонентами FileBrowser и ProgressBar для BoxLib и прикручу в числе прочего твою библиотеку к zSea и KFM, а если кого-нибудь что-нибудь не устраивает, то у Лео специальная страничка для этого предусмотрена!


Top
   
PostPosted: Sun Sep 13, 2009 8:15 am 
Offline
Kernel Optimizer
User avatar

Joined: Mon Jan 16, 2006 7:58 pm
Posts: 657
IgorA wrote:
<Lrz> wrote:
Раз ни кто не портировал шрифты, значит пока будет жить со своим форматом шрифтов.

Я недавно тоже подумывал о своем формате шрифта. Вот приведу пример, пока конечно использовать нельзя, но зато шрифт векторный.


Значительных или непреодолимых сложностей в реализации этой идеи нет. Если ты возьмешься за реализацию векторных шрифтов, это будет замечательно. У меня на это нет времени :(. Однако рекомендую посмотреть в сторону распространенных форматов. Т.к. в этом случае не нужно будет самостоятельно изготовлять шрифт в своем формате. Я планирую сделать простую и быструю библиотеку системных шрифтов со своим форматом. Но данная библиотека не отменяет необходимость в реализации устоявшихся форматов шрифтов.


Top
   
PostPosted: Sun Sep 13, 2009 11:42 am 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Жаль, что в архиве fonts_lib нет исходника программы. Непонятно как в памяти представляется шрифт. Какой формат имеет этот растровый шрифт. Как од декодируется и отрисовываеться.

В библиотеке libGUI работа со шрифтами происходит посредством менеджера шрифтов.
Для того, чтобы использовать шрифт в библиотеке, нужно написать декодер шрифта и отрисовщик для менеджера шрифтов. Сейчас в библиотеке есть декодер и отрисовщик только для шрифта CHAR.MT
Так что в библиотеку несложно добавить поддержку любого шрифта. Был бы только декодер и отрисовщик или хотябы описание формата шрифта, чтобы написать и добавить их. Хотя библиотека libGUI не будет против, если декодирование и отрисовку шрифтов(в буфер оперативной памяти) за неё будет делать какая-то другая библиотека. А libGUI будет только выводить отрисованные символы с учётом их размера и области отсечения.

_________________
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!


Top
   
PostPosted: Sun Sep 13, 2009 2:03 pm 
Offline
Kernel Optimizer
User avatar

Joined: Mon Jan 16, 2006 7:58 pm
Posts: 657
andrew_programmer wrote:
Жаль, что в архиве fonts_lib нет исходника программы. Непонятно как в памяти представляется шрифт. Какой формат имеет этот растровый шрифт. Как од декодируется и отрисовываеться.

В библиотеке libGUI работа со шрифтами происходит посредством менеджера шрифтов.
Для того, чтобы использовать шрифт в библиотеке, нужно написать декодер шрифта и отрисовщик для менеджера шрифтов. Сейчас в библиотеке есть декодер и отрисовщик только для шрифта CHAR.MT
Так что в библиотеку несложно добавить поддержку любого шрифта. Был бы только декодер и отрисовщик или хотябы описание формата шрифта, чтобы написать и добавить их. Хотя библиотека libGUI не будет против, если декодирование и отрисовку шрифтов(в буфер оперативной памяти) за неё будет делать какая-то другая библиотека. А libGUI будет только выводить отрисованные символы с учётом их размера и области отсечения.


1) Это версия альфа с самым минимальным номером версии, т.е. особо показывать и нечего.
2) Сейчас доступен только 1 шрифт 8х16, для добавления других шрифтов нужно перерабатывать алгоритм.
3) Сейчас существуют несколько функций такие как:
a) Инициализировать шрифты. Происходит поиск всех доступных шрифтов в папке /sys/FONTS с расширением ksf и версии файла (4 байта в начале 'kf01') выделяется ОЗУ и туда помещается информация о файлах.
б) Инициализация шрифта нужного размера. В функцию передаем размер шрифта push dword (8 shl 16 +16) ;(размер шрифта 8х16). На выходе 0, если шрифт найден и загружен. Т.е. после выполнения 2-й функции у нас будет загружен шрифт
в) Отображение ASCIIZ происходит посимвольно т.е. каждый глиф символа отображается 65 функцией.
г) Освободить все, происходит освобождение ОЗУ, которое заняла библиотека.

Что планируется сделать:
Доработка формата шрифта. Общая оптимизация алгоритма. Масштабирование шрифта до нужного размера.
Разработка следующих функций:
а) Сформировать из строки ASCIIZ картинку -строчку с глифом выбранного шрифта в буфере на выходе получаем указатель.
б) То же что и выше, только отображает на канву.
...
остальное будет по мере реализации выше списка.

Формат файла шрифта:
Code:
version_head db 'kf01'  ; типо размер шрифта всегда 4 символа
font_size1    dd 8 shl 16 +16 ;font_width shl +font_height
font_start1   dd font_8x16
;
font_size2    dd 16 shl 16 +32 ;font_width shl +font_height
font_start2   dd font_16_32

dd      -1      ; коенц структуры
font_name    db 'Kolibri standart font',0
align 4
font_8x16:
file 'font_8x16.fon'
align 4
font_16_32:
file 'font_16x32.fon'


font_8x16.fon - файл с глифами расположенными последовательно и каждый последующий глиф соответствует коду cp866.


Top
   
PostPosted: Sun Sep 13, 2009 3:58 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Quote:
а) Сформировать из строки ASCIIZ картинку -строчку с глифом выбранного шрифта в буфере на выходе получаем указатель.


а) Причём надо добавить возможность формировать картинку с разным количеством бит на пиксель. Это сейчас в Колибри всё рисуется 24-х битным цветом, а для VGA режима система сама конвертирует цвета, делая лишнюю работу которой она не должна заниматься. А когда в Колибри будет поддержка 8 и 16 бит на пиксель, то шрифт нужно будет выводить с той же битностью на пиксель, что и установленный графический режим. А конвертированием цвета с большей битности на меньшую должна заниматься библиотека GUI(например libGUI). При запуске libGUI она определяет битность установленного графического режима и при работе использует буферы и отрисовку той же битности, что и установленный графический режим. Если выводиться изображение или геометрический примитив с другой битностью, то производиться конвертирование в битность установленного видеорежима. Понятно, что такой подход пока не работает в Колибря для VGA режима, потому что нет возможности выводить геометрические примитивы 4-х битным цветом.
б) Шрифт может выводиться и без фона. В этом случае формировать его как картинку в памяти не очень выгодно, хотя и можно. Для отрисовки шрифта без фона программа или библиотека должна выводить/накладывать шрифт попиксельно.

_________________
KolibriOS-перспективная ос!

Kolibri is best operation system in the world!


Top
   
PostPosted: Sun Sep 13, 2009 5:03 pm 
andrew_programmer
Quote:
А конвертированием цвета с большей битности на меньшую должна заниматься библиотека GUI(например libGUI).

А может все-таки не надо валить все в одну кучу? Мы только-только отходим от принципа "все в GUI ядра" (причем в некоторых случаях этот отход был психологически болезненным), а ты уже предлагаешь "А давайте все в одну библиотеку запихаем?".
Я понимаю, что тебе как автору библиотеки это очень удобно - не надо париться с совместимостью с чужими библиотеками, но такой подход не рационален, потому что ущербность других библиотек пока еще не доказана.
Quote:
б) Шрифт может выводиться и без фона. В этом случае формировать его как картинку в памяти не очень выгодно, хотя и можно. Для отрисовки шрифта без фона программа или библиотека должна выводить/накладывать шрифт попиксельно.

Все это очень замечательно, когда все происходит на уроне ядра, где нет переходов с Ring0 на Ring3. При взаимодействии же ядра и приложения каждая точка вызывается int 0x40, что не есть правильно с точки зрения производительности.
С целью уменьшения накладных расходов, я в свое время несколько оптимизировал функцию 35, в результате получилась функция 36. Которая замечательно так используется в BoxLib элементе MenuBar и позволяет восстанавливать фон, не заставляя приложение перерисовывать элементы своего окна. Так что в случае с прозрачным фоном в шрифте библиотеки fonts_lib.obj это будет работать куда производительней, чем попиксельный вывод. 65 функция всяко быстрее выводит чем функция 1 в цикле, а функция 36 объективней быстрее чем 35 в цикле.

З.Ы. Андрей не обижайся на мое высказывание, но не стоит торопится, за это время разработка системы совсем на месте не стояла, как это может показаться с первого взгляда.


Top
   
PostPosted: Sun Sep 13, 2009 6:22 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Quote:
З.Ы. Андрей не обижайся на мое высказывание, но не стоит торопится, за это время разработка системы совсем на месте не стояла, как это может показаться с первого взгляда.


Разве я когда-то обижался? :)
Всё, что делается в Колибри - всё к лучшему.

Quote:
А может все-таки не надо валить все в одну кучу? Мы только-только отходим от принципа "все в GUI ядра" (причем в некоторых случаях этот отход был психологически болезненным), а ты уже предлагаешь "А давайте все в одну библиотеку запихаем?".


Нет, всё в одну библиотеку я не предлагаю, да и нельзя всё сваливать в одну библиотеку. Я привёл пример, почему нужно сделать рисование шрифта в памяти с различным количеством бит на пиксель. Если изначально считать, что цвет точки всегда 24-х битный, то при выводе изображения в 8-ми и 16-ти битных разрешениях придётся переконвертировать нарисованный в буфере шрифт в 8 или 16 бит на пиксель. А зачем процессор мучить лишними вычислениями - пусть уж лучше сразу рисует в 8-ми или 16-ти битном цвете.

Обсуждение одной тематики оказалось тесно связано с другой, поэтому и получилось, что я как бы говорю не совсем по теме. Но тем не менее вот моя логика.

Со временем, если Колибри научиться работать в разрешениях 8 и 16 бит на пиксель, то возникнет вопрос, "А как отображать в этих режимах 24-х и 32-х битные объекты?". Не сваливать же всю проблему на ядро операционной системы, как то сейчас в VGA режиме. Значит этим должны заниматься библиотеки работающие в user-mode. Единственные библиотеки, которые могут на себя взять эту задачу - это библиотеки GUI. Свою библиотеку я упомянул только в качестве примера и я совсем не считаю, что другие библиотеки хуже моей. Как я уже упоминал, должны быть разные библиотеки GUI, чтобы в зависимомти от задач можно было использовать нужную библиотеку.

Quote:
Все это очень замечательно, когда все происходит на уроне ядра, где нет переходов с Ring0 на Ring3. При взаимодействии же ядра и приложения каждая точка вызывается int 0x40, что не есть правильно с точки зрения производительности.
С целью уменьшения накладных расходов, я в свое время несколько оптимизировал функцию 35, в результате получилась функция 36. Которая замечательно так используется в BoxLib элементе MenuBar и позволяет восстанавливать фон, не заставляя приложение перерисовывать элементы своего окна. Так что в случае с прозрачным фоном в шрифте библиотеки fonts_lib.obj это будет работать куда производительней, чем попиксельный вывод. 65 функция всяко быстрее выводит чем функция 1 в цикле, а функция 36 объективней быстрее чем 35 в цикле.


Поэтому в своей библиотеке я реализовал вывод шрифта как вывод картинки. Шрифт рисуется в оперативной памяти и выводится как картинка. Если выводится шрифт без фона, то удобней всего представить распакованный шрифт(или распаковываемый на лету) как маску. Значение отличное от нуля-это точка шрифта. Соответственно рисование такого шрифта(не обязательно напрямую на экране!) производится попиксельно. Вот это и имелось ввиду под фразой, "Для отрисовки шрифта без фона программа или библиотека должна выводить/накладывать шрифт попиксельно.". А чтобы маска занимала меньше места, лучше сделать её не в виде картинки, а как набор,например, 1 байтовых значений(с байтами быстрее манипулировать, чем с битами). Это и подразумевалось
под, "В этом случае формировать его как картинку в памяти не очень выгодно, хотя и можно."

_________________
KolibriOS-перспективная ос!

Kolibri is best operation system in the world!


Top
   
PostPosted: Sun Sep 13, 2009 7:14 pm 
andrew_programmer
Ну, что же - хорошо ты прояснил что имел ввиду. Если я не ошибаюсь, то у <Lrz> как раз так оно и задумано. Впрочем наверняка утверждать не стану - сам расскажет если захочет.

Насчет 8 и 16 бит все конечно кажется логичным, но сдается мне таких видеокарт уже давно не выпускают, а те которые существуют в ближайшие годы так или иначе могут выйти из строя по причине износа (тепловые деформации и окисление никто не отменял), т.е. их количество стремительно сокращается.
Возникает вопрос - а нужно ли заниматься этим? Не будет ли это пустой тратой времени и сил?
Я никому конечно не хочу навязывать такой взгляд, просто обозначаю одну из логичных версий.
ИМХО имея в своем распоряжении 24 бит или 32 бита пользователь не станет искусственно снижать до 8 и 16 бит. Даже моя старая карточка ATI Rage XL 8 Мб держала под все доступные разрешения глубину в 24 бита, да там были и 16 и 8 битные разрешения, но смысл их использовать? Они оставлены исключительно ради совместимости со старыми программами которые не могли работать с режимами больше 16 и 8 бит. И мне так кажется еще один скачок и NVidia с AMD просто откажутся от такой бесполезной совместимости. Тогда будем иметь очередной мартышкин труд.

Те же усилия логичней направить на реализацию не хватающих контролов, да на приложения наконец - все никак не почешемся всем сообществом видеоплеер сделать, хотя наработки есть.


Top
   
PostPosted: Sun Sep 13, 2009 8:36 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Если видеокарта поддерживает 24 или 32 бита - это конечно хорошо. Я и сам запускал Колибри на компьютере AMD-K5 75 Mhz(75Mhz- это частота процессора) с видеокартой S3 Vesa1.2 поддерживающей 24-х битный цвет. И работала колибри там более-менее терпимо(в шестерёнках FPS=8). Но я вспомнил случай, когда один пользователь пожаловался, что не может запустить Колибри в режиме отличном от VGA, потому что его видеокарта не поддерживает 24 бита, но поддерживает 16. Хотя, если не брать в расчёт эти видеокарты из-за их малого количества, то всё нормально.

Я считаю, что старые компьютеры - это область в которой у Колибри нет конкурентов среди десктопных операционных систем.

_________________
KolibriOS-перспективная ос!

Kolibri is best operation system in the world!


Top
   
PostPosted: Mon Sep 14, 2009 3:28 am 
Offline
Kernel Optimizer
User avatar

Joined: Mon Jan 16, 2006 7:58 pm
Posts: 657
Одна поправка, сейчас "старыми или устаревшими" называют PC PIII или Athlon 7 и видеокарты GeForce 2 или их аналоги. Купить части или сам PC можно за символические деньги. Т.е. это означает, что видеокарта будет в состоянии держать 24 и 32 бита в VESA режиме. Поддержка 16,8, 4 битных режимов практически не оправдана. Я не буду писать код который будет поддерживать эти режимы.


Top
   
PostPosted: Mon Sep 14, 2009 7:46 am 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Quote:
Одна поправка, сейчас "старыми или устаревшими" называют PC PIII или Athlon 7 и видеокарты GeForce 2 или их аналоги.


Моё последнее сообщение не очень по теме.
В университете, где я учился, было немало компьютеров Pentium I, но 24 бита их видеокарты держали. В силу проблем с финансами закупать более новые компьютеры небыло возможности и использовались все имеющиеся компьютеры(т.е. Pentium I и другие). Более-менее новые компьютеры(типа Pentium 4) были, только их было мало и они использовались в основном для оформления документов или стояли на спектрометрах или минидифрактометрах для снятия спектров.

_________________
KolibriOS-перспективная ос!

Kolibri is best operation system in the world!


Top
   
PostPosted: Mon Sep 14, 2009 8:43 am 
Offline
Kernel Optimizer
User avatar

Joined: Mon Jan 16, 2006 7:58 pm
Posts: 657
Библиотека следующей версии + исходники. Cобирать fasm v 1.68


Attachments:
font_lib.7z [18.38 KiB]
Downloaded 168 times
Top
   
PostPosted: Sun Sep 27, 2009 4:19 pm 
Offline
Mentor
User avatar

Joined: Tue Jan 15, 2008 11:27 am
Posts: 752
вот мой вариант библиотеки для работы со шрифтами.
работает с растровыми шрифтами формата psf.
рекомендуется при использовании библиотеки gb_lib.


Attachments:
psf_font-0.1.zip [16.53 KiB]
Downloaded 235 times
Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 118 posts ]  Go to page Previous 14 5 6 7 8 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited