Страхиња Радић

КАКОДА користим Хекс фонтове?

(верзија 1.02, 15. јун 2003.)

Упутство.

0. Напомене.

Ауторска права © 2003. Страхиња Радић.
Штампање, расподела и преглед овог документа су дозвољени
уколико је очувано ово обавештење, а измене нису дозвољене.

Формат Хекс и списе hexdraw.pl и hex2bdf.pl је саставио
Роман Чибора (Roman Czyborra), http://www.czyborra.com.
Спис hex2bdf.pl је незнатно изменио Страхиња Радић.

1. Формат Хекс.

1.1. Увод.

На Интернету постоји много (бесплатних и куповних) фонтова, али мало их садржи све или бар већину знакова Уникода. Још је мање бесплатних фонтова који их садрже. Пошто су за развој фонтова у ЧруТајп (TrueType) или Тип 1 (Type 1) форматима потребни време, много пажње и скупи програми, па стога и новац, за развој ГНУ-овог Унифонта је измишљен формат Хекс (Hex), са ким се уз помоћ обичног уређивача могу мењати знакови у фонту.

1.2. Структура формата Хекс.

Формат Хекс је релативно једноставан. За сваки знак се у датотеку уписују, раздвојени двотачком, његов хексадекадни код у Уникоду и битмапа од 8×16 или 16×16 тачака представљених битовима, а ради практичнијег записа сваки бајт битмапе се записује као пар хексадекадних цифара. Све ово се уписује у датотеку у обичном текстуалном формату, тј. аски (ASCII) 8-битним кодовима (користе се доњих 7 битова: 0-127).

У пракси: знак ‘0463 = CYRILLIC SMALL LETTER YAT’ (мало слово јат), који, на пример, изгледа овако (у матрици 8×16):

--------
--------
--------
--------
--------
--------
--------
--------
---#----
-#####--
-#-#-#--
---#----
---###--
---#--#-
---#---#
---#####
  Легенда:
# = бит 1
- = бит 0

може се представити бинарним бројем

00000000 00000000 00000000 00000000 00000000 \
00000000 00000000 00000000 00010000 01111100 \
01010100 00010000 00011100 00010010 00010001 \
00011111
кога ради краћег записа претварамо у хексадекадни облик:
00 00 00 00 00 00 00 00 10 7C 54 10 1C 12 11 1F
и, најзад, добијамо коначни облик знака у фонту:
0463:0000000000000000107C54101C12111F

2. Потребни програми.

2.1. Програми за приказ и измену.

Од програма који подржавају формат Хекс се истиче уређивач Јудит, кога можете преузети са адресе http://www.yudit.org. Тај програм директно подржава формат Хекс, па за приказ фонта није потребно његово претварање у неки други формат. У наставку ћу се позабавити изменом фонтова у формату Хекс.

Овакав начин записа има два очигледна недостатка:

  1. датотека је већа него што би могла да буде за битмапирани фонт, и
  2. поступак измене знакова има више корака.

Први недостатак се отклања употребом програма за компресију, као што је нпр. gzip, док се други лако отклања следећим списом (датотека hexdraw.pl):

#!/usr/bin/perl -p

sub unpack { 
	local ($_) = @_;
	$_ = unpack ("B*", pack ("H*", $_));
	$width=length($_)/16;
	s/(.{$width})/\t$1\n/g;
	y/01/-#/;
	$_;
};

sub pack { 
	local ($_) = @_; 
	y/-#/01/;
	$_= unpack ("H*", pack ("B*", $_));
	y/a-f/A-F/;
	$_;
}

s/([0-9A-F]{64})/&unpack($1)/ie || 
s/([0-9A-F]{32})/&unpack($1)/ie ||
s/\t([-#]+)\n/&pack($1)/e;

који се, на пример за измену малог слова јат, користи овако:
$ grep 0463 mojfont.hex | perl hexdraw.pl > jat.txt
После измена, знак додајемо у фонт директно, у уређивачу, или на следећи начин из љуске:
$ sh -c 'dodaj.sh 0463 jat.txt mojfont.hex'
Фајл dodaj.sh изгледа овако:

#!/bin/sh
hex=`echo $2 | sed -e's/\.txt/.hex/g'`
cat $2 | perl hexdraw.pl > $hex
grep -v $1 $3 > $3~
cat $hex >> $3~
sort $3~ > $3
rm -f $3~

2.2. Програми за претварање у друге формате фонтова.

Фонтови у формату Хекс се, наравно, могу претворити у било који други формат који подржава битмапе. Тако, на пример, уз помоћ списа hex2bdf.pl:

#!/usr/bin/perl

while (<>) { $glyph{$1} = $2 if /(....):(.+)\n/; }
@chars = sort keys %glyph; $[ = 1;
dbmopen (%charname, "/usr/share/unicode/unidata/charname.db", 0);

print "STARTFONT 2.1
FONT -gnu-$ARGV[0]-medium-r-normal--16-160-75-75-c-80-iso10646-1
SIZE 16 75 75
FONTBOUNDINGBOX 16 16 0 -2
STARTPROPERTIES 2
FONT_ASCENT 14
FONT_DESCENT 2
ENDPROPERTIES
CHARS $#chars\n";

foreach $character (@chars)
{
	$encoding = hex($character); $glyph = $glyph{$character};
	$width = length ($glyph) > 32 ? 2 : 1;
	$dwidth = $width * 8; $swidth= $width * 500;
	$glyph =~ s/((..){$width})/\n$1/g;
	$character = "$character $charname"
	    if $charname = $charname{pack("n",hex($character))};

	print "STARTCHAR U+$character
ENCODING $encoding
SWIDTH $swidth 0
DWIDTH $dwidth 0
BBX $dwidth 16 0 -2
BITMAP $glyph
ENDCHAR\n";
}

print "ENDFONT\n";

могуће је претворити Уникодски фонт из формата Хекс у формат BDF, а преко њега и у компактнији формат PCF, који се даље може спаковати програмом gzip:
$ perl hex2bdf.pl mojfont < mojfont.hex > mojfont.bdf
$ bdftopcf -o mojfont.pcf mojfont.bdf
$ gzip -9 mojfont.pcf

3. Питања.

Уколико наиђете на проблеме приликом употребе фонтова у формату Хекс, напишите ми писмо на адресу mr99164 at alas.matf.bg.ac.yu. Уколико будем имао времена и уколико ми тог дана не стигне брдо нежељене поште, пробаћу да вам одговорим.

Срећно!

Страхиња Радић,
у Београду, 5. јуна 2003. (за верзију 1.0)