Устранение ошибок “Free Pascal Compiler” (FPC) и пересборка "MSEgui/ide"

Этот шаг нужен, чтобы избежать некоторых странностей (а то и серьезных ошибок вроде "SegmentationFault" и "AccessViolation" ), а также если планируется использование не-ASCII –кодов в исходных текстах (см. дальше ) . Команда FPC - в курсе, но на данный момент не успела включить данные исправления в стабильный ( 2.0. x ) бранч FPC-проекта.

Короче, если у вас версия "FreePascal 2.0.4-rc1" и позднее - файлы из каталога «patch_fpc_2_0_4» ( пакет исходников MSEgui + MSEide ) переписать поверх соответствующих файлов исходников FPC ,

Перейти в каталог "$fpc_source_dir/fcl" , выполнить “make clean”, затем “make”, затем - переписать пересозданные unit -ы из “$fpc_source_dir/fcl/units/” поверх соответствующих unit -ов в каталоге бинарников FPC (обычно /usr/lib/fpc/$fpc_version/units/i386-linux/fcl/ ). Теперь пересобрать "MSEgui/ide" из исходников, чтобы также отразить сделанные изменения.

Примечания :


Требования к видео-подсистеме

Чтобы MSEide и приложения на базе MSEgui вообще стартовали , дисплей должен находиться в так называемом "TrueColor" режиме. Для этого есть следующие варианты:

  1. установить глубину цвета 15bpp, 16bpp или 24bpp -> "TrueColor" по умолчанию
  2. установить глубину цвета 8bpp и дополнительно поместить в подсекцию "Display" файла "XF86Config-4", описывающую данную глубину, опцию :

Примечания :

Проверка системы на наличие библиотек,
используемых MSEgui,
в контексте нашего проекта

/usr/lib/libXft.so   –> если хотим антиалиасинг, автозамену и т.п. шрифтов – короче, весь сервис библотеки FreeType

Примечание:

Чтобы вся эта красота реально заработала – нужно установить TTF -шрифты, идеально подходят FreeSans , FreeSerif и FreeMono (пакет “ttf-freefont” )

/usr/lib/libXrender.so   -> нужна, если будем использовать картинки, цветовые градиенты и т.п. ( MSEide использует таковые – например, для рисования градиентов в палитре цветов )

/usr/lib/libpq.so     -> через нее будем работать с PostgreSQL -сервером

/usr/X11R6/lib/libX11.so и /usr/X11R6/lib/libICE.so –> их наличие обязательно (они 100% есть, если нормально работают Иксы ) !

Если перечисленных библиотек нет, то :

  1. установите соответствующие пакеты;
  2. создайте символические линки от более детализированых имен файлов, например:

# ln –s /usr/lib/libXrender.so.1 /usr/lib/libXrender.so

и от имени “root” выполните команду “ldconfig”.

Проверка системы на наличие шрифтов,
используемых MSEgui

Так как MSEgui внутри использует юникод, он может работать в любой национальной среде ( см. системную переменную “LANG” ), при условии, что в системе установлены шрифты с кодировкой ISO 10646-1, в которых представлены символы национального алфавита системы ( см. первую, до точки, часть значения “LANG”, у меня это “ru_RU” ). Опять-таки, проще всего этого добиться, установив те же “ttf-freefonts”.

Для подстраховки по части кодировок лучше импортировать эти шрифты из сервера шрифтов, так как этот сервер умеет на лету генерировать нужные кодировки:

Примечание:

использование "$userarg" - лишь один из способов ( использованый в Debian Linux ) для передачи параметров команжной строки в запускаемый сервер ( демон ) "xfstt", в другом Linux-дистрибутиве может понадобиться другой способ

параметр "--encoding" задает, шрифты в каких кодировках сгенерировать, причем каждый шрифт занимает память, поэтому будем минималистами - зададим минимально необходимый набор кодировок для отображения стандартных X11-программ ( iso8859-1 ), стандартно русифицированных программ ( koi8-r), MSEgui-программ ( iso10646-1 ) и символов вроде стрелок, курсоров и и т.п. ( symbol-0 ); кодировка "windows-1251" здесь - на случай чтения русских MSWord-файлов в среде OpenOffice/StarOffice/KWord

«xfstt» при запуске ищет TrueType-шрифты в каталоге и подкаталогах “/usr/share/fonts/truetype/*” - находит, строит кэш, генерирует кодировки и подгружает - независимо от базовой конфигурации X11.

Поэтому добавить другой комплект TTF-шрифтов просто – скопируйте, например, шрифты от MicroSoft – в каталог “/usr/share/fonts/truetype/microsoft/”, и выполните в нем команды «mkfontscale `pwd`», «mkfontdir `pwd`» и «fс-cache `pwd`» ( эти команды нужны, чтобы информация о новых шрифтах стала доступна для "X11" и "FreeType" ).

Прямая ссылка на “/usr/share/fonts/truetype/ ”( и подкаталоги ) в (/etc/X11/XF86Config-4: Files ) может быть удалена.

Несколько слов о печати

В Линуксе для печати из GUI -приложений используeтся "GhostScript" – просто потому, что он умеет переводить полученные задания в формате PS ( PostScript ) на «язык» конкретного принтера (не обязательно поддерживающего PS ).

Чтобы использовать одни и те же шрифты для отображения и печати – нужно сказать "GhostScript" , где находятся отображаемые шрифты.

Команда печати выглядит примерно так:

сat <file_to_print>.ps | \
gs -I/usr/share/fonts/truetype/ -q -sDEVICE=epson -dBATCH -dNOPAUSE -dSAFER \
-sOutputFile=- - | lpr -Plp

где:

"сat <file_to_print>.ps" – может быть заменено потоком данных для распечатки (в формате PS )

"-I/usr/share/fonts/truetype/" - нужно, если в файле печати есть ссылки на шрифты из этого каталога (и его подкаталогов)

"-sDEVICE=epson" – переводить в формат для распечатки на 9-игольчатом принтере системы команд “Epson”

( список поддерживаемых принтеров можно узнать командой «gs --help», см. «Available devices» )

"lp -Plp" – печатать через LPD/LPRng-спулер, у которого использовать очередь печати “lp”, которая, кстати не должна делать прогон страницы ( PS -файл обычно содержит такую команду)

Местоположение TrueType -шрифтов можно также указать через “~/.bash_profile”, добавив строку:

export GS_FONTPATH=/usr/share/fonts/truetype/: $GS_FONTPATH

Кстати , GhostScript сам просканирует подкаталоги «/usr/share/fonts/truetype/*» в поиске шрифтов .

Но просто информации о каталоге недостаточно, чтобы GhostScript смог использовать TTF -шрифты, ведь он не понимает их имена. Придется использовать алиасы – см. файл

/usr/share/gs[-afpl,-esp]/<ver>/lib/Fontmap.GS

Пример скрипта для автоматизации рутинной задачи генерации алиасов ( причем эти алиасы должны соответствоать аналогичным в "FreeType" - иначе будут расхождения вида на экране и на бумаге ) - см. в архиве xft2gs.tgz, файл "do_xft.sh". В этом архиве также находятся :

Запускать "do_xft.sh" ( и включать новое содержимое "Fontmap.GS.xft" в "Fontmap.GS" ) следует после изменения в секциях "<alias>..< prefer>" файла "/etc/fonts/fonts.conf".
Правило – если алиасы в файле "Fontmap.GS" пересекаются ( переопределяются ), то задействуется самый последний вариант.

Настройки ( через переменные внутри файла ) по умолчанию "do_xft.sh" достаточны даже для того, чтобы "GhostScript" понимал разные варианты именования некоторых шрифтов, например - "Times", "Times New", "Times New Roman", "TimesNew Roman", "TimesNewRoman" - все будут одинаковым образом обработаны, если реально представлены одним и тем же файлом шрифта. Но работает этот
механизм не всегда, и слава богу - лучше всегда знать, какой шрифт реально используется, поэтому
единственно надежный способ задания имени шрифта - его точная нотация, с соблюдением всех пробелов и регистра букв
- настоятельно Вам рекомендую всегда делать именно так ( точные названия шрифтов, понимаемые "GhostScript" - см. левый столбец в файле "Fontmap.GS" ).

Также, с этими настройками не нужно добавлять "export GS_FONTPATH=.." в ваш "~/.bash_profile" (см. выше ), так как будут использованы полные пути к файлам шрифтов.

Запускать "do_xft.sh" следует от имени пользователя, который будет реально печатать ( чтобы учесть его собственные шрифты - в домашнем каталоге ) , а уже добавлять к "Fontmap.GS" придется, став суперпользователем ( root ) . Также, данный скрипт подразумевает использование TrueType-шрифтов.

Опять-таки – почему использовать в PostScript не привычные PS (Type1–шрифты), а именно TrueType ( TTF ) ? Просто потому, что TTF-шрифты содержат в себе начертания символов практически всех европейских языков, нужно лишь сказать «используй такой-то код для начертания такой-то буквы» . Задания печати ( в формате PS ), генерируемые MSEgui компонентом «tpostscriptprinter», содержат в себе таблицы перекодировки – что позволяет распечатать практически любые ( хоть китайские – лишь бы были в шрифте ! ) символы, вне зависимости от системной кодировки.

Общее правило при подготовке печати - всегда указывайте в программе максимально детализированное имя шрифты - "Times New Roman" и т.п., чтобы потом, из-за возможных различий в алиасах шрифтов, не получилось расхождений при печати той же информации на другом рабочем месте.
Легче установить на другом рабочем месте нужный шрифт, чем возиться с алиасами
!

Примечания :

Поведение "GhostScript" при получении неправильного или неизвестного имени шрифта, или когда файл шрифта недоступен на файловой системе - неоднозначно. Он может прекратить работу, а может и продолжить, заменив неверный шрифт на умолчание, как правило - шрифт "Helvetica" ( если шрифт по-умолчанию доступен, то, как правило - происходит 2-й вариант )

Формат названия шрифта, генерируемого "MSEgui" в заданиях для печати :

где :

и именно для такого формата ( "Times New Roman-BoldItalic", и т.п. ) в файле "Fontmap.GS" должны быть подготовлены корректные алиасы.

Какие шрифты по умолчанию используют MSEgui-программы ? Комплект "Fixed", "Helvetica", "Sans", "Serif", "Courier New" и "Mono", назначенный группе встроенных ( stock ) объектов, доступных каждому MSEgui-приложению .
При заказе шрифтов библиотека "FreeType" обращается к своему партнеру - библиотеке "FontConfig", которая, в свою очередь, анализирует системные настройки шрифтов - файл "/etc/fonts/fonts.conf" .

В этом файле нас интересуют секции :

A. Безусловная замена шрифта :

<!--
Accept deprecated 'mono' alias, replacing it with 'monospace'
-->
<match target="pattern">
<test qual="any" name="family">
<string>mono</string>
</test>
<edit name="family" mode="assign">
<string>monospace</string>
</edit>
</match>

То есть вместо шрифта "Mono" следует искать шрифт "Monospace".

 

!!! Сразу вслед этой секцией - добавим запись, ожидаемую "MSEide" :

<match target="pattern">
<test qual="any" name="family">
<string>fixed</string>
</test>
<edit name="family" mode="assign">
<string>monospace</string>
</edit>
</match>

Это будет алиас для шрифта "fixed".

 

 

<!--
Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
-->
<match target="pattern">
<test qual="any" name="family">
<string>sans serif</string>
</test>
<edit name="family" mode="assign">
<string>sans-serif</string>
</edit>
</match>

То есть вместо шрифта "sans serif" следует искать шрифт "sans-serif".

<!--
Accept deprecated 'sans' alias, replacing it with 'sans-serif'
-->
<match target="pattern">
<test qual="any" name="family">
<string>sans</string>
</test>
<edit name="family" mode="assign">
<string>sans-serif</string>
</edit>
</match>

То есть вместо шрифта "sans" следует искать опять-таки шрифт "sans-serif".

 

B. Варианты, в порядке убывания предпочтения

<!--
Provide required aliases for standard names
-->
<alias>
<family>serif</family>
<prefer>
<family>Bitstream Vera Serif</family>
<family>Times New Roman</family>
...
<family>Nimbus Roman No9 L</family>
<family>Times</family>
...
<family>FreeSerif</family>
</prefer>
</alias>

То есть при нескольких вариантах выбора шрифта "serif" - начинать с "Bitstream Vera Serif" ( комплект "fonts-bitstream" ), затем - "Times New Roman" ( шрифт от "MicroSoft" ), "Nimbus Roman No9 L" (Type1-шрифт от "Adobe", входит в комплект GhostScript ), "Times" ( bitmap-шрифт их комплекта XWindows) и "FreeSerif " (шрифт из комплекта “ttf-freefont” ) .


<alias>
<family>sans-serif</family>
<prefer>
<family>Bitstream Vera Sans</family>
<family>Verdana</family>
<family>Arial</family>
...
<family>Nimbus Sans L</family>
<family>Helvetica</family>
...
<family>FreeSans</family>
</prefer>
</alias>

То есть при нескольких вариантах выбора шрифта "sans-serif" - начинать с "Bitstream Vera Sans" ( комплект "fonts-bitstream" ), затем - "Verdana" и "Arial" ( шрифты от "MicroSoft" ), "Nimbus Sans L" (Type1-шрифт от "Adobe", входит в комплект GhostScript ), "Helvetica" ( bitmap-шрифт их комплекта XWindows) и "FreeSans" (шрифт из комплекта “ttf-freefont” ) .

 

<alias>
<family>monospace</family>
<prefer>
<family>Bitstream Vera Sans Mono</family>
<family>Andale Mono</family>
<family>Courier New</family>
...
<family>Nimbus Mono L</family>
<family>Courier</family>
...
<family>FreeMono</family>
</prefer>
</alias>

То есть при нескольких вариантах выбора шрифта "monospace" - начинать с "Bitstream Vera Sans Mono" ( комплект "fonts-bitstream" ), затем - "Andale Mono" и "Courier New" ( шрифты от "MicroSoft" ), "Nimbus Mono L" ( Type1-шрифт от "Adobe", входит в комплект GhostScript ), "Courier" ( bitmap-шрифт их комплекта XWindows) и "FreeMono" (шрифт из комплекта “ttf-freefont” ) .

То есть, если в системе установлены все вышеперечисленные комплекты шрифтов, то шрифты “ttf-freefont” останутся незадействованными. Шрифты "fonts-bitstream" на системе с русской локалью будут отсечены из-за их базового языка ( lang=en ) , следовательно - будут задействованы MicroSoft-шрифты.

Если мы хотим, чтобы в "MSEgui" ( и прочих программах, ориентированных на "FreeType" ) были задействованы шрифты “ttf-freefont”, придется вручную переместить строку "<family>FreeSerif</family>" выше строки "<family>Times New Roman</family>", и так далее для остальных шрифтов.

Кстати, скрипт "do_xft.sh" ( см. выше ) принимает в рассчет данный приоритет шрифтов и для самых приоритетных шрифтов создает самые короткие алиасы .

Примечание :

и перезапусите X11 ( чтобы изменения "fonts.conf" ) вступили в действие.

Может встать вопрос - какой комплект TrueType-шрифтов следует выбрать - "FreeFonts", "MicroSoft", "BitStream" и т.п. ? А может вообще ограничиться Type1-шрифтами ( *.pfa/pfb). Могу только сослаться на собственный опыт :

И все равно мелкие ( < 8 ) размеры шрифтов могут прорисовываться с разрывами, особено если включена субпиксельная прорисовка

Примечания :