import terminus-font-4.48

This commit is contained in:
Toomas Soome 2021-01-02 20:17:37 +02:00
commit cee3932f8c
113 changed files with 857694 additions and 0 deletions

12
75-yes-terminus.conf Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- Accept terminus font -->
<selectfont>
<acceptfont>
<pattern>
<patelt name="family"><string>Terminus</string></patelt>
</pattern>
</acceptfont>
</selectfont>
</fontconfig>

1
AUTHORS Normal file
View File

@ -0,0 +1 @@
Dimitar Zhekov <dimitar.zhekov@gmail.com>

104
CHANGES Normal file
View File

@ -0,0 +1,104 @@
Version 4.48:
* Added the basic 27 hebrew letters and sheqel, with uppercase height.
* Some improvements in the font build scripts.
Version 4.47:
* Added 35 new characters (33 glyphs).
* Replaced ao2-variant "ae" with ao1 "ae", it was too similar to "oe".
* Some fixes and improvements (17 characters in various sizes/styles).
* Significantly improved the font conversion tools. Python 3.5.0 or
Node 6.9.0 are now required to build the font.
Version 4.46:
* The X11 8-bit code pages are not installed by default.
* Added IBM-437 8-bit code page for X11.
* The CRT VGA weight for Linux console is not installed by default.
* Removed the Linux console mapping files.
They should be provided by the console packages.
* Removed the BSD console installation.
The recent BSD-s have a new console subsystem.
* Added 50 new characters. Mostly math, but also Buglarian yat and yus.
* Rewritten the font conversion tools in python and javascript.
The full unicode range (17x64K) is now supported.
* The Windows installer can be built from sources.
* Small fixes and improvements (7 characters in various sizes).
* Renamed (un)install-ref to (un)install-psf-ref.
Version 4.40:
* Added 6 combining accents as separate characters.
* Added 14 letters with dot above / dot below.
* Added partial subscript and superscript: all digits and 11 letters.
* Added 30+ math characters, notably large braces, brackets and parens.
* Added unicode range 2800-28FF in two variants (br1 and br2).
* A few small character fixes.
* Altered configure to be a bit more POSIX compliant.
* Replaced some obscure (un)install Makefile targets with variables.
Version 4.39:
* Added ballot, checkmark, heavy ballot and heavy checkmark.
* Changed HT, LF etc. in sizes 14 and 18-hi2 to be proportional to the
letter height, not the matrix height.
* Added the powerline characters E0A0..E0A2 and E0B0..E0B3.
* Added diameter (2300) - same gluph as empty set (2205).
* Small improvements in size 32.
Version 4.38:
* Added 23 pseudographic characters, most notably rounded frames.
* Added new td1 variant with centered ascii tidle.
* Fixed Y acute in sizes 22 and 28, internal optimizations (invisible).
Version 4.36:
* Removed the rarely used cm2 variant.
* Added new ll2 variant with more distinctive l.
* Added quotereversed (201B), quotedblreversed (201F), I/i/U/u dotbelow
(1ECA, 1ECB, 1EE4, 1EE5).
* Moved all quotes and alike in size 32 one line down.
* Small fixes and improvements (t commaaccent, quotes alignment etc. in
some sizes).
* Windows installation: creates the relevant registry key.
Version 4.35:
* Added hi2 variant for size 18.
* Fixes in size 18: normal V, normal W, bold X, H stroke, some
pseudographic characters and the *NIX installation.
Version 4.34:
* Added size 10x18.
* Small fixes and improvements in section, multiply, Eng/eng, Dje,
dje, house, male, zeta and various characters in the different sizes.
* The default cyrillic ghe is now ge1, with ge2 available as an option.
Version 4.32:
* Slightly more distintive normal M and W.
* Rounded 28-bold, 32-normal, 32-bold.
Also removed the 32-normal kx2 style.
* Small changes: Che/che stroke, phi, Zhe/zhe etc.
* Linux console: the default bold is now framebuffer.
* Smaller Makefile, GNU make required.
* Changed the font license to SIL OFL 1.1.
It's FSF approved, no need to worry.
* And, as you can see, Terminus Font is now on sourceforge.
Version 4.30:
* Added size 22 (not very good).
* Added another 25 characters.
* Various small fixes and improvements.
* Changed the default prefix and x11dir.
Version 4.28:
* Heavy frames (written mostly by Tim Allen) and a few more letters.
* Altered trianges and arrows, small bugfixes.
* Reorganized the 512-character console font to include more letters
instead of the IBM-437 specific pseudographics.

1
COPYING Normal file
View File

@ -0,0 +1 @@
See OFL.TXT

1
INSTALL Normal file
View File

@ -0,0 +1 @@
See README

296
Makefile Normal file
View File

@ -0,0 +1,296 @@
INT = python3
EXT = py
BIN = ./bin
UCS2ANY = $(INT) $(BIN)/ucstoany.$(EXT)
BDF2PSF = $(INT) $(BIN)/bdftopsf.$(EXT)
UCS2X11 = $(INT) $(BIN)/ucstoany.$(EXT) -f
BDF2PCF = bdftopcf
REG_8859_1 = ISO8859 1
REG_8859_2 = ISO8859 2
REG_8859_5 = ISO8859 5
REG_8859_7 = ISO8859 7
REG_8859_9 = ISO8859 9
REG_MS_1251 = Microsoft CP1251
REG_8859_13 = ISO8859 13
REG_8859_15 = ISO8859 15
REG_8859_16 = ISO8859 16
REG_MS_1255 = Microsoft CP1255
REG_IBM_437 = IBM CP437
REG_KOI8_R = KOI8 R
REG_KOI8_U = KOI8 U
REG_BG_MIK = Bulgarian MIK
REG_PT_154 = Paratype PT154
REG_XOS4_2 = XOS4 2
REG_10646_1 = ISO10646 1
PSF_8859_1 = ter-112n.psf ter-114n.psf ter-114b.psf ter-116n.psf ter-116b.psf ter-118n.psf ter-118b.psf ter-120n.psf ter-120b.psf ter-122n.psf ter-122b.psf ter-124n.psf ter-124b.psf ter-128n.psf ter-128b.psf ter-132n.psf ter-132b.psf
PSF_8859_2 = ter-212n.psf ter-214n.psf ter-214b.psf ter-216n.psf ter-216b.psf ter-218n.psf ter-218b.psf ter-220n.psf ter-220b.psf ter-222n.psf ter-222b.psf ter-224n.psf ter-224b.psf ter-228n.psf ter-228b.psf ter-232n.psf ter-232b.psf
PSF_8859_7 = ter-712n.psf ter-714n.psf ter-714b.psf ter-716n.psf ter-716b.psf ter-718n.psf ter-718b.psf ter-720n.psf ter-720b.psf ter-722n.psf ter-722b.psf ter-724n.psf ter-724b.psf ter-728n.psf ter-728b.psf ter-732n.psf ter-732b.psf
PSF_8859_9 = ter-912n.psf ter-914n.psf ter-914b.psf ter-916n.psf ter-916b.psf ter-918n.psf ter-918b.psf ter-920n.psf ter-920b.psf ter-922n.psf ter-922b.psf ter-924n.psf ter-924b.psf ter-928n.psf ter-928b.psf ter-932n.psf ter-932b.psf
PSF_MS_1251 = ter-c12n.psf ter-c14n.psf ter-c14b.psf ter-c16n.psf ter-c16b.psf ter-c18n.psf ter-c18b.psf ter-c20n.psf ter-c20b.psf ter-c22n.psf ter-c22b.psf ter-c24n.psf ter-c24b.psf ter-c28n.psf ter-c28b.psf ter-c32n.psf ter-c32b.psf
PSF_8859_13 = ter-d12n.psf ter-d14n.psf ter-d14b.psf ter-d16n.psf ter-d16b.psf ter-d18n.psf ter-d18b.psf ter-d20n.psf ter-d20b.psf ter-d22n.psf ter-d22b.psf ter-d24n.psf ter-d24b.psf ter-d28n.psf ter-d28b.psf ter-d32n.psf ter-d32b.psf
PSF_8859_16 = ter-g12n.psf ter-g14n.psf ter-g14b.psf ter-g16n.psf ter-g16b.psf ter-g18n.psf ter-g18b.psf ter-g20n.psf ter-g20b.psf ter-g22n.psf ter-g22b.psf ter-g24n.psf ter-g24b.psf ter-g28n.psf ter-g28b.psf ter-g32n.psf ter-g32b.psf
PSF_MS_1255 = ter-h12n.psf ter-h14n.psf ter-h14b.psf ter-h16n.psf ter-h16b.psf ter-h18n.psf ter-h18b.psf ter-h20n.psf ter-h20b.psf ter-h22n.psf ter-h22b.psf ter-h24n.psf ter-h24b.psf ter-h28n.psf ter-h28b.psf ter-h32n.psf ter-h32b.psf
PSF_IBM_437 = ter-i12n.psf ter-i14n.psf ter-i14b.psf ter-i16n.psf ter-i16b.psf ter-i18n.psf ter-i18b.psf ter-i20n.psf ter-i20b.psf ter-i22n.psf ter-i22b.psf ter-i24n.psf ter-i24b.psf ter-i28n.psf ter-i28b.psf ter-i32n.psf ter-i32b.psf
PSF_KOI8_RV = ter-k14n.psf ter-k14b.psf ter-k16n.psf ter-k16b.psf
PSF_KOI8_R = ter-k12n.psf ter-k18n.psf ter-k18b.psf ter-k20n.psf ter-k20b.psf ter-k22n.psf ter-k22b.psf ter-k24n.psf ter-k24b.psf ter-k28n.psf ter-k28b.psf ter-k32n.psf ter-k32b.psf
PSF_BG_MIK = ter-m12n.psf ter-m14n.psf ter-m14b.psf ter-m16n.psf ter-m16b.psf ter-m18n.psf ter-m18b.psf ter-m20n.psf ter-m20b.psf ter-m22n.psf ter-m22b.psf ter-m24n.psf ter-m24b.psf ter-m28n.psf ter-m28b.psf ter-m32n.psf ter-m32b.psf
PSF_PT_154 = ter-p12n.psf ter-p14n.psf ter-p14b.psf ter-p16n.psf ter-p16b.psf ter-p18n.psf ter-p18b.psf ter-p20n.psf ter-p20b.psf ter-p22n.psf ter-p22b.psf ter-p24n.psf ter-p24b.psf ter-p28n.psf ter-p28b.psf ter-p32n.psf ter-p32b.psf
PSF_KOI8_UV = ter-u14n.psf ter-u14b.psf ter-u16n.psf ter-u16b.psf
PSF_KOI8_U = ter-u12n.psf ter-u18n.psf ter-u18b.psf ter-u20n.psf ter-u20b.psf ter-u22n.psf ter-u22b.psf ter-u24n.psf ter-u24b.psf ter-u28n.psf ter-u28b.psf ter-u32n.psf ter-u32b.psf
PSF_XOS4_2 = ter-v12n.psf ter-v14n.psf ter-v14b.psf ter-v16n.psf ter-v16b.psf ter-v18n.psf ter-v18b.psf ter-v20n.psf ter-v20b.psf ter-v22n.psf ter-v22b.psf ter-v24n.psf ter-v24b.psf ter-v28n.psf ter-v28b.psf ter-v32n.psf ter-v32b.psf
PSF = $(PSF_8859_1) $(PSF_8859_2) $(PSF_8859_7) $(PSF_8859_9) $(PSF_MS_1251) $(PSF_8859_13) $(PSF_8859_16) $(PSF_MS_1255) $(PSF_IBM_437) $(PSF_KOI8_RV) $(PSF_KOI8_R) $(PSF_BG_MIK) $(PSF_PT_154) $(PSF_KOI8_UV) $(PSF_KOI8_U) $(PSF_XOS4_2)
PSF_VGAW_8859_1 = ter-114v.psf ter-116v.psf
PSF_VGAW_8859_2 = ter-214v.psf ter-216v.psf
PSF_VGAW_8859_7 = ter-714v.psf ter-716v.psf
PSF_VGAW_8859_9 = ter-914v.psf ter-916v.psf
PSF_VGAW_MS_1251 = ter-c14v.psf ter-c16v.psf
PSF_VGAW_8859_13 = ter-d14v.psf ter-d16v.psf
PSF_VGAW_8859_16 = ter-g14v.psf ter-g16v.psf
PSF_VGAW_MS_1255 = ter-h14v.psf ter-h16v.psf
PSF_VGAW_IBM_437 = ter-i14v.psf ter-i16v.psf
PSF_VGAW_KOI8_RV = ter-k14v.psf ter-k16v.psf
PSF_VGAW_BG_MIK = ter-m14v.psf ter-m16v.psf
PSF_VGAW_PT_154 = ter-p14v.psf ter-p16v.psf
PSF_VGAW_KOI8_UV = ter-u14v.psf ter-u16v.psf
PSF_VGAW_XOS4_2 = ter-v14v.psf ter-v16v.psf
PSF_VGAW = $(PSF_VGAW_8859_1) $(PSF_VGAW_8859_2) $(PSF_VGAW_8859_7) $(PSF_VGAW_8859_9) $(PSF_VGAW_MS_1251) $(PSF_VGAW_8859_13) $(PSF_VGAW_8859_16) $(PSF_VGAW_MS_1255) $(PSF_VGAW_IBM_437) $(PSF_VGAW_KOI8_RV) $(PSF_VGAW_BG_MIK) $(PSF_VGAW_PT_154) $(PSF_VGAW_KOI8_UV) $(PSF_VGAW_XOS4_2)
PCF_8859_1 = ter-112n.pcf ter-112b.pcf ter-114n.pcf ter-114b.pcf ter-116n.pcf ter-116b.pcf ter-118n.pcf ter-118b.pcf ter-120n.pcf ter-120b.pcf ter-122n.pcf ter-122b.pcf ter-124n.pcf ter-124b.pcf ter-128n.pcf ter-128b.pcf ter-132n.pcf ter-132b.pcf
PCF_8859_2 = ter-212n.pcf ter-212b.pcf ter-214n.pcf ter-214b.pcf ter-216n.pcf ter-216b.pcf ter-218n.pcf ter-218b.pcf ter-220n.pcf ter-220b.pcf ter-222n.pcf ter-222b.pcf ter-224n.pcf ter-224b.pcf ter-228n.pcf ter-228b.pcf ter-232n.pcf ter-232b.pcf
PCF_8859_5 = ter-512n.pcf ter-512b.pcf ter-514n.pcf ter-514b.pcf ter-516n.pcf ter-516b.pcf ter-518n.pcf ter-518b.pcf ter-520n.pcf ter-520b.pcf ter-522n.pcf ter-522b.pcf ter-524n.pcf ter-524b.pcf ter-528n.pcf ter-528b.pcf ter-532n.pcf ter-532b.pcf
PCF_8859_7 = ter-712n.pcf ter-712b.pcf ter-714n.pcf ter-714b.pcf ter-716n.pcf ter-716b.pcf ter-718n.pcf ter-718b.pcf ter-720n.pcf ter-720b.pcf ter-722n.pcf ter-722b.pcf ter-724n.pcf ter-724b.pcf ter-728n.pcf ter-728b.pcf ter-732n.pcf ter-732b.pcf
PCF_8859_9 = ter-912n.pcf ter-912b.pcf ter-914n.pcf ter-914b.pcf ter-916n.pcf ter-916b.pcf ter-918n.pcf ter-918b.pcf ter-920n.pcf ter-920b.pcf ter-922n.pcf ter-922b.pcf ter-924n.pcf ter-924b.pcf ter-928n.pcf ter-928b.pcf ter-932n.pcf ter-932b.pcf
PCF_MS_1251 = ter-c12n.pcf ter-c12b.pcf ter-c14n.pcf ter-c14b.pcf ter-c16n.pcf ter-c16b.pcf ter-c18n.pcf ter-c18b.pcf ter-c20n.pcf ter-c20b.pcf ter-c22n.pcf ter-c22b.pcf ter-c24n.pcf ter-c24b.pcf ter-c28n.pcf ter-c28b.pcf ter-c32n.pcf ter-c32b.pcf
PCF_8859_13 = ter-d12n.pcf ter-d12b.pcf ter-d14n.pcf ter-d14b.pcf ter-d16n.pcf ter-d16b.pcf ter-d18n.pcf ter-d18b.pcf ter-d20n.pcf ter-d20b.pcf ter-d22n.pcf ter-d22b.pcf ter-d24n.pcf ter-d24b.pcf ter-d28n.pcf ter-d28b.pcf ter-d32n.pcf ter-d32b.pcf
PCF_8859_15 = ter-f12n.pcf ter-f12b.pcf ter-f14n.pcf ter-f14b.pcf ter-f16n.pcf ter-f16b.pcf ter-f18n.pcf ter-f18b.pcf ter-f20n.pcf ter-f20b.pcf ter-f22n.pcf ter-f22b.pcf ter-f24n.pcf ter-f24b.pcf ter-f28n.pcf ter-f28b.pcf ter-f32n.pcf ter-f32b.pcf
PCF_8859_16 = ter-g12n.pcf ter-g12b.pcf ter-g14n.pcf ter-g14b.pcf ter-g16n.pcf ter-g16b.pcf ter-g18n.pcf ter-g18b.pcf ter-g20n.pcf ter-g20b.pcf ter-g22n.pcf ter-g22b.pcf ter-g24n.pcf ter-g24b.pcf ter-g28n.pcf ter-g28b.pcf ter-g32n.pcf ter-g32b.pcf
PCF_IBM_437 = ter-i12n.pcf ter-i12b.pcf ter-i14n.pcf ter-i14b.pcf ter-i16n.pcf ter-i16b.pcf ter-i18n.pcf ter-i18b.pcf ter-i20n.pcf ter-i20b.pcf ter-i22n.pcf ter-i22b.pcf ter-i24n.pcf ter-i24b.pcf ter-i28n.pcf ter-i28b.pcf ter-i32n.pcf ter-i32b.pcf
PCF_KOI8_R = ter-k12n.pcf ter-k12b.pcf ter-k14n.pcf ter-k14b.pcf ter-k16n.pcf ter-k16b.pcf ter-k18n.pcf ter-k18b.pcf ter-k20n.pcf ter-k20b.pcf ter-k22n.pcf ter-k22b.pcf ter-k24n.pcf ter-k24b.pcf ter-k28n.pcf ter-k28b.pcf ter-k32n.pcf ter-k32b.pcf
PCF_PT_154 = ter-p12n.pcf ter-p12b.pcf ter-p14n.pcf ter-p14b.pcf ter-p16n.pcf ter-p16b.pcf ter-p18n.pcf ter-p18b.pcf ter-p20n.pcf ter-p20b.pcf ter-p22n.pcf ter-p22b.pcf ter-p24n.pcf ter-p24b.pcf ter-p28n.pcf ter-p28b.pcf ter-p32n.pcf ter-p32b.pcf
PCF_KOI8_U = ter-u12n.pcf ter-u12b.pcf ter-u14n.pcf ter-u14b.pcf ter-u16n.pcf ter-u16b.pcf ter-u18n.pcf ter-u18b.pcf ter-u20n.pcf ter-u20b.pcf ter-u22n.pcf ter-u22b.pcf ter-u24n.pcf ter-u24b.pcf ter-u28n.pcf ter-u28b.pcf ter-u32n.pcf ter-u32b.pcf
PCF_10646_1 = ter-x12n.pcf ter-x12b.pcf ter-x14n.pcf ter-x14b.pcf ter-x16n.pcf ter-x16b.pcf ter-x18n.pcf ter-x18b.pcf ter-x20n.pcf ter-x20b.pcf ter-x22n.pcf ter-x22b.pcf ter-x24n.pcf ter-x24b.pcf ter-x28n.pcf ter-x28b.pcf ter-x32n.pcf ter-x32b.pcf
PCF_8BIT = $(PCF_8859_1) $(PCF_8859_2) $(PCF_8859_5) $(PCF_8859_7) $(PCF_8859_9) $(PCF_MS_1251) $(PCF_8859_13) $(PCF_8859_15) $(PCF_8859_16) $(PCF_IBM_437) $(PCF_KOI8_R) $(PCF_PT_154) $(PCF_KOI8_U)
PCF = $(PCF_10646_1)
# Default
all: $(PSF) $(PCF)
DESTDIR =
prefix = /usr/local
psfdir = $(prefix)/share/consolefonts
x11dir = $(prefix)/share/fonts/terminus
install: $(PSF) $(PCF)
mkdir -p $(DESTDIR)$(psfdir)
for i in $(PSF) ; do gzip -c $$i > $(DESTDIR)$(psfdir)/$$i.gz ; done
mkdir -p $(DESTDIR)$(x11dir)
for i in $(PCF) ; do gzip -c $$i > $(DESTDIR)$(x11dir)/$$i.gz ; done
uninstall:
for i in $(PSF) ; do rm -f $(DESTDIR)$(psfdir)/$$i.gz ; done
for i in $(PCF) ; do rm -f $(DESTDIR)$(x11dir)/$$i.gz ; done
fontdir:
mkfontscale $(DESTDIR)$(x11dir)
mkfontdir $(DESTDIR)$(x11dir)
fc-cache -f $(DESTDIR)$(x11dir)
# Linux Console
VGA_8859_1 = uni/vgagr.uni uni/ascii-h.uni uni/win-1252.uni
VGA_8859_2 = uni/vgagr.uni uni/ascii-h.uni uni/vga-1250.uni uni/8859-2.uni
VGA_8859_7 = uni/vgagr.uni uni/ascii-h.uni uni/vga-1253.uni uni/8859-7.uni
VGA_8859_9 = uni/vgagr.uni uni/ascii-h.uni uni/win-1254.uni
VGA_MS_1251 = uni/vgagr.uni uni/ascii-h.uni uni/vga-1251.uni uni/win-1251.uni
VGA_8859_13 = uni/vgagr.uni uni/ascii-h.uni uni/vga-1257.uni uni/8859-13.uni
VGA_8859_16 = uni/vgagr.uni uni/ascii-h.uni uni/nls-1250.uni uni/8859-16.uni
VGA_MS_1255 = uni/vgagr.uni uni/ascii-h.uni uni/win-1255.uni
VGA_IBM_437 = uni/cntrl.uni uni/ascii-h.uni uni/ibm-437.uni
VGA_KOI8_RV = uni/cntrl.uni uni/ascii-h.uni uni/koibm8-r.uni
VGA_KOI8_R = uni/cntrl.uni uni/ascii-h.uni uni/koi8-r.uni
VGA_BG_MIK = uni/cntrl.uni uni/ascii-h.uni uni/bg-mik.uni
VGA_PT_154 = uni/vgagr.uni uni/ascii-h.uni uni/pt-154.uni
VGA_KOI8_UV = uni/cntrl.uni uni/ascii-h.uni uni/koibm8-u.uni
VGA_KOI8_U = uni/cntrl.uni uni/ascii-h.uni uni/koi8-u.uni
VGA_XOS4_2 = uni/xos4-2.uni
DUP_8859_1 = dup/vgagr.dup dup/ascii-h.dup
DUP_8859_2 = dup/vgagr.dup dup/ascii-h.dup
DUP_8859_7 = dup/vgagr.dup dup/ascii-h.dup
DUP_8859_9 = dup/vgagr.dup dup/ascii-h.dup
DUP_MS_1251 = dup/vgagr.dup dup/ascii-h.dup
DUP_8859_13 = dup/vgagr.dup dup/ascii-h.dup
DUP_8859_16 = dup/vgagr.dup dup/ascii-h.dup
DUP_MS_1255 = dup/vgagr.dup dup/ascii-h.dup
DUP_IBM_437 = dup/cntrl.dup dup/ascii-h.dup dup/ibm-437.dup
DUP_KOI8_RV = dup/cntrl.dup dup/ascii-h.dup dup/koi8.dup
DUP_KOI8_R = dup/cntrl.dup dup/ascii-h.dup dup/koi8.dup
DUP_BG_MIK = dup/cntrl.dup dup/ascii-h.dup dup/ibm-437.dup
DUP_PT_154 = dup/vgagr.dup dup/ascii-h.dup
DUP_KOI8_UV = dup/cntrl.dup dup/ascii-h.dup dup/koi8.dup
DUP_KOI8_U = dup/cntrl.dup dup/ascii-h.dup dup/koi8.dup
DUP_XOS4_2 = dup/vgagr.dup dup/xos4-2.dup
$(PSF_8859_1) $(PSF_VGAW_8859_1): ter-1%.psf : ter-u%.bdf $(VGA_8859_1) $(DUP_8859_1)
$(UCS2ANY) $< $(REG_8859_1) $(VGA_8859_1) | $(BDF2PSF) -o $@ $(DUP_8859_1)
$(PSF_8859_2) $(PSF_VGAW_8859_2): ter-2%.psf : ter-u%.bdf $(VGA_8859_2) $(DUP_8859_2)
$(UCS2ANY) $< $(REG_8859_2) $(VGA_8859_2) | $(BDF2PSF) -o $@ $(DUP_8859_2)
$(PSF_8859_7) $(PSF_VGAW_8859_7): ter-7%.psf : ter-u%.bdf $(VGA_8859_7) $(DUP_8859_7)
$(UCS2ANY) $< $(REG_8859_7) $(VGA_8859_7) | $(BDF2PSF) -o $@ $(DUP_8859_7)
$(PSF_8859_9) $(PSF_VGAW_8859_9): ter-9%.psf : ter-u%.bdf $(VGA_8859_9) $(DUP_8859_9)
$(UCS2ANY) $< $(REG_8859_9) $(VGA_8859_9) | $(BDF2PSF) -o $@ $(DUP_8859_9)
$(PSF_MS_1251) $(PSF_VGAW_MS_1251): ter-c%.psf : ter-u%.bdf $(VGA_MS_1251) $(DUP_MS_1251)
$(UCS2ANY) $< $(REG_MS_1251) $(VGA_MS_1251) | $(BDF2PSF) -o $@ $(DUP_MS_1251)
$(PSF_8859_13) $(PSF_VGAW_8859_13): ter-d%.psf : ter-u%.bdf $(VGA_8859_13) $(DUP_8859_13)
$(UCS2ANY) $< $(REG_8859_13) $(VGA_8859_13) | $(BDF2PSF) -o $@ $(DUP_8859_13)
$(PSF_8859_16) $(PSF_VGAW_8859_16): ter-g%.psf : ter-u%.bdf $(VGA_8859_16) $(DUP_8859_16)
$(UCS2ANY) $< $(REG_8859_16) $(VGA_8859_16) | $(BDF2PSF) -o $@ $(DUP_8859_16)
$(PSF_MS_1255) $(PSF_VGAW_MS_1255): ter-h%.psf : ter-u%.bdf $(VGA_MS_1255) $(DUP_MS_1255)
$(UCS2ANY) $< $(REG_MS_1255) $(VGA_MS_1255) | $(BDF2PSF) -o $@ $(DUP_MS_1255)
$(PSF_IBM_437) $(PSF_VGAW_IBM_437): ter-i%.psf : ter-u%.bdf $(VGA_IBM_437) $(DUP_IBM_437)
$(UCS2ANY) $< $(REG_IBM_437) $(VGA_IBM_437) | $(BDF2PSF) -o $@ $(DUP_IBM_437)
$(PSF_KOI8_RV) $(PSF_VGAW_KOI8_RV): ter-k%.psf : ter-u%.bdf $(VGA_KOI8_RV) $(DUP_KOI8_RV)
$(UCS2ANY) $< $(REG_KOI8_R) $(VGA_KOI8_RV) | $(BDF2PSF) -o $@ $(DUP_KOI8_RV)
$(PSF_KOI8_R): ter-k%.psf : ter-u%.bdf $(VGA_KOI8_R) $(DUP_KOI8_R)
$(UCS2ANY) $< $(REG_KOI8_R) $(VGA_KOI8_R) | $(BDF2PSF) -o $@ $(DUP_KOI8_R)
$(PSF_BG_MIK) $(PSF_VGAW_BG_MIK): ter-m%.psf : ter-u%.bdf $(VGA_BG_MIK) $(DUP_BG_MIK)
$(UCS2ANY) $< $(REG_BG_MIK) $(VGA_BG_MIK) | $(BDF2PSF) -o $@ $(DUP_BG_MIK)
$(PSF_PT_154) $(PSF_VGAW_PT_154): ter-p%.psf : ter-u%.bdf $(VGA_PT_154) $(DUP_PT_154)
$(UCS2ANY) $< $(REG_PT_154) $(VGA_PT_154) | $(BDF2PSF) -o $@ $(DUP_PT_154)
$(PSF_KOI8_UV) $(PSF_VGAW_KOI8_UV): ter-u%.psf : ter-u%.bdf $(VGA_KOI8_UV) $(DUP_KOI8_UV)
$(UCS2ANY) $< $(REG_KOI8_R) $(VGA_KOI8_UV) | $(BDF2PSF) -o $@ $(DUP_KOI8_UV)
$(PSF_KOI8_U): ter-u%.psf : ter-u%.bdf $(VGA_KOI8_U) $(DUP_KOI8_U)
$(UCS2ANY) $< $(REG_KOI8_U) $(VGA_KOI8_U) | $(BDF2PSF) -o $@ $(DUP_KOI8_U)
$(PSF_XOS4_2) $(PSF_VGAW_XOS4_2): ter-v%.psf : ter-u%.bdf $(VGA_XOS4_2) $(DUP_XOS4_2)
$(UCS2ANY) $< $(REG_XOS4_2) $(VGA_XOS4_2) | $(BDF2PSF) -o $@ $(DUP_XOS4_2)
psf: $(PSF)
install-psf: $(PSF)
mkdir -p $(DESTDIR)$(psfdir)
for i in $(PSF) ; do gzip -c $$i > $(DESTDIR)$(psfdir)/$$i.gz ; done
uninstall-psf:
for i in $(PSF) ; do rm -f $(DESTDIR)$(psfdir)/$$i.gz ; done
psf-vgaw: $(PSF_VGAW)
install-psf-vgaw: $(PSF_VGAW)
mkdir -p $(DESTDIR)$(psfdir)
for i in $(PSF_VGAW) ; do gzip -c $$i > $(DESTDIR)$(psfdir)/$$i.gz ; done
uninstall-psf-vgaw:
for i in $(PSF_VGAW) ; do rm -f $(DESTDIR)$(psfdir)/$$i.gz ; done
psfref = $(psfdir)/README.terminus
install-psf-ref: README
mkdir -p $(DESTDIR)$(psfdir)
sed -e"/^2\.4/,/^2\.5/p" -n README | grep -v "^2\." > $(DESTDIR)$(psfref)
uninstall-psf-ref:
rm -f $(DESTDIR)$(psfref)
# X11 Window System
X11_8859_1 = uni/x11gr.uni uni/ascii-h.uni uni/win-1252.uni
X11_8859_2 = uni/x11gr.uni uni/ascii-h.uni uni/empty.uni uni/8859-2.uni
X11_8859_5 = uni/x11gr.uni uni/ascii-h.uni uni/empty.uni uni/8859-5.uni
X11_8859_7 = uni/x11gr.uni uni/ascii-h.uni uni/empty.uni uni/8859-7.uni
X11_8859_9 = uni/x11gr.uni uni/ascii-h.uni uni/win-1254.uni
X11_MS_1251 = uni/x11gr.uni uni/ascii-h.uni uni/x11-1251.uni uni/win-1251.uni
X11_8859_13 = uni/x11gr.uni uni/ascii-h.uni uni/x11-1257.uni uni/8859-13.uni
X11_8859_15 = uni/x11gr.uni uni/ascii-h.uni uni/empty.uni uni/8859-15.uni
X11_8859_16 = uni/x11gr.uni uni/ascii-h.uni uni/empty.uni uni/8859-16.uni
X11_IBM_437 = uni/cntrl.uni uni/ascii-h.uni uni/ibm-437.uni
X11_KOI8_R = uni/x11gr.uni uni/ascii-h.uni uni/koi8-r.uni
X11_PT_154 = uni/x11gr.uni uni/ascii-h.uni uni/pt-154.uni
X11_KOI8_U = uni/x11gr.uni uni/ascii-h.uni uni/koi8-u.uni
X11_10646_1 = uni/x11gr.uni uni/10646-1.uni
$(PCF_8859_1): ter-1%.pcf : ter-u%.bdf $(X11_8859_1)
$(UCS2X11) $< $(REG_8859_1) $(X11_8859_1) | $(BDF2PCF) -o $@
$(PCF_8859_2): ter-2%.pcf : ter-u%.bdf $(X11_8859_2)
$(UCS2X11) $< $(REG_8859_2) $(X11_8859_2) | $(BDF2PCF) -o $@
$(PCF_8859_5): ter-5%.pcf : ter-u%.bdf $(X11_8859_5)
$(UCS2X11) $< $(REG_8859_5) $(X11_8859_5) | $(BDF2PCF) -o $@
$(PCF_8859_7): ter-7%.pcf : ter-u%.bdf $(X11_8859_7)
$(UCS2X11) $< $(REG_8859_7) $(X11_8859_7) | $(BDF2PCF) -o $@
$(PCF_8859_9): ter-9%.pcf : ter-u%.bdf $(X11_8859_9)
$(UCS2X11) $< $(REG_8859_9) $(X11_8859_9) | $(BDF2PCF) -o $@
$(PCF_MS_1251): ter-c%.pcf : ter-u%.bdf $(X11_MS_1251)
$(UCS2X11) $< $(REG_MS_1251) $(X11_MS_1251) | $(BDF2PCF) -o $@
$(PCF_8859_13): ter-d%.pcf : ter-u%.bdf $(X11_8859_13)
$(UCS2X11) $< $(REG_8859_13) $(X11_8859_13) | $(BDF2PCF) -o $@
$(PCF_8859_15): ter-f%.pcf : ter-u%.bdf $(X11_8859_15)
$(UCS2X11) $< $(REG_8859_15) $(X11_8859_15) | $(BDF2PCF) -o $@
$(PCF_8859_16): ter-g%.pcf : ter-u%.bdf $(X11_8859_16)
$(UCS2X11) $< $(REG_8859_16) $(X11_8859_16) | $(BDF2PCF) -o $@
$(PCF_IBM_437): ter-i%.pcf : ter-u%.bdf $(X11_IBM_437)
$(UCS2X11) $< $(REG_IBM_437) $(X11_IBM_437) | $(BDF2PCF) -o $@
$(PCF_KOI8_R): ter-k%.pcf : ter-u%.bdf $(X11_KOI8_R)
$(UCS2X11) $< $(REG_KOI8_R) $(X11_KOI8_R) | $(BDF2PCF) -o $@
$(PCF_PT_154): ter-p%.pcf : ter-u%.bdf $(X11_PT_154)
$(UCS2X11) $< $(REG_PT_154) $(X11_PT_154) | $(BDF2PCF) -o $@
$(PCF_KOI8_U): ter-u%.pcf : ter-u%.bdf $(X11_KOI8_U)
$(UCS2X11) $< $(REG_KOI8_U) $(X11_KOI8_U) | $(BDF2PCF) -o $@
$(PCF_10646_1): ter-x%.pcf : ter-u%.bdf $(X11_10646_1)
$(UCS2X11) $< $(REG_10646_1) $(X11_10646_1) | $(BDF2PCF) -o $@
pcf: $(PCF)
install-pcf: $(PCF)
mkdir -p $(DESTDIR)$(x11dir)
for i in $(PCF) ; do gzip -c $$i > $(DESTDIR)$(x11dir)/$$i.gz ; done
uninstall-pcf:
for i in $(PCF) ; do rm -f $(DESTDIR)$(x11dir)/$$i.gz ; done
pcf-8bit: $(PCF_8BIT)
install-pcf-8bit: $(PCF_8BIT)
mkdir -p $(DESTDIR)$(x11dir)
for i in $(PCF_8BIT) ; do gzip -c $$i > $(DESTDIR)$(x11dir)/$$i.gz ; done
uninstall-pcf-8bit:
for i in $(PCF_8BIT) ; do rm -f $(DESTDIR)$(x11dir)/$$i.gz ; done
# Cleanup
clean:
rm -f $(PSF) $(PSF_VGAW) $(PCF) $(PCF_8BIT) $(FNT)
.PHONY: all install uninstall fontdir psf install-psf uninstall-psf psf-vgaw install-psf-vgaw uninstall-psf-vgaw install-psf-ref uninstall-psf-ref pcf install-pcf uninstall-pcf pcf-8bit install-pcf-8bit uninstall-pcf-8bit clean

1
NEWS Normal file
View File

@ -0,0 +1 @@
See CHANGES

94
OFL.TXT Normal file
View File

@ -0,0 +1,94 @@
Copyright (c) 2019 Dimitar Toshkov Zhekov,
with Reserved Font Name "Terminus Font".
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

356
README Normal file
View File

@ -0,0 +1,356 @@
Contents:
1. About.
1.1. Build requitements.
1.2. Quick installation.
1.3. Legend.
1.4. Variants.
1.5. Notes.
1.6. Alternative tools.
2. Linux console.
2.1. Installation.
2.2. Usage.
2.3. Quick reference.
2.4. Legend.
2.5. Notes.
3. X11 Window System.
3.1. Installation.
3.2. Notes.
4. Microsoft Windows.
4.1. Installation package.
4.2. Font file only.
4.3. Notes.
5. Frequently Asked Questions.
6. Legal information.
6.1. Licenses.
6.2. Copyright.
--
1. About.
This archive contains source code for generating and installing Terminus
Font for Linux console, X11 Window System and Microsoft Windows.
- version 4.48
- sizes 6x12, 8x14, 8x16, 10x18, 10x20, 11x22, 12x24, 14x28, 16x32
- weights normal, bold, CRT VGA bold
- characters 1354
- format Bitmap Distribution Format (BDF) version 2.1
The character set covers about 120 language sets and supports ISO8859-1/2/5/
7/9/13/15/16, Paratype-PT154/PT254, KOI8-R/U/E/F, Esperanto and many IBM,
Windows and Macintosh code pages, as well as the IBM VGA, vt100 and xterm
pseudographic characters.
1.1. Build requirements.
- GNU make
- Python 3.5.0+ (or node.js 6.9.0+ as an alternative)
- for X11 only: bdftopcf
- for the Windows installer only: GCC for Win32/i686, NSIS and patch.
1.2. Quick installation.
The commands:
$ ./configure [--prefix=PREFIX]
$ make -j8
# make install fontdir
compile and install the Linux console and X11 Window System fonts.
The default PREFIX is /usr/local.
1.3. Legend.
The file names are structured as follows:
ter-u<SIZE><STYLE>.bdf
<SIZE> is the font height. <STYLE> is n for normal (all sizes), b for bold
(all sizes except 6x12), and v for CRT VGA bold (8x14 and 8x16 only, uses
the eight character matrix column).
1.4. Variants.
Some characters are implemented in two variants. To use the alternate
variant, execute:
$ patch -p1 -i alt/<NAME>.diff
before making the font. See the font WEB page for examples. If you want to
combine hi2 with dv1 and/or ka2, apply hi2 and then hi2-dv1 and/or hi2-ka2.
The default variant for unicode range 2800-28FF is oriented towards
pseudographics.
1.5. Notes.
The commands marked with $ can be executed by a regular user.
The configure commands are optional.
"make -j8" runs 8 jobs in parallel.
Sizes 6x12, 11x22, 14x28-bold and 16x32-normal are worse than the others.
Avoid them.
210E and 210F are not italic.
226A, 226B and the double struck letters are not very good.
2135 may be wrong.
The hebrew letters and sheqel are uppercase height, which is an attempt to
compensate for the missing width.
1.6. Alternative tools.
If your Python 3 executable is named python instead if python3:
$ ./configure INT=python
To use node.js instead of python (slower):
$ ./configure INT=node EXT=js
--
2. Linux console.
- weights normal, bold, CRT VGA-bold
- code pages ISO8859-1/ISO8859-15/Windows-1252, ISO8859-2/Windows-1250,
Windows-1251/ISO8859-5, ISO8859-9/Windows-1254, ISO8859-16,
ISO8859-7/Windows-1253, ISO8859-13/Windows-1257, IBM-437,
Bulgarian-MIK, KOI8-R, KOI8-U, Paratype-PT154, combined
- format PC Screen Font (PSF) with unicode data
2.1. Installation.
$ ./configure [--prefix=PREFIX | --psfdir=DIRECTORY]
$ make -j8 psf
# make install-psf
The files are compressed with gzip and installed in DIRECTORY. The default
DIRECTORY is PREFIX/share/consolefonts. For kbd, you may need to change it
to PREFIX/lib/kbd/consolefonts or PREFIX/share/kbd/consolefonts, depending
on the kbd version.
The CRT VGA bold weight fonts, suitable for real CRT text modes only, are
not installed by default. To install them, execute:
$ make -j8 psf-vgaw
# make install-psf-vgaw
2.2. Usage.
To load a cont in consoletools:
$ consolechars [-m MAPPING] -f ter-<X><SIZE><STYLE>
To load a font in kbd:
$ setfont [-m MAPPING] ter-<X><SIZE><STYLE>
where <X> is a character identifying the code page as listed in p.2.4.
2.3. Quick reference.
The commands:
$ ./configure [--prefix=PREFIX | --psfdir=DIRECTORY | --psfref=FILENAME]
# make install-psf-ref
install the text from p.2.4 as FILENAME (the default is README.terminus)
in DIRECTORY.
2.4. Legend.
names mappings covered codepage(s)
ter-1* iso01, iso15, cp1252 ISO8859-1, ISO8859-15, Windows-1252
ter-2* iso02, cp1250 ISO8859-2, Windows-1250
ter-7* iso07, cp1253 ISO8859-7, Windows-1253
ter-9* iso09, cp1254 ISO8859-9, Windows-1254
ter-c* cp1251, iso05 Windows-1251, ISO8859-5
ter-d* iso13, cp1257 ISO8859-13, Windows-1257
ter-g* iso16 ISO8859-16
ter-h* cp1255, iso08 Windows-1258, ISO8859-8
ter-i* cp437 IBM-437
ter-k* koi8r KOI8-R
ter-m* mik Bulgarian-MIK
ter-p* pt154 Paratype-PT154
ter-u* koi8u KOI8-U
ter-v* all mappings / code pages listed above and many others, about 110
language sets, 8 or 16 foreground colors depending on the kernel and
console driver versions
names weight
ter-*n normal
ter-*b bold
ter-*v CRT VGA bold
2.5. Notes.
The combined code page is based on IBM-437 (character 0xFF is ogonek).
The ISO8859-16 font also includes all letters and accents from Windows-1250.
--
3. X11 Window System.
- weights normal, bold
- code pages ISO8859-1/Windows-1252, ISO8859-2, ISO8859-5, ISO8859-7,
ISO8859-9/Windows-1254, ISO8859-13, ISO8859-15, ISO8859-16,
Windows-1251, IBM-437, KOI8-R, KOI8-U, Paratype-PT154 and
ISO10646-1 (unicode)
- format Portable Compiled Font (PCF)
3.1. Installation.
$ ./configure [--prefix=PREFIX | --x11dir=DIRECTORY]
$ make -j8 pcf
# make install-pcf
The files are compressed with gzip and installed in DIRECTORY. The default
DIRECTORY is PREFIX/share/fonts/terminus. Requires bdftopcf.
A copy of the normal 6x12 font is installed as "bold", because some X11
libraries and applications substitute the missing bold fonts by shifting the
normal fonts, and others do not recognize the bold weight at all if the
lowest font size lacks it.
To update the font cache in DIRECTORY after (un)installation, run:
# make fontdir
The configuration file which lists the font directories must contain
DIRECTORY. The X11 server may need to be restarted so the font list can be
updated.
By default, only the unicode (ISO10646-1) font is installed. To install the
other code pages:
$ make -j8 pcf-8bit
# make install-pcf-8bit
3.2. Notes.
The ISO8859-1 and ISO8859-9 fonts contain the Windows Western characters and
can be used as Windows-1252 and Windows-1254 respectively.
--
4. Microsoft Windows.
- weights normal, bold
- code pages Windows-1252, 1250, 1253, 1254, 1251 and 1257
- format Font File Format version 2.0, compiled into FON
4.1. Installation package.
Make sure that no variant patches are applied to the font (p.1.4).
> cd win32
> build
Be patient, the process may take several minutes.
After that, open terminus.nsi and compile it.
4.2. Font file only.
> copy *.bdf win32
> cd win32
> make -j8
You can install terminus.fon via the regular means.
4.3. Notes.
The Windows code pages contain a total of 384 characters. All other
characters (math, pseudographics etc.) are not currently available.
--
5. Frequently Asked Questions.
Q. Italic version?
A. No. The quality is significantly lower, and preserving the font width
requires overlapping characters, which are not handled very well by X11/Xft.
You can try mkitalic from FreeBSD or bdfslant from Debian.
Q. Scalable version?
A. Probably not. The font uses a lot of straight horizontal and vertical
lines, which is good for a bitmap, but not so much for a vector font. A
bitmap font packaged as TTF seems possible.
Q. How about some new characters?
A. Contact me and be ready to help.
Q. The bold 6x12 font...
A. ...does not exist, there is no space for a bold font in a 6x12 matrix.
However, the "normal" font is somewhere between.
Q. The font works in X11/Motif, but not in GNOME/KDE/Xfce.
A. Try adding 75-yes-terminus.conf to the Fontconfig configuration files.
For some Fontconfig versions, you may need to replace the text "Terminus"
in 75-yes-terminus.conf with "xos4 Terminus", though that is unlikely.
See also mkfontscale(1), mkfontdir(1), fc-cache(1), xorg.conf(5), xfs(1),
xlsfonts(1), fonts-conf(5) etc.
Q. My terminal emulator does not display cyrillic/pseudographics/...
A. If you have the 8-bit X11 code pages installed, and your emulator uses
"XLFD" font names, make sure hat name ends with "-10616-1" instead of
"-*-*".
--
6. Legal information.
6.1. Licenses.
Terminus Font is licensed under the SIL Open Font License, Version 1.1.
The license is included as OFL.TXT, and is also available with a FAQ at:
http://scripts.sil.org/OFL
The font includes two variants of unicode range 2800-28FF, but does not
support Braille in any way.
The configure files, python and javascript sources are distributed under
the GNU General Public License version 2.0 or (at your choice) any later
version.
6.2. Copyright.
Terminus Font 4.48, Copyright (C) 2019 Dimitar Toshkov Zhekov.
Report bugs to <dimitar.zhekov@gmail.com>
Thanks to Anton Zinoviev, Tim Allen, Kir Koliushkin, Antonios Galanopoulos
and everyone else who helped.

356
README-BG Normal file
View File

@ -0,0 +1,356 @@
Съдържание:
1. Обща информация.
1.1. Изисквания за компилация.
1.2. Бърза инсталация.
1.3. Легенда.
1.4. Варианти.
1.5. Забележки.
1.6. Алтернативни средства.
2. Линукс конзола.
2.1. Инсталация.
2.2. Използване.
2.3. Кратко описание.
2.4. Легенда.
2.5. Забележки.
3. X11 Window System.
3.1. Инсталация.
3.2. Забележки.
5. Microsoft Windows.
4.1. Инсталационен пакет.
4.2. Само файл с шрифта.
4.3. Забележки.
5. Често задавани въпроси.
6. Правна информация.
6.1. Лицензи.
6.2. Авторство.
--
1. Обща информация.
Този архив съдържа изходен код за генериране и инсталиране на шрифта
Терминус за Линукс конзола, X11 Window System и Microsoft Windows.
- версия 4.48
- размери 6x12, 8x14, 8x16, 10x18, 10x20, 11x22, 12x24, 14x28, 16x32
- тежести нормален, удебелен, CRT VGA-удебелен
- символи 1354
- формат Bitmap Distribution Format (BDF) версия 2.1
Набора символи покрива около 120 езикови набора и поддържа ISO8859-1/2/5/7/
9/13/15/16, Paratype-PT154/PT254, KOI8-R/U/E/F, Есперанто, много кодови
страници на IBM, Windows и Macintosh, а също и превдографичните символи на
VGA, vt100 и xterm.
1.1. Изисквания за компилация.
- GNU make
- Python 3.5.0+ (или node.js 6.9.0+ като алтернатива)
- само за X11: bdftopcf
- само за Windows инсталатора: GCC за Win32/i686, NSIS и patch.
1.2. Бърза инсталация.
Командите:
$ ./configure [--prefix=PREFIX]
$ make -j8
# make install fontdir
компилират и инсталират шрифтовете за Линукс конзола и X11 Window System.
Подразбиращия се префикс е /usr/local.
1.3. Легенда.
Имената на файловете са структурирани както следва:
ter-u<РАЗМЕР><СТИЛ>.bdf
където <РАЗМЕР> е височината в точки, а <СТИЛ> е n за нормален (всички
размери), b за удебелен (всички размери освен 6x12), и v за CRT VGA удебелен
(само за 8x14 и 8x16, използва 8 колона на символната матрица).
1.4. Варианти.
Някои символи са реализирани в два варианта. За да използвате алтернативния
вариант, преди инсталация изпълнете:
$ patch -p1 -i alt/<ИМЕ>.diff
Примери за разликите межда вариантите са дадени на страницата на шрифта.
Ако желаете да комбинирате hi2 с dv1 и/или ka2, приложете първо hi2, и след
това hi2-dv1 и/или hi2-ka2. Подразбиращия се вариант на юникод обхвата
2800-28FF е ориентиран към псевдографика.
1.5. Забележки.
Командите отбелязани с $ могат да се изпълняват от обикновен потребител.
Командите за конфигуриране не са задължителни.
"make -j8" изпълнява паралелно 8 задачи.
Размери 6x12, 11x22, 14x28-удебелен и 16x32-нормален са с по-лошо качество
от останалите. Избягвайте ги.
210E и 210F не са наклонени.
226A, 226B и двойно начертаните букви не са много добри.
2135 може би е грешен.
В опит да се компенсира липсващата ширина, буквите от иврит и знака шекел са
с височина на главни букви.
1.6. Алтернативни средства.
Ако изпълнимия файл на Python 3 интерпретатора е python вместо python3:
$ ./configure INT=python
За да използвате node.js вместо python (по-бавно е):
$ ./configure INT=node EXT=js
--
2. Линукс конзола.
- тежести нормален, удебелен, CRT VGA-удебелен
- кодировки ISO8859-1/ISO8859-15/Windows-1252, ISO8859-2/Windows-1250,
Windows-1251/ISO8859-5, ISO8859-9/Windows-1254, ISO8859-16,
ISO8859-7/Windows-1253, ISO8859-13/Windows-1257, IBM-437,
Bulgarian-MIK, KOI8-R, KOI8-U, Paratype-PT154, комбинирана
- формат PC Screen Font (PSF) с unicode данни
2.1. Инсталация.
$ ./configure [--prefix=ПРЕФИКС | --psfdir=ДИРЕКТОРИЯ]
$ make -j8 psf
# make install-psf
Файловете се компресират с gzip и инсталират в ДИРЕКТОРИЯ. Подразбиращата се
ДИРЕКТОРИЯ е ПРЕФИКС/share/consolefonts. За kbd може да се наложи да смените
директорията на PREFIX/lib/kbd/consolefonts или
PREFIX/share/kbd/consolefonts, в зависимост от версията на kbd.
CRT VGA-удебелените шрифтове, подходящи за само истински CRT текстови
режими, не се инсталират по подразбиране. За инсталирането им изпълнете:
$ make -j8 psf-vgaw
# make install-psf-vgaw
2.2. Използване.
За зареждане на шрифт с consoletools:
$ consolechars [-m КОДИРОВКА] -f ter-<X><РАЗМЕР><СТИЛ>
За зареждане на шрифт с kbd:
$ setfont [-m MAPPING] ter-<X><SIZE><STYLE>
където <X> е символ идентифициращ кодовата страница по списъка от т.2.4.
2.3. Кратко описание.
Командите:
$ ./configure [--prefix=ПРЕФИКС | --psfdir=ДИРЕКТОРИЯ | --psfref=ИМЕНАФАЙЛ]
# make install-psf-ref
инсталират текста от т.2.4 (на английски) под името ИМЕНАФАЙЛ (подразбира
се README.terminus) в ДИРЕКТОРИЯ.
2.4. Легенда.
имена кодировки кодови страници
ter-1* iso01, iso15, cp1252 ISO8859-1, ISO8859-15, Windows-1252
ter-2* iso02, cp1250 ISO8859-2, Windows-1250
ter-7* iso07, cp1253 ISO8859-7, Windows-1253
ter-9* iso09, cp1254 ISO8859-9, Windows-1254
ter-c* cp1251, iso05 Windows-1251, ISO8859-5
ter-d* iso13, cp1257 ISO8859-13, Windows-1257
ter-g* iso16 ISO8859-16
ter-h* cp1255, iso08 Windows-1255, ISO8859-8
ter-i* cp437 IBM-437
ter-k* koi8r KOI8-R
ter-m* mik Bulgarian-MIK
ter-p* pt154 Paratype-PT154
ter-k* koi8u KOI8-U
ter-v* всички изброени по-горе кодировки / страници и много други, около
110 езикови набора, 8 или 16 цвята за текст в зависимост от ядрото и
конзолния драйвер
имена тежест
ter-*n нормален
ter-*b удебелен
ter-*v CRT VGA-удебелен
2.5. Забележки.
Комбинираната кодова страница е базирана IBM-437 (символ 0xFF е ogonek).
ISO8859-16 шрифта включва също всички букви и акценти от Windows-1250.
--
3. X11 Window System.
- тежести нормален, удебелен
- кодировки ISO8859-1/Windows-1252, ISO8859-2, ISO8859-5, ISO8859-7,
ISO8859-9/Windows-1254, ISO8859-13, ISO8859-15, ISO8859-16,
Windows-1251, IBM-437, KOI8-R, KOI8-U, Paratype-PT154 и
ISO10646-1 (уникод)
- формат Portable Compiled Font (PCF)
3.1. Инсталация.
$ ./configure [--prefix=ПРЕФИКС | --x11dir=ДИРЕКТОРИЯ]
$ make pcf
# make install-pcf
Файловете се компресират с gzip и инсталират в ДИРЕКТОРИЯ. Подразбиращата се
ДИРЕКТОРИЯ е ПРЕФИКС/share/fonts/terminus. Изисква се bdftopcf.
Копие на нормалния 6x12 шрифт се инсталира като "удебелен", защото някои
X11 библиотеки и програми заменят липсващите удебелени шрифтове чрез
отместване на нормалните, а други изобщо не разпознават удебелена тежест,
ако такава липсва в най-малкия размер на шрифта.
За да актуализирате fonts.dir в ДИРЕКТОРИЯ след (де)инсталация, изпълнете:
# make fontdir
Конфигурационния файл, изброяващ директориите за шрифтове, трябва да включва
ДИРЕКТОРИЯ. За да се обнови списъка от шрифтове може да се наложи рестарт на
X11 сървъра.
По подразбиране се инсталира само уникод (ISO10646-1) шрифта. За инсталиране
на останалите кодови страници:
$ make -j8 pcf-8bit
# make install-pcf-8bit
3.2. Забележки.
ISO8859-1 и ISO8859-9 шрифтовете съдържат Windows Western символите и могат
да бъдат използвани съответно като Windows-1252 и Windows-1254.
--
4. Microsoft Windows.
- тежести нормален, удебелен
- кодировки Windows-1252, 1250, 1253, 1254, 1251 and 1257
- формат Font File Format версия 2.0, компилиран във FON
4.1. Инстанационен пакет.
Уверете се, че към шрифта не са прилагани корекции за варианти (т.1.4).
> cd win32
> build
Бъдете търпеливи, процеса може да отнеме няколко минути.
След това отворете terminus.nsi и го компилирайте.
4.2. Само файл с шрифта.
> copy *.bdf win32
> cd win32
> make -j8
Можете са инсталирате terminus.fon по стандартните начини.
4.3. Забележки.
Кодовите страници за Windows съдържат общо 384 символа. Всички останали
символи (математика, превдографика и т.н.) засега не са достъпни.
--
5. Често задавани въпроси.
В. Наклонена версия?
О. Не. Качеството е доста по-ниско, а и запазването ширината на символите
изисква припокриване, което не се обработва много добре от X11/Xft. Ако Ви
е много необходима, пробвайте mkitalic от FreeBSD или bdfslant от Debian.
В. Мащабируема версия?
О. Вероятно не. Шрифта използва мого хоризонтални и вертикални линии, които
са подходящш ра растерна графика, но не толкова за векторна. Може би
растерен шрифт, комплектован като TrueType.
В. Какво ще кажете за някои нови символи?
О. Пишете ми и имайте готовност да помогнете.
В. Удебеленият 6x12 шрифт...
О. ...не съществува, в матрица 6x12 няма достатъчно място за добър удебелен
шрифт. Всъщност "нормалният" шрифт е някъде по средата.
В. Шрифтът работи с X11/Motif, но не и с GNOME/KDE/Xfce.
О. Опитайте да добавите 75-yes-terminus.conf към конфигурационните файлове
на Fontconfig. За някои версии на Fontconfig, може да се наложи да замените
текста "Terminus" във файла с "xos4 Terminus", макар че е слабо вероятно.
Вижте също mkfontscale(1), mkfontdir(1), fc-cache(1), xorg.conf(5), xfs(1),
xlsfonts(1), fonts-conf(5) и т.н.
В. Моя терминален емулатор не извежда кирилица/псевдографика/...
О. Ако имате инсталирани 8-битовите кодови страници за X11, и емулатора
използва "XLFD" имена на шрифтовете, проверете дали името на завършва на
"-10616-1" вместо "-*-*".
--
6. Правна информация.
6.1. Лицензи.
Terminus Font е лицензизан под SIL Open Font License, версия 1.1.
Лицензът е включен като OFL.TXT, и е достъпен заедно с FAQ на адрес:
http://scripts.sil.org/OFL
Шрифтът включва два варианта на юникод обхвата 2800-28FF, но по никакъв
начин не поддържа Брайловата азбука.
Конфигурационните файлове, както и изходния код на python и javascript, се
разпространяват под GNU General Public License версия 2.0 или (по Ваше
усмотрение) която и да е по-късна версия.
6.2. Авторство.
Terminus Font 4.48, Copyright (C) 2019 Димитър Тошков Жеков.
Адрес за кореспонденция <dimitar.zhekov@gmail.com>
Благодаря на Антон Зиновиев, Тим Алън, Кир Колышкин, Антониос Галанопулос и
всички останали, които помогнаха.

3304
alt/ao2.diff Normal file

File diff suppressed because it is too large Load Diff

96349
alt/br1.diff Normal file

File diff suppressed because it is too large Load Diff

860
alt/dv1.diff Normal file
View File

@ -0,0 +1,860 @@
--- ./ter-u12b.bdf.orig 2019-07-28 21:07:36.104588100 +0300
+++ ./ter-u12b.bdf 2019-07-28 21:07:45.090203900 +0300
@@ -10030,3 +10030,2 @@
-E0
-90
-90
+00
+00
@@ -10034,0 +10034 @@
+F0
@@ -10070,8 +10070,8 @@
-78
-88
-88
-88
-88
-78
-08
-70
+38
+48
+48
+48
+48
+FC
+84
+00
--- ./ter-u12n.bdf.orig 2019-07-28 21:07:35.995388000 +0300
+++ ./ter-u12n.bdf 2019-07-28 21:07:45.012203800 +0300
@@ -10030,3 +10030,2 @@
-E0
-90
-90
+00
+00
@@ -10034,0 +10034 @@
+F0
@@ -10070,8 +10070,8 @@
-78
-88
-88
-88
-88
-78
-08
-70
+38
+48
+48
+48
+48
+FC
+84
+00
--- ./ter-u14b.bdf.orig 2019-07-28 21:07:36.322988500 +0300
+++ ./ter-u14b.bdf 2019-07-28 21:07:45.293004300 +0300
@@ -11082,4 +11082,3 @@
-78
-CC
-CC
-C8
+00
+00
+00
@@ -11088,0 +11088 @@
+FC
@@ -11127,9 +11127,9 @@
-7E
-C6
-C6
-C6
-C6
-C6
-7E
-06
-7C
+3E
+66
+66
+66
+66
+66
+FF
+C3
+00
--- ./ter-u14n.bdf.orig 2019-07-28 21:07:36.213788300 +0300
+++ ./ter-u14n.bdf 2019-07-28 21:07:45.199404100 +0300
@@ -11082,4 +11082,3 @@
-38
-44
-44
-48
+00
+00
+00
@@ -11088,0 +11088 @@
+7C
@@ -11127,8 +11126,0 @@
-3E
-42
-42
-42
-42
-42
-3E
-02
@@ -11135,0 +11128,8 @@
+44
+44
+44
+44
+44
+FE
+82
+00
--- ./ter-u14v.bdf.orig 2019-07-28 21:07:36.416588700 +0300
+++ ./ter-u14v.bdf 2019-07-28 21:07:45.386604400 +0300
@@ -11082,4 +11082,3 @@
-78
-CC
-CC
-C8
+00
+00
+00
@@ -11088,0 +11088 @@
+FC
@@ -11127,9 +11127,9 @@
-7E
-C6
-C6
-C6
-C6
-C6
-7E
-06
-7C
+3E
+66
+66
+66
+66
+66
+FF
+C3
+00
--- ./ter-u16b.bdf.orig 2019-07-28 21:07:36.634989100 +0300
+++ ./ter-u16b.bdf 2019-07-28 21:07:45.605004800 +0300
@@ -12134,4 +12134,3 @@
-78
-CC
-CC
-C8
+00
+00
+00
@@ -12140,0 +12140 @@
+FC
@@ -12183,10 +12183,10 @@
-7E
-C6
-C6
-C6
-C6
-C6
-7E
-06
-06
-7C
+3E
+66
+66
+66
+66
+66
+FF
+C3
+00
+00
--- ./ter-u16n.bdf.orig 2019-07-28 21:07:36.541388900 +0300
+++ ./ter-u16n.bdf 2019-07-28 21:07:45.495804600 +0300
@@ -12134,4 +12134,3 @@
-38
-44
-44
-48
+00
+00
+00
@@ -12140,0 +12140 @@
+7C
@@ -12183,9 +12182,0 @@
-3E
-42
-42
-42
-42
-42
-3E
-02
-02
@@ -12192,0 +12184,9 @@
+44
+44
+44
+44
+44
+FE
+82
+00
+00
--- ./ter-u16v.bdf.orig 2019-07-28 21:07:36.759789300 +0300
+++ ./ter-u16v.bdf 2019-07-28 21:07:45.698605000 +0300
@@ -12134,4 +12134,3 @@
-78
-CC
-CC
-C8
+00
+00
+00
@@ -12140,0 +12140 @@
+FC
@@ -12183,10 +12183,10 @@
-7E
-C6
-C6
-C6
-C6
-C6
-7E
-06
-06
-7C
+3E
+66
+66
+66
+66
+66
+FF
+C3
+00
+00
--- ./ter-u18b.bdf.orig 2019-07-28 21:07:36.993789700 +0300
+++ ./ter-u18b.bdf 2019-07-28 21:07:45.948205400 +0300
@@ -13187,5 +13187,3 @@
-3E00
-6300
-6300
-6300
-6200
+0000
+0000
+0000
@@ -13195,0 +13194,2 @@
+7F00
+6180
@@ -13240,12 +13240,12 @@
-3F80
-6180
-6180
-6180
-6180
-6180
-6180
-6180
-3F80
-0180
-0180
-3F00
+1F00
+3300
+6300
+6300
+6300
+6300
+6300
+6300
+FF80
+C180
+C180
+0000
--- ./ter-u18n.bdf.orig 2019-07-28 21:07:36.884589500 +0300
+++ ./ter-u18n.bdf 2019-07-28 21:07:45.823405200 +0300
@@ -13187,5 +13187,3 @@
-3C00
-4200
-4200
-4200
-4400
+0000
+0000
+0000
@@ -13195,0 +13194,2 @@
+7E00
+4100
@@ -13240,12 +13240,12 @@
-3F00
-4100
-4100
-4100
-4100
-4100
-4100
-4100
-3F00
-0100
-0100
-3E00
+0F00
+1100
+2100
+2100
+2100
+2100
+2100
+2100
+7F80
+4080
+4080
+0000
--- ./ter-u20b.bdf.orig 2019-07-28 21:07:37.290190200 +0300
+++ ./ter-u20b.bdf 2019-07-28 21:07:46.166605800 +0300
@@ -14239,5 +14239,4 @@
-3E00
-6300
-6300
-6300
-6200
+0000
+0000
+0000
+0000
@@ -14247,0 +14247 @@
+7F00
@@ -14297,12 +14297,12 @@
-3F80
-6180
-6180
-6180
-6180
-6180
-6180
-6180
-3F80
-0180
-0180
-3F00
+1F00
+3300
+6300
+6300
+6300
+6300
+6300
+6300
+FF80
+C180
+C180
+0000
--- ./ter-u20n.bdf.orig 2019-07-28 21:07:37.102989900 +0300
+++ ./ter-u20n.bdf 2019-07-28 21:07:46.057405600 +0300
@@ -14239,5 +14239,4 @@
-3C00
-4200
-4200
-4200
-4400
+0000
+0000
+0000
+0000
@@ -14247,0 +14247 @@
+7E00
@@ -14297,12 +14297,12 @@
-3F00
-4100
-4100
-4100
-4100
-4100
-4100
-4100
-3F00
-0100
-0100
-3E00
+0F00
+1100
+2100
+2100
+2100
+2100
+2100
+2100
+7F80
+4080
+4080
+0000
--- ./ter-u22b.bdf.orig 2019-07-28 21:07:37.524190600 +0300
+++ ./ter-u22b.bdf 2019-07-28 21:07:46.400606200 +0300
@@ -15291,8 +15291,5 @@
-3E00
-6300
-6180
-6180
-6180
-6300
-7F00
-6180
+0000
+0000
+0000
+0000
+7F80
@@ -15301,0 +15299 @@
+7F80
@@ -15303,2 +15301,4 @@
-6180
-7F00
+60C0
+60C0
+60C0
+7F80
@@ -15353,14 +15353,14 @@
-1FC0
-30C0
-60C0
-60C0
-60C0
-60C0
-60C0
-60C0
-30C0
-1FC0
-00C0
-00C0
-0180
-3F00
+1F80
+3180
+6180
+6180
+6180
+6180
+6180
+6180
+6180
+FFC0
+C0C0
+C0C0
+0000
+0000
--- ./ter-u22n.bdf.orig 2019-07-28 21:07:37.414990400 +0300
+++ ./ter-u22n.bdf 2019-07-28 21:07:46.291406000 +0300
@@ -15291,8 +15291,6 @@
-3C00
-4200
-4100
-4100
-4100
-4200
-7E00
-4100
+0000
+0000
+0000
+0000
+7F00
+4080
@@ -15300,0 +15299 @@
+7F00
@@ -15303,2 +15302,3 @@
-4100
-7E00
+4080
+4080
+7F00
@@ -15353 +15353,4 @@
-1F80
+0F80
+1080
+2080
+2080
@@ -15355,6 +15357,0 @@
-4080
-4080
-4080
-4080
-4080
-4080
@@ -15362,5 +15359,8 @@
-1F80
-0080
-0080
-0100
-3E00
+2080
+2080
+2080
+7FC0
+4040
+4040
+0000
+0000
--- ./ter-u24b.bdf.orig 2019-07-28 21:07:37.773791100 +0300
+++ ./ter-u24b.bdf 2019-07-28 21:07:46.634606600 +0300
@@ -16344,2 +16344,5 @@
-3F00
-6180
+0000
+0000
+0000
+0000
+7F80
@@ -16349,2 +16351,0 @@
-6180
-7F80
@@ -16351,0 +16353 @@
+7FC0
@@ -16356,3 +16358 @@
-6060
-60C0
-7F80
+7FC0
@@ -16410,7 +16410,11 @@
-1FE0
-3060
-6060
-6060
-6060
-6060
-6060
+0FC0
+18C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+7FE0
@@ -16419,6 +16423,2 @@
-30E0
-1FE0
-0060
-0060
-00C0
-3F80
+0000
+0000
--- ./ter-u24n.bdf.orig 2019-07-28 21:07:37.648990900 +0300
+++ ./ter-u24n.bdf 2019-07-28 21:07:46.525406400 +0300
@@ -16344,2 +16344,5 @@
-3E00
-4100
+0000
+0000
+0000
+0000
+7F00
@@ -16349,2 +16351,0 @@
-4100
-7F00
@@ -16351,0 +16353 @@
+7F80
@@ -16356,3 +16358 @@
-4040
-4080
-7F00
+7F80
@@ -16410,7 +16410,11 @@
-1FC0
-2040
-4040
-4040
-4040
-4040
-4040
+0F80
+1080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+7FC0
@@ -16419,6 +16423,2 @@
-20C0
-1F40
-0040
-0040
-0080
-3F00
+0000
+0000
--- ./ter-u28b.bdf.orig 2019-07-28 21:07:38.038991500 +0300
+++ ./ter-u28b.bdf 2019-07-28 21:07:46.915407100 +0300
@@ -18448 +18448,5 @@
-3F00
+0000
+0000
+0000
+0000
+0000
@@ -18450,5 +18453,0 @@
-61C0
-60C0
-60C0
-60C0
-6180
@@ -18456,4 +18455,6 @@
-7FE0
-6070
-6030
-6030
+6060
+6060
+6060
+7FC0
+7FC0
+6060
@@ -18463 +18463,0 @@
-6070
@@ -18523 +18523,11 @@
-1FF0
+07F0
+0FF0
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+1830
@@ -18525,16 +18535,6 @@
-7030
-6030
-6030
-6030
-6030
-6030
-6030
-6030
-7030
-3FF0
-1FF0
-0030
-0030
-0070
-3FE0
-3FC0
+7FF8
+6018
+6018
+6018
+0000
+0000
--- ./ter-u28n.bdf.orig 2019-07-28 21:07:37.914191300 +0300
+++ ./ter-u28n.bdf 2019-07-28 21:07:46.775006900 +0300
@@ -18448,4 +18448,6 @@
-3F00
-6180
-60C0
-60C0
+0000
+0000
+0000
+0000
+0000
+7F80
@@ -18452,0 +18455,3 @@
+6060
+6060
+6060
@@ -18454 +18458,0 @@
-6180
@@ -18460,4 +18463,0 @@
-6030
-6030
-6030
-6030
@@ -18523,18 +18523,18 @@
-1FF0
-3030
-6030
-6030
-6030
-6030
-6030
-6030
-6030
-6030
-6030
-3030
-1FF0
-0030
-0030
-0030
-0060
-3FC0
+07F0
+0C30
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+7FF8
+6018
+6018
+6018
+0000
+0000
--- ./ter-u32b.bdf.orig 2019-07-28 21:07:38.335392100 +0300
+++ ./ter-u32b.bdf 2019-07-28 21:07:47.289807800 +0300
@@ -20554,8 +20554,6 @@
-3FC0
-7FE0
-70F0
-7070
-7070
-7070
-7070
-70E0
+0000
+0000
+0000
+0000
+0000
+0000
@@ -20563,0 +20562 @@
+7078
@@ -20565,4 +20564,5 @@
-701C
-701C
-701C
-701C
+7038
+7038
+7FF0
+7FF8
+703C
@@ -20638 +20638,12 @@
-1FFC
+07FC
+0FFC
+1E1C
+1C1C
+1C1C
+1C1C
+1C1C
+1C1C
+1C1C
+1C1C
+1C1C
+1C1C
@@ -20640,17 +20651,6 @@
-781C
-701C
-701C
-701C
-701C
-701C
-701C
-701C
-701C
-781C
-3FFC
-1FFC
-001C
-001C
-003C
-3FF8
-3FF0
+7FFE
+700E
+700E
+700E
+700E
+0000
--- ./ter-u32n.bdf.orig 2019-07-28 21:07:38.194991800 +0300
+++ ./ter-u32n.bdf 2019-07-28 21:07:47.149407500 +0300
@@ -20554,8 +20554,6 @@
-1FC0
-3FE0
-3070
-3030
-3030
-3030
-3030
-3070
+0000
+0000
+0000
+0000
+0000
+0000
@@ -20564,0 +20563,5 @@
+3018
+3018
+3038
+3FF0
+3FF8
@@ -20568,3 +20570,0 @@
-300C
-300C
-300C
@@ -20638,19 +20638,19 @@
-0FFC
-1FFC
-380C
-300C
-300C
-300C
-300C
-300C
-300C
-300C
-300C
-380C
-1FFC
-0FFC
-000C
-000C
-001C
-1FF8
-1FF0
+07F8
+0FF8
+1C18
+1818
+1818
+1818
+1818
+1818
+1818
+1818
+1818
+1818
+3FF8
+7FFC
+600C
+600C
+600C
+600C
+0000

992
alt/ge2.diff Normal file
View File

@ -0,0 +1,992 @@
--- ./ter-u12b.bdf.orig 2019-07-28 21:07:36.104588100 +0300
+++ ./ter-u12b.bdf 2019-07-28 21:07:48.054209100 +0300
@@ -10051,4 +10051,3 @@
-F8
-80
-80
-80
+70
+08
+70
@@ -10056,0 +10056 @@
+70
@@ -10659,4 +10659,3 @@
-F8
-80
-80
-80
+70
+08
+70
@@ -10664,0 +10664 @@
+70
@@ -10998,0 +10999,3 @@
+40
+40
+70
@@ -11000,5 +11003 @@
-08
-F8
-80
-80
-80
+70
@@ -11006,0 +11006 @@
+70
--- ./ter-u12n.bdf.orig 2019-07-28 21:07:35.995388000 +0300
+++ ./ter-u12n.bdf 2019-07-28 21:07:47.976209000 +0300
@@ -10051,4 +10051,3 @@
-F8
-80
-80
-80
+70
+08
+70
@@ -10056,0 +10056 @@
+70
@@ -10659,4 +10659,3 @@
-F8
-80
-80
-80
+70
+08
+70
@@ -10664,0 +10664 @@
+70
@@ -10998,0 +10999,3 @@
+40
+40
+70
@@ -11000,5 +11003 @@
-08
-F8
-80
-80
-80
+70
@@ -11006,0 +11006 @@
+70
--- ./ter-u14b.bdf.orig 2019-07-28 21:07:36.322988500 +0300
+++ ./ter-u14b.bdf 2019-07-28 21:07:48.257009500 +0300
@@ -11106,5 +11106,4 @@
-FE
-C0
-C0
-C0
-C0
+7C
+06
+06
+7C
@@ -11112,0 +11112 @@
+7C
@@ -11778,5 +11778,4 @@
-FE
-C0
-C0
-C0
-C0
+7C
+06
+06
+7C
@@ -11784,0 +11784 @@
+7C
@@ -12153,0 +12154,3 @@
+60
+60
+7C
@@ -12156,5 +12159 @@
-FE
-C0
-C0
-C0
-C0
+7C
@@ -12162,0 +12162 @@
+7C
--- ./ter-u14n.bdf.orig 2019-07-28 21:07:36.213788300 +0300
+++ ./ter-u14n.bdf 2019-07-28 21:07:48.163409300 +0300
@@ -11106,5 +11106,4 @@
-7E
-40
-40
-40
-40
+3C
+02
+02
+3C
@@ -11112,0 +11112 @@
+3C
@@ -11778,5 +11778,4 @@
-7E
-40
-40
-40
-40
+3C
+02
+02
+3C
@@ -11784,0 +11784 @@
+3C
@@ -12153,0 +12154,3 @@
+20
+20
+3C
@@ -12156,5 +12159 @@
-7E
-40
-40
-40
-40
+3C
@@ -12162,0 +12162 @@
+3C
--- ./ter-u14v.bdf.orig 2019-07-28 21:07:36.416588700 +0300
+++ ./ter-u14v.bdf 2019-07-28 21:07:48.366209700 +0300
@@ -11106,5 +11106,4 @@
-FE
-C0
-C0
-C0
-C0
+7C
+06
+06
+7C
@@ -11112,0 +11112 @@
+7C
@@ -11778,5 +11778,4 @@
-FE
-C0
-C0
-C0
-C0
+7C
+06
+06
+7C
@@ -11784,0 +11784 @@
+7C
@@ -12153,0 +12154,3 @@
+60
+60
+7C
@@ -12156,5 +12159 @@
-FE
-C0
-C0
-C0
-C0
+7C
@@ -12162,0 +12162 @@
+7C
--- ./ter-u16b.bdf.orig 2019-07-28 21:07:36.634989100 +0300
+++ ./ter-u16b.bdf 2019-07-28 21:07:48.553410000 +0300
@@ -12160,5 +12160,4 @@
-FE
-C0
-C0
-C0
-C0
+7C
+06
+06
+7C
@@ -12166,0 +12166 @@
+7C
@@ -12896,5 +12896,4 @@
-FE
-C0
-C0
-C0
-C0
+7C
+06
+06
+7C
@@ -12902,0 +12902 @@
+7C
@@ -13307,0 +13308,3 @@
+60
+60
+7C
@@ -13310,5 +13313 @@
-FE
-C0
-C0
-C0
-C0
+7C
@@ -13316,0 +13316 @@
+7C
--- ./ter-u16n.bdf.orig 2019-07-28 21:07:36.541388900 +0300
+++ ./ter-u16n.bdf 2019-07-28 21:07:48.459809800 +0300
@@ -12160,5 +12160,4 @@
-7E
-40
-40
-40
-40
+3C
+02
+02
+3C
@@ -12166,0 +12166 @@
+3C
@@ -12896,5 +12896,4 @@
-7E
-40
-40
-40
-40
+3C
+02
+02
+3C
@@ -12902,0 +12902 @@
+3C
@@ -13307,0 +13308,3 @@
+20
+20
+3C
@@ -13310,5 +13313 @@
-7E
-40
-40
-40
-40
+3C
@@ -13316,0 +13316 @@
+3C
--- ./ter-u16v.bdf.orig 2019-07-28 21:07:36.759789300 +0300
+++ ./ter-u16v.bdf 2019-07-28 21:07:48.662610200 +0300
@@ -12160,5 +12160,4 @@
-FE
-C0
-C0
-C0
-C0
+7C
+06
+06
+7C
@@ -12166,0 +12166 @@
+7C
@@ -12896,5 +12896,4 @@
-FE
-C0
-C0
-C0
-C0
+7C
+06
+06
+7C
@@ -12902,0 +12902 @@
+7C
@@ -13307,0 +13308,3 @@
+60
+60
+7C
@@ -13310,5 +13313 @@
-FE
-C0
-C0
-C0
-C0
+7C
@@ -13316,0 +13316 @@
+7C
--- ./ter-u18b.bdf.orig 2019-07-28 21:07:36.993789700 +0300
+++ ./ter-u18b.bdf 2019-07-28 21:07:48.881010600 +0300
@@ -13215,6 +13215,5 @@
-7F80
-6000
-6000
-6000
-6000
-6000
+3F00
+0180
+0180
+0180
+3F00
@@ -13223,0 +13223 @@
+3F00
@@ -14015,6 +14015,5 @@
-7F80
-6000
-6000
-6000
-6000
-6000
+3F00
+0180
+0180
+0180
+3F00
@@ -14023,0 +14023 @@
+3F00
@@ -14462,0 +14463,3 @@
+3000
+3000
+3F00
@@ -14465,6 +14468,2 @@
-7F80
-6000
-6000
-6000
-6000
-6000
+0180
+3F00
@@ -14473,0 +14473 @@
+3F00
--- ./ter-u18n.bdf.orig 2019-07-28 21:07:36.884589500 +0300
+++ ./ter-u18n.bdf 2019-07-28 21:07:48.771810400 +0300
@@ -13215,6 +13215,5 @@
-7F00
-4000
-4000
-4000
-4000
-4000
+3E00
+0100
+0100
+0100
+3E00
@@ -13223,0 +13223 @@
+3E00
@@ -14015,6 +14015,5 @@
-7F00
-4000
-4000
-4000
-4000
-4000
+3E00
+0100
+0100
+0100
+3E00
@@ -14023,0 +14023 @@
+3E00
@@ -14462,0 +14463,3 @@
+2000
+2000
+3E00
@@ -14465,6 +14468,2 @@
-7F00
-4000
-4000
-4000
-4000
-4000
+0100
+3E00
@@ -14473,0 +14473 @@
+3E00
--- ./ter-u20b.bdf.orig 2019-07-28 21:07:37.290190200 +0300
+++ ./ter-u20b.bdf 2019-07-28 21:07:49.115011000 +0300
@@ -14270,6 +14270,5 @@
-7F80
-6000
-6000
-6000
-6000
-6000
+3F00
+0180
+0180
+0180
+3F00
@@ -14278,0 +14278 @@
+3F00
@@ -15134,6 +15134,5 @@
-7F80
-6000
-6000
-6000
-6000
-6000
+3F00
+0180
+0180
+0180
+3F00
@@ -15142,0 +15142 @@
+3F00
@@ -15617,0 +15618,3 @@
+3000
+3000
+3F00
@@ -15620,6 +15623,2 @@
-7F80
-6000
-6000
-6000
-6000
-6000
+0180
+3F00
@@ -15628,0 +15628 @@
+3F00
--- ./ter-u20n.bdf.orig 2019-07-28 21:07:37.102989900 +0300
+++ ./ter-u20n.bdf 2019-07-28 21:07:48.990210800 +0300
@@ -14270,6 +14270,5 @@
-7F00
-4000
-4000
-4000
-4000
-4000
+3E00
+0100
+0100
+0100
+3E00
@@ -14278,0 +14278 @@
+3E00
@@ -15134,6 +15134,5 @@
-7F00
-4000
-4000
-4000
-4000
-4000
+3E00
+0100
+0100
+0100
+3E00
@@ -15142,0 +15142 @@
+3E00
@@ -15617,0 +15618,3 @@
+2000
+2000
+3E00
@@ -15620,6 +15623,2 @@
-7F00
-4000
-4000
-4000
-4000
-4000
+0100
+3E00
@@ -15628,0 +15628 @@
+3E00
--- ./ter-u22b.bdf.orig 2019-07-28 21:07:37.524190600 +0300
+++ ./ter-u22b.bdf 2019-07-28 21:07:49.349011400 +0300
@@ -15324,6 +15324,5 @@
-7FC0
-6000
-6000
-6000
-6000
-6000
+3F80
+00C0
+00C0
+00C0
+3F80
@@ -15333,0 +15333 @@
+3F80
@@ -16252,6 +16252,5 @@
-7FC0
-6000
-6000
-6000
-6000
-6000
+3F80
+00C0
+00C0
+00C0
+3F80
@@ -16261,0 +16261 @@
+3F80
@@ -16770,0 +16771,4 @@
+3000
+3000
+3000
+3F80
@@ -16774,6 +16778 @@
-7FC0
-6000
-6000
-6000
-6000
-6000
+3F80
@@ -16783,0 +16783 @@
+3F80
--- ./ter-u22n.bdf.orig 2019-07-28 21:07:37.414990400 +0300
+++ ./ter-u22n.bdf 2019-07-28 21:07:49.224211200 +0300
@@ -15324,6 +15324,5 @@
-7F80
-4000
-4000
-4000
-4000
-4000
+3F00
+0080
+0080
+0080
+3F00
@@ -15333,0 +15333 @@
+3F00
@@ -16252,6 +16252,5 @@
-7F80
-4000
-4000
-4000
-4000
-4000
+3F00
+0080
+0080
+0080
+3F00
@@ -16261,0 +16261 @@
+3F00
@@ -16770,0 +16771,4 @@
+2000
+2000
+2000
+3F00
@@ -16774,6 +16778 @@
-7F80
-4000
-4000
-4000
-4000
-4000
+3F00
@@ -16783,0 +16783 @@
+3F00
--- ./ter-u24b.bdf.orig 2019-07-28 21:07:37.773791100 +0300
+++ ./ter-u24b.bdf 2019-07-28 21:07:49.583011800 +0300
@@ -16379,7 +16379,6 @@
-7FE0
-6000
-6000
-6000
-6000
-6000
-6000
+3FC0
+0060
+0060
+0060
+0060
+3FC0
@@ -16389,0 +16389 @@
+3FC0
@@ -17371,7 +17371,6 @@
-7FE0
-6000
-6000
-6000
-6000
-6000
-6000
+3FC0
+0060
+0060
+0060
+0060
+3FC0
@@ -17381,0 +17381 @@
+3FC0
@@ -17925,0 +17926,4 @@
+3000
+3000
+3000
+3FC0
@@ -17929,7 +17933,2 @@
-7FE0
-6000
-6000
-6000
-6000
-6000
-6000
+0060
+3FC0
@@ -17939,0 +17939 @@
+3FC0
--- ./ter-u24n.bdf.orig 2019-07-28 21:07:37.648990900 +0300
+++ ./ter-u24n.bdf 2019-07-28 21:07:49.458211600 +0300
@@ -16379,7 +16379,6 @@
-7FC0
-4000
-4000
-4000
-4000
-4000
-4000
+3F80
+0040
+0040
+0040
+0040
+3F80
@@ -16389,0 +16389 @@
+3F80
@@ -17371,7 +17371,6 @@
-7FC0
-4000
-4000
-4000
-4000
-4000
-4000
+3F80
+0040
+0040
+0040
+0040
+3F80
@@ -17381,0 +17381 @@
+3F80
@@ -17925,0 +17926,4 @@
+2000
+2000
+2000
+3F80
@@ -17929,7 +17933,2 @@
-7FC0
-4000
-4000
-4000
-4000
-4000
-4000
+0040
+3F80
@@ -17939,0 +17939 @@
+3F80
--- ./ter-u28b.bdf.orig 2019-07-28 21:07:38.038991500 +0300
+++ ./ter-u28b.bdf 2019-07-28 21:07:49.863812300 +0300
@@ -18488,11 +18488,8 @@
-7FF0
-7FF0
-6000
-6000
-6000
-6000
-6000
-6000
-6000
-6000
-6000
+3FC0
+3FE0
+0070
+0030
+0030
+1FE0
+3FC0
+7000
@@ -18500,0 +18498,3 @@
+7000
+3FE0
+1FE0
@@ -19608,11 +19608,8 @@
-7FF0
-7FF0
-6000
-6000
-6000
-6000
-6000
-6000
-6000
-6000
-6000
+3FC0
+3FE0
+0070
+0030
+0030
+1FE0
+3FC0
+7000
@@ -19620,0 +19618,3 @@
+7000
+3FE0
+1FE0
@@ -20234,0 +20235,6 @@
+3000
+3000
+3000
+3FC0
+3FE0
+0070
@@ -20237,12 +20243,3 @@
-0030
-7FF0
-7FF0
-6000
-6000
-6000
-6000
-6000
-6000
-6000
-6000
-6000
+1FE0
+3FC0
+7000
@@ -20250,0 +20248,3 @@
+7000
+3FE0
+1FE0
--- ./ter-u28n.bdf.orig 2019-07-28 21:07:37.914191300 +0300
+++ ./ter-u28n.bdf 2019-07-28 21:07:49.723412100 +0300
@@ -18488,10 +18488,8 @@
-7FF0
-6000
-6000
-6000
-6000
-6000
-6000
-6000
-6000
-6000
+3FC0
+0060
+0030
+0030
+0030
+0060
+1FC0
+3000
@@ -18500,0 +18499,2 @@
+3000
+1FE0
@@ -19608,10 +19608,8 @@
-7FF0
-6000
-6000
-6000
-6000
-6000
-6000
-6000
-6000
-6000
+3FC0
+0060
+0030
+0030
+0030
+0060
+1FC0
+3000
@@ -19620,0 +19619,2 @@
+3000
+1FE0
@@ -20234,0 +20235,5 @@
+3000
+3000
+3000
+3FC0
+0060
@@ -20238,10 +20243,3 @@
-7FF0
-6000
-6000
-6000
-6000
-6000
-6000
-6000
-6000
-6000
+0060
+1FC0
+3000
@@ -20250,0 +20249,2 @@
+3000
+1FE0
--- ./ter-u32b.bdf.orig 2019-07-28 21:07:38.335392100 +0300
+++ ./ter-u32b.bdf 2019-07-28 21:07:50.160212800 +0300
@@ -20599,12 +20599,9 @@
-7FFC
-7FFC
-7000
-7000
-7000
-7000
-7000
-7000
-7000
-7000
-7000
-7000
+3FF0
+3FF8
+003C
+001C
+001C
+003C
+1FF8
+3FF0
+7800
@@ -20612,0 +20610,3 @@
+7800
+3FF8
+1FF8
@@ -21847,12 +21847,9 @@
-7FFC
-7FFC
-7000
-7000
-7000
-7000
-7000
-7000
-7000
-7000
-7000
-7000
+3FF0
+3FF8
+003C
+001C
+001C
+003C
+1FF8
+3FF0
+7800
@@ -21860,0 +21858,3 @@
+7800
+3FF8
+1FF8
@@ -22544,0 +22545,7 @@
+3800
+3800
+3800
+3800
+3FF0
+3FF8
+003C
@@ -22547,14 +22554,4 @@
-001C
-001C
-7FFC
-7FFC
-7000
-7000
-7000
-7000
-7000
-7000
-7000
-7000
-7000
-7000
+003C
+1FF8
+3FF0
+7800
@@ -22562,0 +22560,3 @@
+7800
+3FF8
+1FF8
--- ./ter-u32n.bdf.orig 2019-07-28 21:07:38.194991800 +0300
+++ ./ter-u32n.bdf 2019-07-28 21:07:50.004212600 +0300
@@ -20599,12 +20599,9 @@
-3FFC
-3FFC
-3000
-3000
-3000
-3000
-3000
-3000
-3000
-3000
-3000
-3000
+1FF0
+1FF8
+001C
+000C
+000C
+001C
+0FF8
+1FF0
+3800
@@ -20612,0 +20610,3 @@
+3800
+1FF8
+0FF8
@@ -21847,12 +21847,9 @@
-3FFC
-3FFC
-3000
-3000
-3000
-3000
-3000
-3000
-3000
-3000
-3000
-3000
+1FF0
+1FF8
+001C
+000C
+000C
+001C
+0FF8
+1FF0
+3800
@@ -21860,0 +21858,3 @@
+3800
+1FF8
+0FF8
@@ -22544,0 +22545,7 @@
+1800
+1800
+1800
+1800
+1FF0
+1FF8
+001C
@@ -22547,14 +22554,4 @@
-000C
-000C
-3FFC
-3FFC
-3000
-3000
-3000
-3000
-3000
-3000
-3000
-3000
-3000
-3000
+001C
+0FF8
+1FF0
+3800
@@ -22562,0 +22560,3 @@
+3800
+1FF8
+0FF8

304
alt/gq2.diff Normal file
View File

@ -0,0 +1,304 @@
--- ./ter-u12b.bdf.orig 2019-07-28 21:07:36.104588100 +0300
+++ ./ter-u12b.bdf 2019-07-28 21:07:50.940214200 +0300
@@ -189 +189 @@
-20
+40
@@ -1269,3 +1268,0 @@
-40
-20
-00
@@ -1272,0 +1270,3 @@
+20
+20
+10
--- ./ter-u12n.bdf.orig 2019-07-28 21:07:35.995388000 +0300
+++ ./ter-u12n.bdf 2019-07-28 21:07:50.846614000 +0300
@@ -189 +189 @@
-20
+40
@@ -1269,3 +1268,0 @@
-40
-20
-00
@@ -1272,0 +1270,3 @@
+20
+20
+10
--- ./ter-u14b.bdf.orig 2019-07-28 21:07:36.322988500 +0300
+++ ./ter-u14b.bdf 2019-07-28 21:07:51.158614600 +0300
@@ -205 +205 @@
-18
+30
@@ -1398,0 +1399,2 @@
+00
+30
@@ -1401,2 +1402,0 @@
-00
-00
--- ./ter-u14n.bdf.orig 2019-07-28 21:07:36.213788300 +0300
+++ ./ter-u14n.bdf 2019-07-28 21:07:51.049414400 +0300
@@ -203,2 +203,2 @@
-10
-10
+08
+08
@@ -1398,0 +1399,2 @@
+00
+10
@@ -1401,2 +1402,0 @@
-00
-00
--- ./ter-u14v.bdf.orig 2019-07-28 21:07:36.416588700 +0300
+++ ./ter-u14v.bdf 2019-07-28 21:07:51.252214800 +0300
@@ -205 +205 @@
-18
+30
@@ -1398,0 +1399,2 @@
+00
+30
@@ -1401,2 +1402,0 @@
-00
-00
--- ./ter-u16b.bdf.orig 2019-07-28 21:07:36.634989100 +0300
+++ ./ter-u16b.bdf 2019-07-28 21:07:51.470615100 +0300
@@ -221 +221 @@
-18
+30
@@ -1528,0 +1529,2 @@
+00
+30
@@ -1531,2 +1532,0 @@
-00
-00
--- ./ter-u16n.bdf.orig 2019-07-28 21:07:36.541388900 +0300
+++ ./ter-u16n.bdf 2019-07-28 21:07:51.361414900 +0300
@@ -219,2 +219,2 @@
-10
-10
+08
+08
@@ -1528,0 +1529,2 @@
+00
+10
@@ -1531,2 +1532,0 @@
-00
-00
--- ./ter-u16v.bdf.orig 2019-07-28 21:07:36.759789300 +0300
+++ ./ter-u16v.bdf 2019-07-28 21:07:51.564215300 +0300
@@ -221 +221 @@
-18
+30
@@ -1528,0 +1529,2 @@
+00
+30
@@ -1531,2 +1532,0 @@
-00
-00
--- ./ter-u18b.bdf.orig 2019-07-28 21:07:36.993789700 +0300
+++ ./ter-u18b.bdf 2019-07-28 21:07:51.813815700 +0300
@@ -238 +238 @@
-0C00
+1800
@@ -1658,0 +1659,3 @@
+0000
+1800
+1800
@@ -1661,3 +1663,0 @@
-0000
-0000
-0000
--- ./ter-u18n.bdf.orig 2019-07-28 21:07:36.884589500 +0300
+++ ./ter-u18n.bdf 2019-07-28 21:07:51.704615500 +0300
@@ -238 +238 @@
-0800
+1000
@@ -1658,0 +1659,3 @@
+0000
+1000
+1000
@@ -1661,3 +1663,0 @@
-0000
-0000
-0000
--- ./ter-u20b.bdf.orig 2019-07-28 21:07:37.290190200 +0300
+++ ./ter-u20b.bdf 2019-07-28 21:07:52.079016200 +0300
@@ -254 +254 @@
-0C00
+1800
@@ -1788,0 +1789,3 @@
+0000
+1800
+1800
@@ -1791,3 +1793,0 @@
-0000
-0000
-0000
--- ./ter-u20n.bdf.orig 2019-07-28 21:07:37.102989900 +0300
+++ ./ter-u20n.bdf 2019-07-28 21:07:51.923015900 +0300
@@ -254 +254 @@
-0800
+1000
@@ -1788,0 +1789,3 @@
+0000
+1000
+1000
@@ -1791,3 +1793,0 @@
-0000
-0000
-0000
--- ./ter-u22b.bdf.orig 2019-07-28 21:07:37.524190600 +0300
+++ ./ter-u22b.bdf 2019-07-28 21:07:52.313016600 +0300
@@ -267,4 +267,4 @@
-0C00
-0C00
-0C00
-0C00
+0600
+0600
+0600
+0600
@@ -1919 +1919,4 @@
-1800
+0000
+0C00
+0C00
+0C00
@@ -1922,3 +1924,0 @@
-0000
-0000
-0000
--- ./ter-u22n.bdf.orig 2019-07-28 21:07:37.414990400 +0300
+++ ./ter-u22n.bdf 2019-07-28 21:07:52.203816400 +0300
@@ -271 +271 @@
-0400
+0800
@@ -1919,5 +1918,0 @@
-1000
-0800
-0400
-0000
-0000
@@ -1924,0 +1920,5 @@
+0400
+0400
+0400
+0400
+0200
--- ./ter-u24b.bdf.orig 2019-07-28 21:07:37.773791100 +0300
+++ ./ter-u24b.bdf 2019-07-28 21:07:52.562617100 +0300
@@ -288 +288 @@
-0600
+0C00
@@ -2049,5 +2048,0 @@
-1800
-0C00
-0600
-0000
-0000
@@ -2055,0 +2051,5 @@
+0600
+0600
+0600
+0600
+0300
--- ./ter-u24n.bdf.orig 2019-07-28 21:07:37.648990900 +0300
+++ ./ter-u24n.bdf 2019-07-28 21:07:52.437816800 +0300
@@ -288 +288 @@
-0400
+0800
@@ -2049,5 +2048,0 @@
-1000
-0800
-0400
-0000
-0000
@@ -2055,0 +2051,5 @@
+0400
+0400
+0400
+0400
+0200
--- ./ter-u28b.bdf.orig 2019-07-28 21:07:38.038991500 +0300
+++ ./ter-u28b.bdf 2019-07-28 21:07:52.827817500 +0300
@@ -320,2 +320,2 @@
-0300
-0300
+0600
+0600
@@ -2309,6 +2308,0 @@
-1C00
-0E00
-0700
-0000
-0000
-0000
@@ -2316,0 +2311,6 @@
+0600
+0600
+0600
+0600
+0300
+0300
--- ./ter-u28n.bdf.orig 2019-07-28 21:07:37.914191300 +0300
+++ ./ter-u28n.bdf 2019-07-28 21:07:52.687417300 +0300
@@ -320,2 +320,2 @@
-0300
-0300
+0600
+0600
@@ -2309,6 +2308,0 @@
-0C00
-0600
-0300
-0000
-0000
-0000
@@ -2316,0 +2311,6 @@
+0600
+0600
+0600
+0600
+0300
+0300
--- ./ter-u32b.bdf.orig 2019-07-28 21:07:38.335392100 +0300
+++ ./ter-u32b.bdf 2019-07-28 21:07:53.124218000 +0300
@@ -354,2 +354,2 @@
-0380
-0380
+0700
+0700
@@ -2570,6 +2569,0 @@
-1C00
-0E00
-0700
-0380
-0000
-0000
@@ -2578,0 +2573,6 @@
+0380
+0380
+0380
+0380
+01C0
+01C0
--- ./ter-u32n.bdf.orig 2019-07-28 21:07:38.194991800 +0300
+++ ./ter-u32n.bdf 2019-07-28 21:07:52.968217800 +0300
@@ -354,2 +354,2 @@
-0180
-0180
+0300
+0300
@@ -2570,6 +2569,0 @@
-0E00
-0700
-0380
-01C0
-0000
-0000
@@ -2578,0 +2573,6 @@
+0180
+0180
+0180
+0180
+00C0
+00C0

860
alt/hi2-dv1.diff Normal file
View File

@ -0,0 +1,860 @@
--- ./ter-u12b.bdf.orig 2019-07-28 21:08:05.760240200 +0300
+++ ./ter-u12b.bdf 2019-07-28 21:08:09.036246000 +0300
@@ -10030,3 +10030,2 @@
-E0
-90
-90
+00
+00
@@ -10034,0 +10034 @@
+F0
@@ -10070,8 +10070,8 @@
-78
-88
-88
-88
-88
-78
-08
-70
+38
+48
+48
+48
+48
+FC
+84
+00
--- ./ter-u12n.bdf.orig 2019-07-28 21:08:05.666640100 +0300
+++ ./ter-u12n.bdf 2019-07-28 21:08:08.942645800 +0300
@@ -10030,3 +10030,2 @@
-E0
-90
-90
+00
+00
@@ -10034,0 +10034 @@
+F0
@@ -10070,8 +10070,8 @@
-78
-88
-88
-88
-88
-78
-08
-70
+38
+48
+48
+48
+48
+FC
+84
+00
--- ./ter-u14b.bdf.orig 2019-07-28 21:08:05.963040600 +0300
+++ ./ter-u14b.bdf 2019-07-28 21:08:09.239046300 +0300
@@ -11082,4 +11082,3 @@
-78
-CC
-CC
-C8
+00
+00
+00
@@ -11088,0 +11088 @@
+FC
@@ -11127,9 +11127,9 @@
-7E
-C6
-C6
-C6
-C6
-C6
-7E
-06
-7C
+3E
+66
+66
+66
+66
+66
+FF
+C3
+00
--- ./ter-u14n.bdf.orig 2019-07-28 21:08:05.853840400 +0300
+++ ./ter-u14n.bdf 2019-07-28 21:08:09.145446200 +0300
@@ -11082,4 +11082,3 @@
-38
-44
-44
-48
+00
+00
+00
@@ -11088,0 +11088 @@
+7C
@@ -11127,8 +11126,0 @@
-3E
-42
-42
-42
-42
-42
-3E
-02
@@ -11135,0 +11128,8 @@
+44
+44
+44
+44
+44
+FE
+82
+00
--- ./ter-u14v.bdf.orig 2019-07-28 21:08:06.056640800 +0300
+++ ./ter-u14v.bdf 2019-07-28 21:08:09.332646500 +0300
@@ -11082,4 +11082,3 @@
-78
-CC
-CC
-C8
+00
+00
+00
@@ -11088,0 +11088 @@
+FC
@@ -11127,9 +11127,9 @@
-7E
-C6
-C6
-C6
-C6
-C6
-7E
-06
-7C
+3E
+66
+66
+66
+66
+66
+FF
+C3
+00
--- ./ter-u16b.bdf.orig 2019-07-28 21:08:06.259441100 +0300
+++ ./ter-u16b.bdf 2019-07-28 21:08:09.535446900 +0300
@@ -12134,4 +12134,3 @@
-78
-CC
-CC
-C8
+00
+00
+00
@@ -12140,0 +12140 @@
+FC
@@ -12183,10 +12183,10 @@
-7E
-C6
-C6
-C6
-C6
-C6
-7E
-06
-06
-7C
+3E
+66
+66
+66
+66
+66
+FF
+C3
+00
+00
--- ./ter-u16n.bdf.orig 2019-07-28 21:08:06.165840900 +0300
+++ ./ter-u16n.bdf 2019-07-28 21:08:09.426246700 +0300
@@ -12134,4 +12134,3 @@
-38
-44
-44
-48
+00
+00
+00
@@ -12140,0 +12140 @@
+7C
@@ -12183,9 +12182,0 @@
-3E
-42
-42
-42
-42
-42
-3E
-02
-02
@@ -12192,0 +12184,9 @@
+44
+44
+44
+44
+44
+FE
+82
+00
+00
--- ./ter-u16v.bdf.orig 2019-07-28 21:08:06.353041300 +0300
+++ ./ter-u16v.bdf 2019-07-28 21:08:09.629047000 +0300
@@ -12134,4 +12134,3 @@
-78
-CC
-CC
-C8
+00
+00
+00
@@ -12140,0 +12140 @@
+FC
@@ -12183,10 +12183,10 @@
-7E
-C6
-C6
-C6
-C6
-C6
-7E
-06
-06
-7C
+3E
+66
+66
+66
+66
+66
+FF
+C3
+00
+00
--- ./ter-u18b.bdf.orig 2019-07-28 21:08:06.587041700 +0300
+++ ./ter-u18b.bdf 2019-07-28 21:08:09.863047400 +0300
@@ -13186,5 +13186,4 @@
-3E00
-6300
-6300
-6300
-6200
+0000
+0000
+0000
+0000
@@ -13194,0 +13194 @@
+7F00
@@ -13240,12 +13240,12 @@
-3F80
-6180
-6180
-6180
-6180
-6180
-6180
-6180
-3F80
-0180
-0180
-3F00
+1F00
+3300
+6300
+6300
+6300
+6300
+6300
+6300
+FF80
+C180
+C180
+0000
--- ./ter-u18n.bdf.orig 2019-07-28 21:08:06.477841500 +0300
+++ ./ter-u18n.bdf 2019-07-28 21:08:09.738247200 +0300
@@ -13186,5 +13186,4 @@
-3C00
-4200
-4200
-4200
-4400
+0000
+0000
+0000
+0000
@@ -13194,0 +13194 @@
+7E00
@@ -13240,12 +13240,12 @@
-3F00
-4100
-4100
-4100
-4100
-4100
-4100
-4100
-3F00
-0100
-0100
-3E00
+0F00
+1100
+2100
+2100
+2100
+2100
+2100
+2100
+7F80
+4080
+4080
+0000
--- ./ter-u20b.bdf.orig 2019-07-28 21:08:06.821042100 +0300
+++ ./ter-u20b.bdf 2019-07-28 21:08:10.081447800 +0300
@@ -14239,5 +14239,4 @@
-3E00
-6300
-6300
-6300
-6200
+0000
+0000
+0000
+0000
@@ -14247,0 +14247 @@
+7F00
@@ -14297,12 +14297,12 @@
-3F80
-6180
-6180
-6180
-6180
-6180
-6180
-6180
-3F80
-0180
-0180
-3F00
+1F00
+3300
+6300
+6300
+6300
+6300
+6300
+6300
+FF80
+C180
+C180
+0000
--- ./ter-u20n.bdf.orig 2019-07-28 21:08:06.711841900 +0300
+++ ./ter-u20n.bdf 2019-07-28 21:08:09.972247600 +0300
@@ -14239,5 +14239,4 @@
-3C00
-4200
-4200
-4200
-4400
+0000
+0000
+0000
+0000
@@ -14247,0 +14247 @@
+7E00
@@ -14297,12 +14297,12 @@
-3F00
-4100
-4100
-4100
-4100
-4100
-4100
-4100
-3F00
-0100
-0100
-3E00
+0F00
+1100
+2100
+2100
+2100
+2100
+2100
+2100
+7F80
+4080
+4080
+0000
--- ./ter-u22b.bdf.orig 2019-07-28 21:08:07.055042500 +0300
+++ ./ter-u22b.bdf 2019-07-28 21:08:10.331048300 +0300
@@ -15291,8 +15291,5 @@
-3E00
-6300
-6180
-6180
-6180
-6300
-7F00
-6180
+0000
+0000
+0000
+0000
+7F80
@@ -15301,0 +15299 @@
+7F80
@@ -15303,2 +15301,4 @@
-6180
-7F00
+60C0
+60C0
+60C0
+7F80
@@ -15353,14 +15353,14 @@
-1FC0
-30C0
-60C0
-60C0
-60C0
-60C0
-60C0
-60C0
-30C0
-1FC0
-00C0
-00C0
-0180
-3F00
+1F80
+3180
+6180
+6180
+6180
+6180
+6180
+6180
+6180
+FFC0
+C0C0
+C0C0
+0000
+0000
--- ./ter-u22n.bdf.orig 2019-07-28 21:08:06.930242300 +0300
+++ ./ter-u22n.bdf 2019-07-28 21:08:10.206248000 +0300
@@ -15291,8 +15291,6 @@
-3C00
-4200
-4100
-4100
-4100
-4200
-7E00
-4100
+0000
+0000
+0000
+0000
+7F00
+4080
@@ -15300,0 +15299 @@
+7F00
@@ -15303,2 +15302,3 @@
-4100
-7E00
+4080
+4080
+7F00
@@ -15353 +15353,4 @@
-1F80
+0F80
+1080
+2080
+2080
@@ -15355,6 +15357,0 @@
-4080
-4080
-4080
-4080
-4080
-4080
@@ -15362,5 +15359,8 @@
-1F80
-0080
-0080
-0100
-3E00
+2080
+2080
+2080
+7FC0
+4040
+4040
+0000
+0000
--- ./ter-u24b.bdf.orig 2019-07-28 21:08:07.289042900 +0300
+++ ./ter-u24b.bdf 2019-07-28 21:08:10.565048700 +0300
@@ -16344,2 +16344,5 @@
-3F00
-6180
+0000
+0000
+0000
+0000
+7F80
@@ -16349,2 +16351,0 @@
-6180
-7F80
@@ -16351,0 +16353 @@
+7FC0
@@ -16356,3 +16358 @@
-6060
-60C0
-7F80
+7FC0
@@ -16410,7 +16410,11 @@
-1FE0
-3060
-6060
-6060
-6060
-6060
-6060
+0FC0
+18C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+30C0
+7FE0
@@ -16419,6 +16423,2 @@
-30E0
-1FE0
-0060
-0060
-00C0
-3F80
+0000
+0000
--- ./ter-u24n.bdf.orig 2019-07-28 21:08:07.164242700 +0300
+++ ./ter-u24n.bdf 2019-07-28 21:08:10.440248500 +0300
@@ -16344,2 +16344,5 @@
-3E00
-4100
+0000
+0000
+0000
+0000
+7F00
@@ -16349,2 +16351,0 @@
-4100
-7F00
@@ -16351,0 +16353 @@
+7F80
@@ -16356,3 +16358 @@
-4040
-4080
-7F00
+7F80
@@ -16410,7 +16410,11 @@
-1FC0
-2040
-4040
-4040
-4040
-4040
-4040
+0F80
+1080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+7FC0
@@ -16419,6 +16423,2 @@
-20C0
-1F40
-0040
-0040
-0080
-3F00
+0000
+0000
--- ./ter-u28b.bdf.orig 2019-07-28 21:08:07.616643500 +0300
+++ ./ter-u28b.bdf 2019-07-28 21:08:10.845849200 +0300
@@ -18448 +18448,5 @@
-3F00
+0000
+0000
+0000
+0000
+0000
@@ -18450,5 +18453,0 @@
-61C0
-60C0
-60C0
-60C0
-6180
@@ -18456,4 +18455,6 @@
-7FE0
-6070
-6030
-6030
+6060
+6060
+6060
+7FC0
+7FC0
+6060
@@ -18463 +18463,0 @@
-6070
@@ -18523 +18523,11 @@
-1FF0
+07F0
+0FF0
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+1830
@@ -18525,16 +18535,6 @@
-7030
-6030
-6030
-6030
-6030
-6030
-6030
-6030
-7030
-3FF0
-1FF0
-0030
-0030
-0070
-3FE0
-3FC0
+7FF8
+6018
+6018
+6018
+0000
+0000
--- ./ter-u28n.bdf.orig 2019-07-28 21:08:07.413843100 +0300
+++ ./ter-u28n.bdf 2019-07-28 21:08:10.705448900 +0300
@@ -18448,4 +18448,6 @@
-3F00
-6180
-60C0
-60C0
+0000
+0000
+0000
+0000
+0000
+7F80
@@ -18452,0 +18455,3 @@
+6060
+6060
+6060
@@ -18454 +18458,0 @@
-6180
@@ -18460,4 +18463,0 @@
-6030
-6030
-6030
-6030
@@ -18523,18 +18523,18 @@
-1FF0
-3030
-6030
-6030
-6030
-6030
-6030
-6030
-6030
-6030
-6030
-3030
-1FF0
-0030
-0030
-0030
-0060
-3FC0
+07F0
+0C30
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+1830
+7FF8
+6018
+6018
+6018
+0000
+0000
--- ./ter-u32b.bdf.orig 2019-07-28 21:08:07.913044000 +0300
+++ ./ter-u32b.bdf 2019-07-28 21:08:11.142249700 +0300
@@ -20554,8 +20554,6 @@
-3FC0
-7FE0
-70F0
-7070
-7070
-7070
-7070
-70E0
+0000
+0000
+0000
+0000
+0000
+0000
@@ -20563,0 +20562 @@
+7078
@@ -20565,4 +20564,5 @@
-701C
-701C
-701C
-701C
+7038
+7038
+7FF0
+7FF8
+703C
@@ -20638 +20638,12 @@
-1FFC
+07FC
+0FFC
+1E1C
+1C1C
+1C1C
+1C1C
+1C1C
+1C1C
+1C1C
+1C1C
+1C1C
+1C1C
@@ -20640,17 +20651,6 @@
-781C
-701C
-701C
-701C
-701C
-701C
-701C
-701C
-701C
-781C
-3FFC
-1FFC
-001C
-001C
-003C
-3FF8
-3FF0
+7FFE
+700E
+700E
+700E
+700E
+0000
--- ./ter-u32n.bdf.orig 2019-07-28 21:08:07.757043700 +0300
+++ ./ter-u32n.bdf 2019-07-28 21:08:10.986249400 +0300
@@ -20554,8 +20554,6 @@
-1FC0
-3FE0
-3070
-3030
-3030
-3030
-3030
-3070
+0000
+0000
+0000
+0000
+0000
+0000
@@ -20564,0 +20563,5 @@
+3018
+3018
+3038
+3FF0
+3FF8
@@ -20568,3 +20570,0 @@
-300C
-300C
-300C
@@ -20638,19 +20638,19 @@
-0FFC
-1FFC
-380C
-300C
-300C
-300C
-300C
-300C
-300C
-300C
-300C
-380C
-1FFC
-0FFC
-000C
-000C
-001C
-1FF8
-1FF0
+07F8
+0FF8
+1C18
+1818
+1818
+1818
+1818
+1818
+1818
+1818
+1818
+1818
+3FF8
+7FFC
+600C
+600C
+600C
+600C
+0000

945
alt/hi2-ka2.diff Normal file
View File

@ -0,0 +1,945 @@
--- ./ter-u12b.bdf.orig 2019-07-28 21:08:05.760240200 +0300
+++ ./ter-u12b.bdf 2019-07-28 21:08:11.937851100 +0300
@@ -10182,2 +10182,2 @@
-00
-00
+40
+40
@@ -10828,2 +10828,2 @@
-08
-10
+48
+50
@@ -11189,2 +11189,2 @@
-00
-00
+40
+40
@@ -11227,2 +11227,2 @@
-00
-00
+80
+80
@@ -11265,3 +11265,3 @@
-00
-00
-C8
+C0
+40
+48
--- ./ter-u12n.bdf.orig 2019-07-28 21:08:05.666640100 +0300
+++ ./ter-u12n.bdf 2019-07-28 21:08:11.844250900 +0300
@@ -10182,2 +10182,2 @@
-00
-00
+40
+40
@@ -10828,2 +10828,2 @@
-08
-10
+48
+50
@@ -11189,2 +11189,2 @@
-00
-00
+40
+40
@@ -11227,2 +11227,2 @@
-00
-00
+80
+80
@@ -11265,3 +11265,3 @@
-00
-00
-C8
+C0
+40
+48
--- ./ter-u14b.bdf.orig 2019-07-28 21:08:05.963040600 +0300
+++ ./ter-u14b.bdf 2019-07-28 21:08:12.140651400 +0300
@@ -11250,3 +11250,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -11964,3 +11964,3 @@
-18
-30
-00
+D8
+F0
+C0
@@ -12363,3 +12363,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -12405,3 +12405,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -12447,4 +12447,4 @@
-00
-00
-00
-E3
+E0
+60
+60
+63
--- ./ter-u14n.bdf.orig 2019-07-28 21:08:05.853840400 +0300
+++ ./ter-u14n.bdf 2019-07-28 21:08:12.031451200 +0300
@@ -11250,3 +11250,3 @@
-00
-00
-00
+40
+40
+40
@@ -11964,3 +11964,3 @@
-08
-10
-00
+48
+50
+40
@@ -12363,3 +12363,3 @@
-00
-00
-00
+40
+40
+40
@@ -12405,3 +12405,3 @@
-00
-00
-00
+40
+40
+40
@@ -12447,4 +12447,4 @@
-00
-00
-00
-C2
+C0
+40
+40
+42
--- ./ter-u14v.bdf.orig 2019-07-28 21:08:06.056640800 +0300
+++ ./ter-u14v.bdf 2019-07-28 21:08:12.234251600 +0300
@@ -11250,3 +11250,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -11964,3 +11964,3 @@
-18
-30
-00
+D8
+F0
+C0
@@ -12363,3 +12363,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -12405,3 +12405,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -12447,4 +12447,4 @@
-00
-00
-00
-E3
+E0
+60
+60
+63
--- ./ter-u16b.bdf.orig 2019-07-28 21:08:06.259441100 +0300
+++ ./ter-u16b.bdf 2019-07-28 21:08:12.452652000 +0300
@@ -12318,3 +12318,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -13100,3 +13100,3 @@
-18
-30
-00
+D8
+F0
+C0
@@ -13537,3 +13537,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -13583,3 +13583,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -13629,4 +13629,4 @@
-00
-00
-00
-E3
+E0
+60
+60
+63
--- ./ter-u16n.bdf.orig 2019-07-28 21:08:06.165840900 +0300
+++ ./ter-u16n.bdf 2019-07-28 21:08:12.343451800 +0300
@@ -12318,3 +12318,3 @@
-00
-00
-00
+40
+40
+40
@@ -13100,3 +13100,3 @@
-08
-10
-00
+48
+50
+40
@@ -13537,3 +13537,3 @@
-00
-00
-00
+40
+40
+40
@@ -13583,3 +13583,3 @@
-00
-00
-00
+40
+40
+40
@@ -13629,4 +13629,4 @@
-00
-00
-00
-C2
+C0
+40
+40
+42
--- ./ter-u16v.bdf.orig 2019-07-28 21:08:06.353041300 +0300
+++ ./ter-u16v.bdf 2019-07-28 21:08:12.655452300 +0300
@@ -12318,3 +12318,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -13100,3 +13100,3 @@
-18
-30
-00
+D8
+F0
+C0
@@ -13537,3 +13537,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -13583,3 +13583,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -13629,4 +13629,4 @@
-00
-00
-00
-E3
+E0
+60
+60
+63
--- ./ter-u18b.bdf.orig 2019-07-28 21:08:06.587041700 +0300
+++ ./ter-u18b.bdf 2019-07-28 21:08:12.889452800 +0300
@@ -13386,4 +13386,4 @@
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
@@ -14237,3 +14237,3 @@
-0600
-0C00
-0000
+6600
+6C00
+6000
@@ -14712,3 +14712,3 @@
-0000
-0000
-0000
+6000
+6000
+6000
@@ -14762,3 +14762,3 @@
-0000
-0000
-0000
+6000
+6000
+6000
@@ -14811,5 +14811,5 @@
-0000
-0000
-0000
-0000
-E180
+8000
+E000
+6000
+6000
+6180
--- ./ter-u18n.bdf.orig 2019-07-28 21:08:06.477841500 +0300
+++ ./ter-u18n.bdf 2019-07-28 21:08:12.764652500 +0300
@@ -13386,4 +13386,4 @@
-0000
-0000
-0000
-0000
+4000
+4000
+4000
+4000
@@ -14237,3 +14237,3 @@
-0400
-0800
-0000
+4400
+4800
+4000
@@ -14712,3 +14712,3 @@
-0000
-0000
-0000
+4000
+4000
+4000
@@ -14762,3 +14762,3 @@
-0000
-0000
-0000
+4000
+4000
+4000
@@ -14811,5 +14811,5 @@
-0000
-0000
-0000
-0000
-C100
+8000
+4000
+4000
+4000
+4100
--- ./ter-u20b.bdf.orig 2019-07-28 21:08:06.821042100 +0300
+++ ./ter-u20b.bdf 2019-07-28 21:08:13.107853100 +0300
@@ -14455,4 +14455,4 @@
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
@@ -15373,4 +15373,4 @@
-0000
-0600
-0C00
-0000
+6000
+6600
+6C00
+6000
@@ -15886,4 +15886,4 @@
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
@@ -15940,4 +15940,4 @@
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
@@ -15994,5 +15994,5 @@
-0000
-0000
-0000
-0000
-E180
+E000
+E000
+6000
+6000
+6180
--- ./ter-u20n.bdf.orig 2019-07-28 21:08:06.711841900 +0300
+++ ./ter-u20n.bdf 2019-07-28 21:08:12.998652900 +0300
@@ -14455,4 +14455,4 @@
-0000
-0000
-0000
-0000
+4000
+4000
+4000
+4000
@@ -15373,4 +15373,4 @@
-0000
-0400
-0800
-0000
+4000
+4400
+4800
+4000
@@ -15886,4 +15886,4 @@
-0000
-0000
-0000
-0000
+4000
+4000
+4000
+4000
@@ -15940,4 +15940,4 @@
-0000
-0000
-0000
-0000
+4000
+4000
+4000
+4000
@@ -15994,5 +15994,5 @@
-0000
-0000
-0000
-0000
-C100
+C000
+4000
+4000
+4000
+4100
--- ./ter-u22b.bdf.orig 2019-07-28 21:08:07.055042500 +0300
+++ ./ter-u22b.bdf 2019-07-28 21:08:13.341853500 +0300
@@ -15523,4 +15523,4 @@
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
@@ -16509,4 +16509,4 @@
-0180
-0300
-0600
-0000
+3180
+3300
+3600
+3000
@@ -17060,4 +17060,4 @@
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
@@ -17118,4 +17118,4 @@
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
@@ -17176,6 +17176,6 @@
-0000
-0000
-0000
-0000
-70C0
-7180
+7000
+7000
+3000
+3000
+30C0
+3180
--- ./ter-u22n.bdf.orig 2019-07-28 21:08:06.930242300 +0300
+++ ./ter-u22n.bdf 2019-07-28 21:08:13.232653400 +0300
@@ -15523,4 +15523,4 @@
-0000
-0000
-0000
-0000
+2000
+2000
+2000
+2000
@@ -16509,4 +16509,4 @@
-0100
-0200
-0400
-0000
+2100
+2200
+2400
+2000
@@ -17060,4 +17060,4 @@
-0000
-0000
-0000
-0000
+2000
+2000
+2000
+2000
@@ -17118,4 +17118,4 @@
-0000
-0000
-0000
-0000
+2000
+2000
+2000
+2000
@@ -17176,5 +17176,5 @@
-0000
-0000
-0000
-0000
-E080
+E000
+2000
+2000
+2000
+2080
--- ./ter-u24b.bdf.orig 2019-07-28 21:08:07.289042900 +0300
+++ ./ter-u24b.bdf 2019-07-28 21:08:13.607054000 +0300
@@ -16592,4 +16592,4 @@
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
@@ -17646,4 +17646,4 @@
-0180
-0300
-0600
-0000
+3180
+3300
+3600
+3000
@@ -18235,4 +18235,4 @@
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
@@ -18297,4 +18297,4 @@
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
@@ -18359,6 +18359,6 @@
-0000
-0000
-0000
-0000
-7060
-70C0
+7000
+7000
+3000
+3000
+3060
+30C0
--- ./ter-u24n.bdf.orig 2019-07-28 21:08:07.164242700 +0300
+++ ./ter-u24n.bdf 2019-07-28 21:08:13.482253800 +0300
@@ -16592,4 +16592,4 @@
-0000
-0000
-0000
-0000
+2000
+2000
+2000
+2000
@@ -17646,4 +17646,4 @@
-0100
-0200
-0400
-0000
+2100
+2200
+2400
+2000
@@ -18235,4 +18235,4 @@
-0000
-0000
-0000
-0000
+2000
+2000
+2000
+2000
@@ -18297,4 +18297,4 @@
-0000
-0000
-0000
-0000
+4000
+4000
+4000
+4000
@@ -18359,5 +18359,5 @@
-0000
-0000
-0000
-0000
-E040
+6000
+6000
+2000
+2000
+2040
--- ./ter-u28b.bdf.orig 2019-07-28 21:08:07.616643500 +0300
+++ ./ter-u28b.bdf 2019-07-28 21:08:13.950254600 +0300
@@ -18728,5 +18728,5 @@
-0000
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
+3000
@@ -19918,5 +19918,5 @@
-0000
-01C0
-0380
-0700
-0000
+3000
+31C0
+3380
+3700
+3000
@@ -20583,5 +20583,5 @@
-0000
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
+3000
@@ -20653,5 +20653,5 @@
-0000
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
+6000
@@ -20723,7 +20723,7 @@
-0000
-0000
-0000
-0000
-0000
-F070
-F0E0
+F000
+F000
+3000
+3000
+3000
+3070
+30E0
--- ./ter-u28n.bdf.orig 2019-07-28 21:08:07.413843100 +0300
+++ ./ter-u28n.bdf 2019-07-28 21:08:13.809854400 +0300
@@ -18728,5 +18728,5 @@
-0000
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
+3000
@@ -19918,5 +19918,5 @@
-0000
-00C0
-0180
-0300
-0000
+3000
+30C0
+3180
+3300
+3000
@@ -20583,5 +20583,5 @@
-0000
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
+3000
@@ -20653,5 +20653,5 @@
-0000
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
+6000
@@ -20723,7 +20723,7 @@
-0000
-0000
-0000
-0000
-0000
-F030
-F060
+F000
+F000
+3000
+3000
+3000
+3030
+3060
--- ./ter-u32b.bdf.orig 2019-07-28 21:08:07.913044000 +0300
+++ ./ter-u32b.bdf 2019-07-28 21:08:14.262255200 +0300
@@ -20866,6 +20866,6 @@
-0000
-0000
-0000
-0000
-0000
-0000
+3800
+3800
+3800
+3800
+3800
+3800
@@ -22192,6 +22192,6 @@
-0070
-00E0
-01C0
-0380
-0000
-0000
+3838
+3870
+38E0
+39C0
+3800
+3800
@@ -22933,6 +22933,6 @@
-0000
-0000
-0000
-0000
-0000
-0000
+3800
+3800
+3800
+3800
+3800
+3800
@@ -23011,6 +23011,6 @@
-0000
-0000
-0000
-0000
-0000
-0000
+7000
+7000
+7000
+7000
+7000
+7000
@@ -23089,8 +23089,8 @@
-0000
-0000
-0000
-0000
-0000
-0000
-F81C
-F838
+F800
+F800
+3800
+3800
+3800
+3800
+381C
+3838
--- ./ter-u32n.bdf.orig 2019-07-28 21:08:07.757043700 +0300
+++ ./ter-u32n.bdf 2019-07-28 21:08:14.090654900 +0300
@@ -20866,6 +20866,6 @@
-0000
-0000
-0000
-0000
-0000
-0000
+1800
+1800
+1800
+1800
+1800
+1800
@@ -22192,6 +22192,6 @@
-0070
-00E0
-01C0
-0380
-0000
-0000
+1838
+1870
+18E0
+19C0
+1800
+1800
@@ -22933,6 +22933,6 @@
-0000
-0000
-0000
-0000
-0000
-0000
+1800
+1800
+1800
+1800
+1800
+1800
@@ -23011,6 +23011,6 @@
-0000
-0000
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
+3000
+3000
@@ -23089,8 +23089,8 @@
-0000
-0000
-0000
-0000
-0000
-0000
-781C
-7838
+7800
+7800
+1800
+1800
+1800
+1800
+181C
+1838
--- ./dup/xos4-2.dup.orig 2019-03-13 11:25:47.071547400 +0200
+++ ./dup/xos4-2.dup 2019-07-28 21:08:05.463839700 +0300
@@ -107 +107 @@
-0138 043A
+006B 043A

3199
alt/hi2.diff Normal file

File diff suppressed because it is too large Load Diff

1360
alt/ij1.diff Normal file

File diff suppressed because it is too large Load Diff

937
alt/ka2.diff Normal file
View File

@ -0,0 +1,937 @@
--- ./ter-u12b.bdf.orig 2019-07-28 21:07:36.104588100 +0300
+++ ./ter-u12b.bdf 2019-07-28 21:08:02.765035000 +0300
@@ -10182,2 +10182,2 @@
-00
-00
+40
+40
@@ -10828,2 +10828,2 @@
-08
-10
+48
+50
@@ -11189,2 +11189,2 @@
-00
-00
+40
+40
@@ -11227,2 +11227,2 @@
-00
-00
+80
+80
@@ -11265,3 +11265,3 @@
-00
-00
-C8
+C0
+40
+48
--- ./ter-u12n.bdf.orig 2019-07-28 21:07:35.995388000 +0300
+++ ./ter-u12n.bdf 2019-07-28 21:08:02.671434800 +0300
@@ -10182,2 +10182,2 @@
-00
-00
+40
+40
@@ -10828,2 +10828,2 @@
-08
-10
+48
+50
@@ -11189,2 +11189,2 @@
-00
-00
+40
+40
@@ -11227,2 +11227,2 @@
-00
-00
+80
+80
@@ -11265,3 +11265,3 @@
-00
-00
-C8
+C0
+40
+48
--- ./ter-u14b.bdf.orig 2019-07-28 21:07:36.322988500 +0300
+++ ./ter-u14b.bdf 2019-07-28 21:08:02.967835300 +0300
@@ -11250,3 +11250,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -11964,3 +11964,3 @@
-18
-30
-00
+D8
+F0
+C0
@@ -12363,3 +12363,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -12405,3 +12405,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -12447,4 +12447,4 @@
-00
-00
-00
-E3
+E0
+60
+60
+63
--- ./ter-u14n.bdf.orig 2019-07-28 21:07:36.213788300 +0300
+++ ./ter-u14n.bdf 2019-07-28 21:08:02.858635100 +0300
@@ -11250,3 +11250,3 @@
-00
-00
-00
+40
+40
+40
@@ -11964,3 +11964,3 @@
-08
-10
-00
+48
+50
+40
@@ -12363,3 +12363,3 @@
-00
-00
-00
+40
+40
+40
@@ -12405,3 +12405,3 @@
-00
-00
-00
+40
+40
+40
@@ -12447,4 +12447,4 @@
-00
-00
-00
-C2
+C0
+40
+40
+42
--- ./ter-u14v.bdf.orig 2019-07-28 21:07:36.416588700 +0300
+++ ./ter-u14v.bdf 2019-07-28 21:08:03.061435500 +0300
@@ -11250,3 +11250,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -11964,3 +11964,3 @@
-18
-30
-00
+D8
+F0
+C0
@@ -12363,3 +12363,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -12405,3 +12405,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -12447,4 +12447,4 @@
-00
-00
-00
-E3
+E0
+60
+60
+63
--- ./ter-u16b.bdf.orig 2019-07-28 21:07:36.634989100 +0300
+++ ./ter-u16b.bdf 2019-07-28 21:08:03.279835900 +0300
@@ -12318,3 +12318,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -13100,3 +13100,3 @@
-18
-30
-00
+D8
+F0
+C0
@@ -13537,3 +13537,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -13583,3 +13583,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -13629,4 +13629,4 @@
-00
-00
-00
-E3
+E0
+60
+60
+63
--- ./ter-u16n.bdf.orig 2019-07-28 21:07:36.541388900 +0300
+++ ./ter-u16n.bdf 2019-07-28 21:08:03.170635700 +0300
@@ -12318,3 +12318,3 @@
-00
-00
-00
+40
+40
+40
@@ -13100,3 +13100,3 @@
-08
-10
-00
+48
+50
+40
@@ -13537,3 +13537,3 @@
-00
-00
-00
+40
+40
+40
@@ -13583,3 +13583,3 @@
-00
-00
-00
+40
+40
+40
@@ -13629,4 +13629,4 @@
-00
-00
-00
-C2
+C0
+40
+40
+42
--- ./ter-u16v.bdf.orig 2019-07-28 21:07:36.759789300 +0300
+++ ./ter-u16v.bdf 2019-07-28 21:08:03.373436000 +0300
@@ -12318,3 +12318,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -13100,3 +13100,3 @@
-18
-30
-00
+D8
+F0
+C0
@@ -13537,3 +13537,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -13583,3 +13583,3 @@
-00
-00
-00
+C0
+C0
+C0
@@ -13629,4 +13629,4 @@
-00
-00
-00
-E3
+E0
+60
+60
+63
--- ./ter-u18b.bdf.orig 2019-07-28 21:07:36.993789700 +0300
+++ ./ter-u18b.bdf 2019-07-28 21:08:03.591836400 +0300
@@ -13387,3 +13387,3 @@
-0000
-0000
-0000
+6000
+6000
+6000
@@ -14237,3 +14237,3 @@
-0600
-0C00
-0000
+6600
+6C00
+6000
@@ -14712,3 +14712,3 @@
-0000
-0000
-0000
+6000
+6000
+6000
@@ -14762,3 +14762,3 @@
-0000
-0000
-0000
+6000
+6000
+6000
@@ -14812,4 +14812,4 @@
-0000
-0000
-0000
-E180
+E000
+E000
+6000
+6180
--- ./ter-u18n.bdf.orig 2019-07-28 21:07:36.884589500 +0300
+++ ./ter-u18n.bdf 2019-07-28 21:08:03.482636200 +0300
@@ -13387,3 +13387,3 @@
-0000
-0000
-0000
+4000
+4000
+4000
@@ -14237,3 +14237,3 @@
-0400
-0800
-0000
+4400
+4800
+4000
@@ -14712,3 +14712,3 @@
-0000
-0000
-0000
+4000
+4000
+4000
@@ -14762,3 +14762,3 @@
-0000
-0000
-0000
+4000
+4000
+4000
@@ -14812,4 +14812,4 @@
-0000
-0000
-0000
-C100
+C000
+4000
+4000
+4100
--- ./ter-u20b.bdf.orig 2019-07-28 21:07:37.290190200 +0300
+++ ./ter-u20b.bdf 2019-07-28 21:08:03.810236800 +0300
@@ -14455,4 +14455,4 @@
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
@@ -15373,4 +15373,4 @@
-0000
-0600
-0C00
-0000
+6000
+6600
+6C00
+6000
@@ -15886,4 +15886,4 @@
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
@@ -15940,4 +15940,4 @@
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
@@ -15994,5 +15994,5 @@
-0000
-0000
-0000
-0000
-E180
+E000
+E000
+6000
+6000
+6180
--- ./ter-u20n.bdf.orig 2019-07-28 21:07:37.102989900 +0300
+++ ./ter-u20n.bdf 2019-07-28 21:08:03.701036600 +0300
@@ -14455,4 +14455,4 @@
-0000
-0000
-0000
-0000
+4000
+4000
+4000
+4000
@@ -15373,4 +15373,4 @@
-0000
-0400
-0800
-0000
+4000
+4400
+4800
+4000
@@ -15886,4 +15886,4 @@
-0000
-0000
-0000
-0000
+4000
+4000
+4000
+4000
@@ -15940,4 +15940,4 @@
-0000
-0000
-0000
-0000
+4000
+4000
+4000
+4000
@@ -15994,5 +15994,5 @@
-0000
-0000
-0000
-0000
-C100
+C000
+4000
+4000
+4000
+4100
--- ./ter-u22b.bdf.orig 2019-07-28 21:07:37.524190600 +0300
+++ ./ter-u22b.bdf 2019-07-28 21:08:04.059837200 +0300
@@ -15523,4 +15523,4 @@
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
@@ -16509,4 +16509,4 @@
-0180
-0300
-0600
-0000
+3180
+3300
+3600
+3000
@@ -17060,4 +17060,4 @@
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
@@ -17118,4 +17118,4 @@
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
@@ -17176,6 +17176,6 @@
-0000
-0000
-0000
-0000
-70C0
-7180
+7000
+7000
+3000
+3000
+30C0
+3180
--- ./ter-u22n.bdf.orig 2019-07-28 21:07:37.414990400 +0300
+++ ./ter-u22n.bdf 2019-07-28 21:08:03.935037000 +0300
@@ -15523,4 +15523,4 @@
-0000
-0000
-0000
-0000
+2000
+2000
+2000
+2000
@@ -16509,4 +16509,4 @@
-0100
-0200
-0400
-0000
+2100
+2200
+2400
+2000
@@ -17060,4 +17060,4 @@
-0000
-0000
-0000
-0000
+2000
+2000
+2000
+2000
@@ -17118,4 +17118,4 @@
-0000
-0000
-0000
-0000
+2000
+2000
+2000
+2000
@@ -17176,5 +17176,5 @@
-0000
-0000
-0000
-0000
-E080
+E000
+2000
+2000
+2000
+2080
--- ./ter-u24b.bdf.orig 2019-07-28 21:07:37.773791100 +0300
+++ ./ter-u24b.bdf 2019-07-28 21:08:04.293837700 +0300
@@ -16592,4 +16592,4 @@
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
@@ -17646,4 +17646,4 @@
-0180
-0300
-0600
-0000
+3180
+3300
+3600
+3000
@@ -18235,4 +18235,4 @@
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
@@ -18297,4 +18297,4 @@
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
@@ -18359,6 +18359,6 @@
-0000
-0000
-0000
-0000
-7060
-70C0
+7000
+7000
+3000
+3000
+3060
+30C0
--- ./ter-u24n.bdf.orig 2019-07-28 21:07:37.648990900 +0300
+++ ./ter-u24n.bdf 2019-07-28 21:08:04.169037400 +0300
@@ -16592,4 +16592,4 @@
-0000
-0000
-0000
-0000
+2000
+2000
+2000
+2000
@@ -17646,4 +17646,4 @@
-0100
-0200
-0400
-0000
+2100
+2200
+2400
+2000
@@ -18235,4 +18235,4 @@
-0000
-0000
-0000
-0000
+2000
+2000
+2000
+2000
@@ -18297,4 +18297,4 @@
-0000
-0000
-0000
-0000
+4000
+4000
+4000
+4000
@@ -18359,5 +18359,5 @@
-0000
-0000
-0000
-0000
-E040
+6000
+6000
+2000
+2000
+2040
--- ./ter-u28b.bdf.orig 2019-07-28 21:07:38.038991500 +0300
+++ ./ter-u28b.bdf 2019-07-28 21:08:04.559038100 +0300
@@ -18728,5 +18728,5 @@
-0000
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
+3000
@@ -19918,5 +19918,5 @@
-0000
-01C0
-0380
-0700
-0000
+3000
+31C0
+3380
+3700
+3000
@@ -20583,5 +20583,5 @@
-0000
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
+3000
@@ -20653,5 +20653,5 @@
-0000
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
+6000
@@ -20723,7 +20723,7 @@
-0000
-0000
-0000
-0000
-0000
-F070
-F0E0
+F000
+F000
+3000
+3000
+3000
+3070
+30E0
--- ./ter-u28n.bdf.orig 2019-07-28 21:07:37.914191300 +0300
+++ ./ter-u28n.bdf 2019-07-28 21:08:04.418637900 +0300
@@ -18728,5 +18728,5 @@
-0000
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
+3000
@@ -19918,5 +19918,5 @@
-0000
-00C0
-0180
-0300
-0000
+3000
+30C0
+3180
+3300
+3000
@@ -20583,5 +20583,5 @@
-0000
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
+3000
@@ -20653,5 +20653,5 @@
-0000
-0000
-0000
-0000
-0000
+6000
+6000
+6000
+6000
+6000
@@ -20723,7 +20723,7 @@
-0000
-0000
-0000
-0000
-0000
-F030
-F060
+F000
+F000
+3000
+3000
+3000
+3030
+3060
--- ./ter-u32b.bdf.orig 2019-07-28 21:07:38.335392100 +0300
+++ ./ter-u32b.bdf 2019-07-28 21:08:04.855438600 +0300
@@ -20866,6 +20866,6 @@
-0000
-0000
-0000
-0000
-0000
-0000
+3800
+3800
+3800
+3800
+3800
+3800
@@ -22192,6 +22192,6 @@
-0070
-00E0
-01C0
-0380
-0000
-0000
+3838
+3870
+38E0
+39C0
+3800
+3800
@@ -22933,6 +22933,6 @@
-0000
-0000
-0000
-0000
-0000
-0000
+3800
+3800
+3800
+3800
+3800
+3800
@@ -23011,6 +23011,6 @@
-0000
-0000
-0000
-0000
-0000
-0000
+7000
+7000
+7000
+7000
+7000
+7000
@@ -23089,8 +23089,8 @@
-0000
-0000
-0000
-0000
-0000
-0000
-F81C
-F838
+F800
+F800
+3800
+3800
+3800
+3800
+381C
+3838
--- ./ter-u32n.bdf.orig 2019-07-28 21:07:38.194991800 +0300
+++ ./ter-u32n.bdf 2019-07-28 21:08:04.699438400 +0300
@@ -20866,6 +20866,6 @@
-0000
-0000
-0000
-0000
-0000
-0000
+1800
+1800
+1800
+1800
+1800
+1800
@@ -22192,6 +22192,6 @@
-0070
-00E0
-01C0
-0380
-0000
-0000
+1838
+1870
+18E0
+19C0
+1800
+1800
@@ -22933,6 +22933,6 @@
-0000
-0000
-0000
-0000
-0000
-0000
+1800
+1800
+1800
+1800
+1800
+1800
@@ -23011,6 +23011,6 @@
-0000
-0000
-0000
-0000
-0000
-0000
+3000
+3000
+3000
+3000
+3000
+3000
@@ -23089,8 +23089,8 @@
-0000
-0000
-0000
-0000
-0000
-0000
-781C
-7838
+7800
+7800
+1800
+1800
+1800
+1800
+181C
+1838
--- ./dup/xos4-2.dup.orig 2019-03-13 11:25:47.071547400 +0200
+++ ./dup/xos4-2.dup 2019-07-28 21:08:05.463839700 +0300
@@ -107 +107 @@
-0138 043A
+006B 043A

2983
alt/ll2.diff Normal file

File diff suppressed because it is too large Load Diff

236
alt/td1.diff Normal file
View File

@ -0,0 +1,236 @@
--- ./ter-u12b.bdf.orig 2019-07-28 21:07:36.104588100 +0300
+++ ./ter-u12b.bdf 2019-07-28 21:07:59.769829700 +0300
@@ -1840,3 +1839,0 @@
-48
-A8
-90
@@ -1846,0 +1844,3 @@
+48
+A8
+90
--- ./ter-u12n.bdf.orig 2019-07-28 21:07:35.995388000 +0300
+++ ./ter-u12n.bdf 2019-07-28 21:07:59.676229500 +0300
@@ -1840,3 +1839,0 @@
-48
-A8
-90
@@ -1846,0 +1844,3 @@
+48
+A8
+90
--- ./ter-u14b.bdf.orig 2019-07-28 21:07:36.322988500 +0300
+++ ./ter-u14b.bdf 2019-07-28 21:07:59.972630100 +0300
@@ -2030,3 +2029,0 @@
-73
-DB
-CE
@@ -2037,0 +2035,3 @@
+73
+DB
+CE
--- ./ter-u14n.bdf.orig 2019-07-28 21:07:36.213788300 +0300
+++ ./ter-u14n.bdf 2019-07-28 21:07:59.879029900 +0300
@@ -2030,3 +2029,0 @@
-62
-92
-8C
@@ -2037,0 +2035,3 @@
+62
+92
+8C
--- ./ter-u14v.bdf.orig 2019-07-28 21:07:36.416588700 +0300
+++ ./ter-u14v.bdf 2019-07-28 21:08:00.081830300 +0300
@@ -2030,3 +2029,0 @@
-73
-DB
-CE
@@ -2037,0 +2035,3 @@
+73
+DB
+CE
--- ./ter-u16b.bdf.orig 2019-07-28 21:07:36.634989100 +0300
+++ ./ter-u16b.bdf 2019-07-28 21:08:00.284630600 +0300
@@ -2220,3 +2219,0 @@
-73
-DB
-CE
@@ -2227,0 +2225,3 @@
+73
+DB
+CE
--- ./ter-u16n.bdf.orig 2019-07-28 21:07:36.541388900 +0300
+++ ./ter-u16n.bdf 2019-07-28 21:08:00.191030500 +0300
@@ -2220,3 +2219,0 @@
-62
-92
-8C
@@ -2227,0 +2225,3 @@
+62
+92
+8C
--- ./ter-u16v.bdf.orig 2019-07-28 21:07:36.759789300 +0300
+++ ./ter-u16v.bdf 2019-07-28 21:08:00.378230800 +0300
@@ -2220,3 +2219,0 @@
-73
-DB
-CE
@@ -2227,0 +2225,3 @@
+73
+DB
+CE
--- ./ter-u18b.bdf.orig 2019-07-28 21:07:36.993789700 +0300
+++ ./ter-u18b.bdf 2019-07-28 21:08:00.596631200 +0300
@@ -2410,4 +2409,0 @@
-3980
-6D80
-6D80
-6700
@@ -2419,0 +2416,4 @@
+3980
+6D80
+6D80
+6700
--- ./ter-u18n.bdf.orig 2019-07-28 21:07:36.884589500 +0300
+++ ./ter-u18n.bdf 2019-07-28 21:08:00.487431000 +0300
@@ -2410,4 +2409,0 @@
-3100
-4900
-4900
-4600
@@ -2419,0 +2416,4 @@
+3100
+4900
+4900
+4600
--- ./ter-u20b.bdf.orig 2019-07-28 21:07:37.290190200 +0300
+++ ./ter-u20b.bdf 2019-07-28 21:08:00.830631600 +0300
@@ -2600,4 +2599,0 @@
-3980
-6D80
-6D80
-6700
@@ -2610,0 +2607,4 @@
+3980
+6D80
+6D80
+6700
--- ./ter-u20n.bdf.orig 2019-07-28 21:07:37.102989900 +0300
+++ ./ter-u20n.bdf 2019-07-28 21:08:00.721431400 +0300
@@ -2600,4 +2599,0 @@
-3100
-4900
-4900
-4600
@@ -2610,0 +2607,4 @@
+3100
+4900
+4900
+4600
--- ./ter-u22b.bdf.orig 2019-07-28 21:07:37.524190600 +0300
+++ ./ter-u22b.bdf 2019-07-28 21:08:01.064632000 +0300
@@ -2790,4 +2789,0 @@
-38C0
-6CC0
-66C0
-6380
@@ -2800,0 +2797,4 @@
+38C0
+6CC0
+66C0
+6380
--- ./ter-u22n.bdf.orig 2019-07-28 21:07:37.414990400 +0300
+++ ./ter-u22n.bdf 2019-07-28 21:08:00.955431800 +0300
@@ -2790,4 +2789,0 @@
-3080
-4880
-4480
-4300
@@ -2800,0 +2797,4 @@
+3080
+4880
+4480
+4300
--- ./ter-u24b.bdf.orig 2019-07-28 21:07:37.773791100 +0300
+++ ./ter-u24b.bdf 2019-07-28 21:08:01.329832500 +0300
@@ -2981,4 +2980,0 @@
-3C60
-6660
-6660
-63C0
@@ -2992,0 +2989,4 @@
+3C60
+6660
+6660
+63C0
--- ./ter-u24n.bdf.orig 2019-07-28 21:07:37.648990900 +0300
+++ ./ter-u24n.bdf 2019-07-28 21:08:01.189432200 +0300
@@ -2981,4 +2980,0 @@
-3840
-4440
-4440
-4380
@@ -2992,0 +2989,4 @@
+3840
+4440
+4440
+4380
--- ./ter-u28b.bdf.orig 2019-07-28 21:07:38.038991500 +0300
+++ ./ter-u28b.bdf 2019-07-28 21:08:01.595032900 +0300
@@ -3361,5 +3360,0 @@
-3C30
-7E30
-6730
-63F0
-61E0
@@ -3374,0 +3370,5 @@
+3C30
+7E30
+6730
+63F0
+61E0
--- ./ter-u28n.bdf.orig 2019-07-28 21:07:37.914191300 +0300
+++ ./ter-u28n.bdf 2019-07-28 21:08:01.470232700 +0300
@@ -3361,5 +3360,0 @@
-3C30
-6630
-6330
-6330
-61E0
@@ -3374,0 +3370,5 @@
+3C30
+6630
+6330
+6330
+61E0
--- ./ter-u32b.bdf.orig 2019-07-28 21:07:38.335392100 +0300
+++ ./ter-u32b.bdf 2019-07-28 21:08:01.891433400 +0300
@@ -3743,6 +3742,0 @@
-1E1C
-3F1C
-779C
-73DC
-71F8
-70F0
@@ -3757,0 +3752,6 @@
+1E1C
+3F1C
+779C
+73DC
+71F8
+70F0
--- ./ter-u32n.bdf.orig 2019-07-28 21:07:38.194991800 +0300
+++ ./ter-u32n.bdf 2019-07-28 21:08:01.735433200 +0300
@@ -3743,6 +3742,0 @@
-0E0C
-1F0C
-3B8C
-31DC
-30F8
-3070
@@ -3757,0 +3752,6 @@
+0E0C
+1F0C
+3B8C
+31DC
+30F8
+3070

135
bin/.eslintrc.js Normal file
View File

@ -0,0 +1,135 @@
module.exports = {
"env": {
"es6": true,
"node": true,
"browser": false
},
"extends": "eslint:recommended",
"parserOptions": {
"sourceType": "module"
},
"rules": {
"indent": [
"error",
"tab"
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"warn",
"single"
],
"semi": [
"error",
"always"
],
"curly": [
"error",
"all"
],
"brace-style": [
"error",
"1tbs"
],
"no-empty" : "warn",
"no-unused-vars" : "warn",
"no-console": "warn",
"consistent-return": "error",
"class-methods-use-this": "warn",
"eqeqeq": [
"error",
"always", {
"null": "ignore"
}
],
"no-alert": "warn",
"no-caller": "error",
"no-eval": "error",
"no-extend-native": "warn",
"no-implicit-coercion": "error",
"no-implied-eval": "error",
"no-invalid-this": "error",
"no-loop-func": "error",
"no-new-func": "warn",
"no-new-wrappers": "error",
"no-proto": "error",
"no-return-assign": "warn",
"no-return-await": "warn",
"no-script-url": "error",
"no-self-compare": "error",
"no-sequences": "error",
"no-throw-literal": "error",
"no-unmodified-loop-condition": "warn",
"no-unused-expressions": "warn",
"no-useless-return": "warn",
"no-warning-comments": "warn",
"prefer-promise-reject-errors": "warn",
"no-label-var": "error",
"no-shadow": [
"warn", {
"builtinGlobals": true,
"hoist": "all"
}
],
"no-shadow-restricted-names": "error",
"no-undefined": "error",
"no-use-before-define": "error",
"no-new-require": "error",
"no-path-concat": "error",
"camelcase": "error",
"comma-dangle": [
"error",
"never"
],
"eol-last": [
"error",
"always"
],
"func-call-spacing": "warn",
"lines-around-directive": [
"warn",
"always"
],
"max-params": [
"warn", {
"max": 7
}
],
"max-statements-per-line": [
"warn", {
"max": 1
}
],
"new-cap": [
"error"
],
"no-array-constructor": "warn",
"no-mixed-operators": [
"error", {
"groups": [
["&", "|", "^", "~", "<<", ">>", ">>>"],
["==", "!=", "===", "!==", ">", ">=", "<", "<="],
["&&", "||"],
["in", "instanceof"]
],
"allowSamePrecedence": false
}
],
"no-trailing-spaces": "warn",
"no-unneeded-ternary": "warn",
"no-whitespace-before-property": "error",
"operator-linebreak": "warn",
"semi-spacing": "warn",
"no-confusing-arrow": [
"error", {
"allowParens": true
}
],
"no-duplicate-imports": "warn",
"prefer-rest-params": "warn",
"prefer-spread": "warn",
"no-unsafe-negation": "warn"
}
};

425
bin/.pylintrc Normal file
View File

@ -0,0 +1,425 @@
[MASTER]
# A comma-separated list of package or module names from where C extensions may
# be loaded. Extensions are loading into the active Python interpreter and may
# run arbitrary code
extension-pkg-whitelist=
# Add files or directories to the blacklist. They should be base names, not
# paths.
ignore=CVS
# Add files or directories matching the regex patterns to the blacklist. The
# regex matches against base names, not paths.
ignore-patterns=
# Python code to execute, usually for sys.path manipulation such as
# pygtk.require().
#init-hook=
# Use multiple processes to speed up Pylint.
jobs=4
# List of plugins (as comma separated values of python modules names) to load,
# usually to register additional checkers.
load-plugins=
# Pickle collected data for later comparisons.
persistent=yes
# Specify a configuration file.
#rcfile=
# Allow loading of arbitrary C extensions. Extensions are imported into the
# active Python interpreter and may run arbitrary code.
unsafe-load-any-extension=no
[MESSAGES CONTROL]
# Only show warnings with the listed confidence levels. Leave empty to show
# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
confidence=
# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifiers separated by comma (,) or put this
# option multiple times (only on the command line, not in the configuration
# file where it should appear only once).You can also use "--disable=all" to
# disable everything first and then reenable specific checks. For example, if
# you want to run only the similarities checker, you can use "--disable=all
# --enable=similarities". If you want to run only the classes checker, but have
# no Warning level messages displayed, use"--disable=all --enable=classes
# --disable=W"
disable=print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call,bad-continuation,missing-docstring,redefined-builtin,unnecessary-lambda,too-few-public-methods,too-many-locals,too-many-branches,too-many-statements,broad-except,consider-using-ternary
# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once). See also the "--disable" option for examples.
enable=
[REPORTS]
# Python expression which should return a note less than 10 (10 is the highest
# note). You have access to the variables errors warning, statement which
# respectively contain the number of errors / warnings messages and the total
# number of statements analyzed. This is used by the global evaluation report
# (RP0004).
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
# Template used to display messages. This is a python new-style format string
# used to format the message information. See doc for all details
#msg-template=
# Set the output format. Available formats are text, parseable, colorized, json
# and msvs (visual studio).You can also give a reporter class, eg
# mypackage.mymodule.MyReporterClass.
output-format=text
# Tells whether to display a full report or only the messages
reports=no
# Activate the evaluation score.
score=no
[REFACTORING]
# Maximum number of nested blocks for function / method body
max-nested-blocks=8
[BASIC]
# Naming hint for argument names
argument-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct argument names
argument-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Naming hint for attribute names
attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct attribute names
attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Bad variable names which should always be refused, separated by a comma
bad-names=foo,bar,baz,toto,tutu,tata
# Naming hint for class attribute names
class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
# Regular expression matching correct class attribute names
class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
# Naming hint for class names
class-name-hint=[A-Z_][a-zA-Z0-9]+$
# Regular expression matching correct class names
class-rgx=[A-Z_][a-zA-Z0-9]+$
# Naming hint for constant names
const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$
# Regular expression matching correct constant names
const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
# Minimum line length for functions/classes that require docstrings, shorter
# ones are exempt.
docstring-min-length=-1
# Naming hint for function names
function-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct function names
function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_,s,e,x,y,n
# Include a hint for the correct naming format with invalid-name
include-naming-hint=no
# Naming hint for inline iteration names
inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$
# Regular expression matching correct inline iteration names
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
# Naming hint for method names
method-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct method names
method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Naming hint for module names
module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
# Regular expression matching correct module names
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
# Colon-delimited sets of names that determine each other's naming style when
# the name regexes allow several styles.
name-group=
# Regular expression which should only match function or class names that do
# not require a docstring.
no-docstring-rgx=^_
# List of decorators that produce properties, such as abc.abstractproperty. Add
# to this list to register other decorators that produce valid properties.
property-classes=abc.abstractproperty
# Naming hint for variable names
variable-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct variable names
variable-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
[FORMAT]
# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
expected-line-ending-format=LF
# Regexp for a line that is allowed to be longer than the limit.
ignore-long-lines=^\s*(# )?<?https?://\S+>?$
# Number of spaces of indent required inside a hanging or continued line.
indent-after-paren=4
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
# tab).
indent-string='\t'
# Maximum number of characters on a single line.
max-line-length=120
# Maximum number of lines in a module
max-module-lines=1000
# List of optional constructs for which whitespace checking is disabled. `dict-
# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
# `trailing-comma` allows a space between comma and closing bracket: (a, ).
# `empty-line` allows space-only lines.
no-space-check=trailing-comma,dict-separator
# Allow the body of a class to be on the same line as the declaration if body
# contains single statement.
single-line-class-stmt=no
# Allow the body of an if to be on the same line as the test if there is no
# else.
single-line-if-stmt=no
[LOGGING]
# Logging modules to check that the string format arguments are in logging
# function parameter format
logging-modules=logging
[MISCELLANEOUS]
# List of note tags to take in consideration, separated by a comma.
notes=FIXME,XXX,TODO
[SIMILARITIES]
# Ignore comments when computing similarities.
ignore-comments=yes
# Ignore docstrings when computing similarities.
ignore-docstrings=yes
# Ignore imports when computing similarities.
ignore-imports=no
# Minimum lines number of a similarity.
min-similarity-lines=4
[SPELLING]
# Spelling dictionary name. Available dictionaries: none. To make it working
# install python-enchant package.
spelling-dict=
# List of comma separated words that should not be checked.
spelling-ignore-words=
# A path to a file that contains private dictionary; one word per line.
spelling-private-dict-file=
# Tells whether to store unknown words to indicated private dictionary in
# --spelling-private-dict-file option instead of raising a message.
spelling-store-unknown-words=no
[TYPECHECK]
# List of decorators that produce context managers, such as
# contextlib.contextmanager. Add to this list to register other decorators that
# produce valid context managers.
contextmanager-decorators=contextlib.contextmanager
# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E1101 when accessed. Python regular
# expressions are accepted.
generated-members=
# Tells whether missing members accessed in mixin class should be ignored. A
# mixin class is detected if its name ends with "mixin" (case insensitive).
ignore-mixin-members=yes
# This flag controls whether pylint should warn about no-member and similar
# checks whenever an opaque object is returned when inferring. The inference
# can return multiple potential results while evaluating a Python object, but
# some branches might not be evaluated, which results in partial inference. In
# that case, it might be useful to still emit no-member and other checks for
# the rest of the inferred objects.
ignore-on-opaque-inference=yes
# List of class names for which member attributes should not be checked (useful
# for classes with dynamically set attributes). This supports the use of
# qualified names.
ignored-classes=optparse.Values,thread._local,_thread._local
# List of module names for which member attributes should not be checked
# (useful for modules/projects where namespaces are manipulated during runtime
# and thus existing member attributes cannot be deduced by static analysis. It
# supports qualified module names, as well as Unix pattern matching.
ignored-modules=
# Show a hint with possible names when a member name was not found. The aspect
# of finding the hint is based on edit distance.
missing-member-hint=yes
# The minimum edit distance a name should have in order to be considered a
# similar match for a missing member name.
missing-member-hint-distance=1
# The total number of similar names that should be taken in consideration when
# showing a hint for a missing member.
missing-member-max-choices=1
[VARIABLES]
# List of additional names supposed to be defined in builtins. Remember that
# you should avoid to define new builtins when possible.
additional-builtins=
# Tells whether unused global variables should be treated as a violation.
allow-global-unused-variables=yes
# List of strings which can identify a callback function by name. A callback
# name must start or end with one of those strings.
callbacks=cb_,_cb
# A regular expression matching the name of dummy variables (i.e. expectedly
# not used).
dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
# Argument names that match this expression will be ignored. Default to name
# with leading underscore
ignored-argument-names=_.*|^ignored_|^unused_
# Tells whether we should check for unused import in __init__ files.
init-import=no
# List of qualified module names which can have objects that can redefine
# builtins.
redefining-builtins-modules=six.moves,future.builtins
[CLASSES]
# List of method names used to declare (i.e. assign) instance attributes.
defining-attr-methods=__init__,__new__,setUp
# List of member names, which should be excluded from the protected access
# warning.
exclude-protected=_asdict,_fields,_replace,_source,_make
# List of valid names for the first argument in a class method.
valid-classmethod-first-arg=cls
# List of valid names for the first argument in a metaclass class method.
valid-metaclass-classmethod-first-arg=mcs
[DESIGN]
# Maximum number of arguments for function / method
max-args=5
# Maximum number of attributes for a class (see R0902).
max-attributes=10
# Maximum number of boolean expressions in a if statement
max-bool-expr=5
# Maximum number of branch for function / method body
max-branches=12
# Maximum number of locals for function / method body
max-locals=15
# Maximum number of parents for a class (see R0901).
max-parents=7
# Maximum number of public methods for a class (see R0904).
max-public-methods=20
# Maximum number of return / yield for function / method body
max-returns=6
# Maximum number of statements in function / method body
max-statements=50
# Minimum number of public methods for a class (see R0903).
min-public-methods=2
[IMPORTS]
# Allow wildcard imports from modules that define __all__.
allow-wildcard-with-all=no
# Analyse import fallback blocks. This can be used to support both Python 2 and
# 3 compatible code, which means that the block might have code that exists
# only in one or another interpreter, leading to false positives when analysed.
analyse-fallback-blocks=no
# Deprecated modules which should not be used, separated by a comma
deprecated-modules=optparse,tkinter.tix
# Create a graph of external dependencies in the given file (report RP0402 must
# not be disabled)
ext-import-graph=
# Create a graph of every (i.e. internal and external) dependencies in the
# given file (report RP0402 must not be disabled)
import-graph=
# Create a graph of internal dependencies in the given file (report RP0402 must
# not be disabled)
int-import-graph=
# Force import order to recognize a module as part of the standard
# compatibility libraries.
known-standard-library=
# Force import order to recognize a module as part of a third party library.
known-third-party=enchant
[EXCEPTIONS]
# Exceptions that will emit a warning when being caught. Defaults to
# "Exception"
overgeneral-exceptions=Exception

374
bin/bdf.js Normal file
View File

@ -0,0 +1,374 @@
//
// Copyright (c) 2018 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
'use strict';
const fnutil = require('./fnutil.js');
const WIDTH_MAX = 127;
const HEIGHT_MAX = 255;
const SWIDTH_MAX = 32000;
class Width {
constructor(x, y) {
this.x = x;
this.y = y;
}
static _parse(name, value, limitX, limitY) {
const words = fnutil.splitWords(name, value, 2);
return new Width(fnutil.parseDec(name + ' X', words[0], -limitX, limitX),
fnutil.parseDec(name + ' Y', words[1], -limitY, limitY));
}
static parseS(value) {
return Width._parse('SWIDTH', value, SWIDTH_MAX, SWIDTH_MAX);
}
static parseD(value) {
return Width._parse('DWIDTH', value, WIDTH_MAX, HEIGHT_MAX);
}
}
class BBX {
constructor(width, height, xoff, yoff) {
this.width = width;
this.height = height;
this.xoff = xoff;
this.yoff = yoff;
}
static parse(name, value) {
const words = fnutil.splitWords(name, value, 4);
return new BBX(fnutil.parseDec('width', words[0], 1, WIDTH_MAX),
fnutil.parseDec('height', words[1], 1, HEIGHT_MAX),
fnutil.parseDec('bbxoff', words[2], -WIDTH_MAX, WIDTH_MAX),
fnutil.parseDec('bbyoff', words[3], -WIDTH_MAX, WIDTH_MAX));
}
rowSize() {
return (this.width + 7) >> 3;
}
toString() {
return `${this.width} ${this.height} ${this.xoff} ${this.yoff}`;
}
}
class Props {
constructor() {
this.names = [];
this.values = [];
}
add(name, value) {
this.names.push(name);
this.values.push(value);
}
clone() {
let props = new Props();
props.names = this.names.slice();
props.values = this.values.slice();
return props;
}
forEach(callback) {
for (let index = 0; index < this.names.length; index++) {
callback(this.names[index], this.values[index]);
}
}
get(name) {
return this.values[this.names.indexOf(name)];
}
parse(line, name, callback) {
if (line === null || !line.startsWith(name)) {
throw new Error(name + ' expected');
}
let value = line.substring(name.length).trimLeft();
this.add(name, value);
return callback == null ? value : callback(name, value);
}
push(line) {
this.add('', line);
}
set(name, value) {
let index = this.names.indexOf(name);
if (index !== -1) {
this.values[index] = value;
} else {
this.add(name, value);
}
}
}
class Base {
constructor() {
this.props = new Props();
this.bbx = null;
this.finis = [];
}
readFinish(input, endText) {
if (this.readNext(input, this.finis) !== endText) {
throw new Error(endText + ' expected');
}
this.finis.push(endText);
}
readNext(input, comout = this.props) {
return input.readLines(line => {
if (line.startsWith('COMMENT')) {
comout.push(line);
return null;
}
return line;
});
}
readProp(input, name, callback) {
return this.props.parse(this.readNext(input), name, callback);
}
}
class Char extends Base {
constructor() {
super();
this.code = -1;
this.swidth = null;
this.dwidth = null;
this.data = null;
}
static bitmap(data, rowSize) {
const bitmap = data.toString('hex').toUpperCase();
const regex = new RegExp(`.{${rowSize << 1}}`, 'g');
return bitmap.replace(regex, '$&\n');
}
_read(input) {
// HEADER
this.readProp(input, 'STARTCHAR');
this.code = this.readProp(input, 'ENCODING', fnutil.parseDec);
this.swidth = this.readProp(input, 'SWIDTH', (name, value) => Width.parseS(value));
this.dwidth = this.readProp(input, 'DWIDTH', (name, value) => Width.parseD(value));
this.bbx = this.readProp(input, 'BBX', BBX.parse);
let line = this.readNext(input);
if (line !== null && line.startsWith('ATTRIBUTES')) {
this.props.parse(line, 'ATTRIBUTES');
line = this.readNext(input);
}
// BITMAP
if (this.props.parse(line, 'BITMAP') !== '') {
throw new Error('BITMAP expected');
}
const rowLen = this.bbx.rowSize() * 2;
let bitmap = '';
for (let y = 0; y < this.bbx.height; y++) {
line = this.readNext(input);
if (line === null) {
throw new Error('bitmap data expected');
}
if (line.length === rowLen) {
bitmap += line;
} else {
throw new Error('invalid bitmap line length');
}
}
// FINAL
this.readFinish(input, 'ENDCHAR');
if (bitmap.match(/^[\dA-Fa-f]+$/) != null) {
this.data = Buffer.from(bitmap, 'hex');
} else {
throw new Error('invalid BITMAP data characters');
}
return this;
}
static read(input) {
return (new Char())._read(input);
}
write(output) {
let header = '';
this.props.forEach((name, value) => {
header += (name + ' ' + value).trim() + '\n';
});
output.writeLine(header + Char.bitmap(this.data, this.bbx.rowSize()) + this.finis.join('\n'));
}
}
const XLFD = {
FOUNDRY: 1,
FAMILY_NAME: 2,
WEIGHT_NAME: 3,
SLANT: 4,
SETWIDTH_NAME: 5,
ADD_STYLE_NAME: 6,
PIXEL_SIZE: 7,
POINT_SIZE: 8,
RESOLUTION_X: 9,
RESOLUTION_Y: 10,
SPACING: 11,
AVERAGE_WIDTH: 12,
CHARSET_REGISTRY: 13,
CHARSET_ENCODING: 14
};
const CHARS_MAX = 65535;
class Font extends Base {
constructor() {
super();
this.chars = [];
this.defaultCode = -1;
}
getAscent() {
let ascent = this.props.get('FONT_ASCENT');
if (ascent != null) {
return fnutil.parseDec('FONT_ASCENT', ascent, -HEIGHT_MAX, HEIGHT_MAX);
}
return this.bbx.height + this.bbx.yoff;
}
getBold() {
return Number(this.xlfd[XLFD.WEIGHT_NAME].toLowerCase().includes('bold'));
}
getItalic() {
return Number(this.xlfd[XLFD.SLANT].match(/^[IO]/) != null);
}
_read(input) {
// HEADER
let line = input.readLines(Font.skipEmpty);
if (this.props.parse(line, 'STARTFONT') !== '2.1') {
throw new Error('STARTFONT 2.1 expected');
}
this.xlfd = this.readProp(input, 'FONT', (name, value) => value.split('-', 16));
if (this.xlfd.length !== 15 || this.xlfd[0] !== '') {
throw new Error('non-XLFD font names are not supported');
}
this.readProp(input, 'SIZE');
this.bbx = this.readProp(input, 'FONTBOUNDINGBOX', BBX.parse);
line = this.readNext(input);
if (line !== null && line.startsWith('STARTPROPERTIES')) {
const numProps = this.props.parse(line, 'STARTPROPERTIES', fnutil.parseDec);
for (let i = 0; i < numProps; i++) {
line = this.readNext(input);
if (line === null) {
throw new Error('property expected');
}
let match = line.match(/^(\w+)\s+([-\d"].*)$/);
if (match == null) {
throw new Error('invalid property format');
}
let name = match[1];
let value = match[2];
if (name === 'DEFAULT_CHAR') {
this.defaultCode = fnutil.parseDec(name, value);
}
this.props.add(name, value);
}
if (this.readProp(input, 'ENDPROPERTIES') !== '') {
throw new Error('ENDPROPERTIES expected');
}
line = this.readNext(input);
}
// GLYPHS
const numChars = this.props.parse(line, 'CHARS', (name, value) => fnutil.parseDec(name, value, 1, CHARS_MAX));
for (let i = 0; i < numChars; i++) {
this.chars.push(Char.read(input));
}
if (this.defaultCode !== -1 && this.chars.find(char => char.code === this.defaultCode) === -1) {
throw new Error('invalid DEFAULT_CHAR');
}
// FINAL
this.readFinish(input, 'ENDFONT');
if (input.readLines(Font.skipEmpty) != null) {
throw new Error('garbage after ENDFONT');
}
return this;
}
static read(input) {
return (new Font())._read(input);
}
static skipEmpty(line) {
return line.length > 0 ? line : null;
}
write(output) {
this.props.forEach((name, value) => output.writeProp(name, value));
this.chars.forEach(char => char.write(output));
output.writeLine(this.finis.join('\n'));
}
}
module.exports = Object.freeze({
WIDTH_MAX,
HEIGHT_MAX,
SWIDTH_MAX,
Width,
BBX,
Char,
XLFD,
CHARS_MAX,
Font
});

355
bin/bdf.py Normal file
View File

@ -0,0 +1,355 @@
#
# Copyright (c) 2018 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
import re
import codecs
from enum import IntEnum, unique
import fnutil
WIDTH_MAX = 127
HEIGHT_MAX = 255
SWIDTH_MAX = 32000
class Width:
def __init__(self, x, y):
self.x = x
self.y = y
@staticmethod
def _parse(name, value, limit_x, limit_y):
words = fnutil.split_words(name, value, 2)
return Width(fnutil.parse_dec('width x', words[0], -limit_x, limit_x),
fnutil.parse_dec('width y', words[1], -limit_y, limit_y))
@staticmethod
def parse_s(value):
return Width._parse('SWIDTH', value, SWIDTH_MAX, SWIDTH_MAX)
@staticmethod
def parse_d(value):
return Width._parse('DWIDTH', value, WIDTH_MAX, HEIGHT_MAX)
OFFSET_MIN = -128
OFFSET_MAX = 127
class BBX:
def __init__(self, width, height, xoff, yoff):
self.width = width
self.height = height
self.xoff = xoff
self.yoff = yoff
@staticmethod
def parse(name, value):
words = fnutil.split_words(name, value, 4)
return BBX(fnutil.parse_dec('width', words[0], 1, WIDTH_MAX),
fnutil.parse_dec('height', words[1], 1, HEIGHT_MAX),
fnutil.parse_dec('bbxoff', words[2], -WIDTH_MAX, WIDTH_MAX),
fnutil.parse_dec('bbyoff', words[3], -WIDTH_MAX, WIDTH_MAX))
def row_size(self):
return (self.width + 7) >> 3
def __str__(self):
return '%d %d %d %d' % (self.width, self.height, self.xoff, self.yoff)
class Props:
def __init__(self):
self.names = []
self.values = []
def add(self, name, value):
self.names.append(name)
self.values.append(value)
def clone(self):
props = Props()
props.names = self.names[:]
props.values = self.values[:]
return props
def get(self, name):
try:
return self.values[self.names.index(name)]
except ValueError:
return None
class Iter:
def __init__(self, props):
self.index = 0
self.props = props
def __next__(self):
if self.index == len(self.props.names):
raise StopIteration
result = (self.props.names[self.index], self.props.values[self.index])
self.index += 1
return result
def __iter__(self):
return Props.Iter(self)
def parse(self, line, name, callback=None):
if not line or not line.startswith(bytes(name, 'ascii')):
raise Exception(name + ' expected')
value = line[len(name):].lstrip()
self.add(name, value)
return value if callback is None else callback(name, value)
def set(self, name, value):
try:
self.values[self.names.index(name)] = value
except ValueError:
self.add(name, value)
class Base:
def __init__(self):
self.props = Props()
self.bbx = None
self.finis = []
def keep_comments(self, line):
if not line.startswith(b'COMMENT'):
return line
self.props.add('', line)
return None
def keep_finishes(self, line):
self.finis.append(line)
return None if line.startswith(b'COMMENT') else line
class Char(Base):
def __init__(self):
Base.__init__(self)
self.code = -1
self.swidth = None
self.dwidth = None
self.data = None
@staticmethod
def bitmap(data, row_size):
bitmap = ''
for index in range(0, len(data), row_size):
bitmap += data[index : index + row_size].hex() + '\n'
return bytes(bitmap, 'ascii').upper()
def _read(self, input):
# HEADER
read_next = lambda: input.read_lines(lambda line: self.keep_comments(line))
read_prop = lambda name, callback=None: self.props.parse(read_next(), name, callback)
read_prop('STARTCHAR')
self.code = read_prop('ENCODING', fnutil.parse_dec)
self.swidth = read_prop('SWIDTH', lambda _, value: Width.parse_s(value))
self.dwidth = read_prop('DWIDTH', lambda _, value: Width.parse_d(value))
self.bbx = read_prop('BBX', BBX.parse)
line = read_next()
if line and line.startswith(b'ATTRIBUTES'):
self.props.parse(line, 'ATTRIBUTES')
line = read_next()
# BITMAP
if self.props.parse(line, 'BITMAP') != b'':
raise Exception('BITMAP expected')
row_len = self.bbx.row_size() * 2
bitmap = b''
for _ in range(0, self.bbx.height):
line = read_next()
if not line:
raise Exception('bitmap data expected')
if len(line) == row_len:
bitmap += line
else:
raise Exception('invalid bitmap length')
# FINAL
if input.read_lines(lambda line: self.keep_finishes(line)) != b'ENDCHAR':
raise Exception('ENDCHAR expected')
self.data = codecs.decode(bitmap, 'hex') # no spaces allowed
return self
@staticmethod
def read(input):
return Char()._read(input) # pylint: disable=protected-access
def write(self, output):
for [name, value] in self.props:
output.write_prop(name, value)
output.write_line(Char.bitmap(self.data, self.bbx.row_size()) + b'\n'.join(self.finis))
@unique
class XLFD(IntEnum):
FOUNDRY = 1
FAMILY_NAME = 2
WEIGHT_NAME = 3
SLANT = 4
SETWIDTH_NAME = 5
ADD_STYLE_NAME = 6
PIXEL_SIZE = 7
POINT_SIZE = 8
RESOLUTION_X = 9
RESOLUTION_Y = 10
SPACING = 11
AVERAGE_WIDTH = 12
CHARSET_REGISTRY = 13
CHARSET_ENCODING = 14
CHARS_MAX = 65535
class Font(Base):
def __init__(self):
Base.__init__(self)
self.xlfd = []
self.chars = []
self.default_code = -1
def get_ascent(self):
ascent = self.props.get('FONT_ASCENT')
if ascent is not None:
return fnutil.parse_dec('FONT_ASCENT', ascent, -HEIGHT_MAX, HEIGHT_MAX)
return self.bbx.height + self.bbx.yoff
def get_bold(self):
return int(b'bold' in self.xlfd[XLFD.WEIGHT_NAME].lower())
def get_italic(self):
return int(re.search(b'^[IO]', self.xlfd[XLFD.SLANT]) is not None)
def _read(self, input):
# HEADER
read_next = lambda: input.read_lines(lambda line: self.keep_comments(line))
read_prop = lambda name, callback=None: self.props.parse(read_next(), name, callback)
line = input.read_lines(Font.skip_empty)
if self.props.parse(line, 'STARTFONT') != b'2.1':
raise Exception('STARTFONT 2.1 expected')
self.xlfd = read_prop('FONT', lambda name, value: value.split(b'-', 15))
if len(self.xlfd) != 15 or self.xlfd[0] != b'':
raise Exception('non-XLFD font names are not supported')
read_prop('SIZE')
self.bbx = read_prop('FONTBOUNDINGBOX', BBX.parse)
line = read_next()
if line and line.startswith(b'STARTPROPERTIES'):
num_props = self.props.parse(line, 'STARTPROPERTIES', fnutil.parse_dec)
for _ in range(0, num_props):
line = read_next()
if not line:
raise Exception('property expected')
match = re.fullmatch(br'(\w+)\s+([-\d"].*)', line)
if not match:
raise Exception('invalid property format')
name = str(match.group(1), 'ascii')
value = match.group(2)
if name == 'DEFAULT_CHAR':
self.default_code = fnutil.parse_dec(name, value)
self.props.add(name, value)
if read_prop('ENDPROPERTIES') != b'':
raise Exception('ENDPROPERTIES expected')
line = read_next()
# GLYPHS
num_chars = self.props.parse(line, 'CHARS', lambda name, value: fnutil.parse_dec(name, value, 1, CHARS_MAX))
for _ in range(0, num_chars):
self.chars.append(Char.read(input))
if next((char.code for char in self.chars if char.code == self.default_code), -1) != self.default_code:
raise Exception('invalid DEFAULT_CHAR')
# FINAL
if input.read_lines(lambda line: self.keep_finishes(line)) != b'ENDFONT':
raise Exception('ENDFONT expected')
if input.read_lines(Font.skip_empty):
raise Exception('garbage after ENDFONT')
return self
@staticmethod
def read(input):
return Font()._read(input) # pylint: disable=protected-access
@staticmethod
def skip_empty(line):
return line if line else None
def write(self, output):
for [name, value] in self.props:
output.write_prop(name, value)
for char in self.chars:
char.write(output)
output.write_line(b'\n'.join(self.finis))

263
bin/bdftofnt.js Normal file
View File

@ -0,0 +1,263 @@
//
// Copyright (c) 2019 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
'use strict';
const tty = require('tty');
const fnutil = require('./fnutil.js');
const fncli = require('./fncli.js');
const fnio = require('./fnio.js');
const bdf = require('./bdf.js');
const bmpf = require('./bmpf.js');
class Params extends fncli.Params {
constructor() {
super();
this.charSet = -1;
this.minChar = -1;
this.fntFamily = 0;
this.output = null;
}
}
const HELP = ('' +
'usage: bdftofnt [-c CHARSET] [-m MINCHAR] [-f FAMILY] [-o OUTPUT] [INPUT]\n' +
'Convert a BDF font to Windows FNT\n' +
'\n' +
' -c CHARSET fnt character set (default = 0, see wingdi.h ..._CHARSET)\n' +
' -m MINCHAR fnt minimum character code (8-bit CP decimal, not unicode)\n' +
' -f FAMILY fnt family: DontCare, Roman, Swiss, Modern or Decorative\n' +
' -o OUTPUT output file (default = stdout, must not be a terminal)\n' +
' --help display this help and exit\n' +
' --version display the program version and license, and exit\n' +
' --excstk display the exception stack on error\n' +
'\n' +
'The input must be a BDF 2.1 font encoded in the unicode range.\n');
const VERSION = 'bdftofnt 1.55, Copyright (C) 2019 Dimitar Toshkov Zhekov\n\n' + fnutil.GPL2PLUS_LICENSE;
const FNT_FAMILIES = [ 'DontCare', 'Roman', 'Swiss', 'Modern', 'Decorative' ];
class Options extends fncli.Options {
constructor() {
super(['-c', '-m', '-f', '-o'], HELP, VERSION);
}
parse(name, value, params) {
switch (name) {
case '-c':
params.charSet = fnutil.parseDec('charset', value, 0, 255);
break;
case '-m':
params.minChar = fnutil.parseDec('minchar', value, 0, 255);
break;
case '-f':
params.fntFamily = FNT_FAMILIES.indexOf(value);
if (params.fntFamily === -1) {
throw new Error('invalid fnt family');
}
break;
case '-o':
params.output = value;
break;
default:
this.fallback(name, params);
}
}
}
function mainProgram(nonopt, parsed) {
const WIN_FONTHEADERSIZE = 118;
if (nonopt.length > 1) {
throw new Error('invalid number of arguments, try --help');
}
let charSet = parsed.charSet;
let minChar = parsed.minChar;
// READ INPUT
let ifs = new fnio.InputStream(nonopt[0]);
try {
var font = bmpf.Font.read(ifs);
ifs.close();
} catch (e) {
e.message = ifs.location() + e.message;
throw e;
}
// COMPUTE
if (charSet === -1) {
const encoding = font.xlfd[bdf.XLFD.CHARSET_ENCODING];
if (encoding.toLowerCase().match(/^(cp)?125[0-8]$/)) {
const FNT_CHARSETS = [238, 204, 0, 161, 162, 177, 178, 186, 163];
charSet = FNT_CHARSETS[parseInt(encoding.substring(encoding.length - 1), 10)];
} else {
charSet = 255;
}
}
try {
const numChars = font.chars.length;
if (numChars > 256) {
throw new Error('too many characters, the maximum is 256');
}
if (minChar === -1) {
if (numChars === 192 || numChars === 256) {
minChar = 256 - numChars;
} else {
minChar = font.chars[0].code;
}
}
var maxChar = minChar + numChars - 1;
if (maxChar >= 256) {
throw new Error('the maximum character code is too big, (re)specify -m');
}
// HEADER
var vtell = WIN_FONTHEADERSIZE + (numChars + 1) * 4;
var bitsOffset = vtell;
var ctable = [];
var widthBytes = 0;
// CTABLE/GLYPHS
font.chars.forEach(char => {
const rowSize = char.rowSize();
ctable.push(char.width);
ctable.push(vtell);
vtell += rowSize * font.bbx.height;
widthBytes += rowSize;
});
if (vtell > 0xFFFF) {
throw new Error('too much character data');
}
// SENTINEL
var sentinel = 2 - widthBytes % 2;
ctable.push(sentinel * 8);
ctable.push(vtell);
vtell += sentinel * font.bbx.height;
widthBytes += sentinel;
if (widthBytes > 0xFFFF) {
throw new Error('the total character width is too big');
}
} catch (e) {
e.message = ifs.location() + e.message;
throw e;
}
// WRITE
let ofs = new fnio.OutputStream(parsed.output);
if (tty.isatty(ofs.fd)) {
throw new Error('binary output may not be send to a terminal, use -o or redirect/pipe it');
}
try {
// HEADER
const family = font.xlfd[bdf.XLFD.FAMILY_NAME];
const proportional = font.getProportional();
let copyright = font.props.get('COPYRIGHT');
copyright = (copyright != null) ? fnutil.unquote(copyright).substring(0, 60) : '';
ofs.write16(0x0200); // font version
ofs.write32(vtell + family.length + 1); // total size
ofs.writeZStr(copyright, 60 - copyright.length);
ofs.write16(0); // gdi, device type
ofs.write16(fnutil.round(font.bbx.height * 72 / 96));
ofs.write16(96); // vertical resolution
ofs.write16(96); // horizontal resolution
ofs.write16(font.getAscent()); // base line
ofs.write16(0); // internal leading
ofs.write16(0); // external leading
ofs.write8(font.getItalic());
ofs.write8(0); // underline
ofs.write8(0); // strikeout
ofs.write16(400 + 300 * font.getBold());
ofs.write8(charSet);
ofs.write16(proportional ? 0 : font.avgWidth);
ofs.write16(font.bbx.height);
ofs.write8((parsed.fntFamily << 4) + proportional);
ofs.write16(font.avgWidth);
ofs.write16(font.bbx.width);
ofs.write8(minChar);
ofs.write8(maxChar);
let defaultIndex = maxChar - minChar;
let breakIndex = 0;
if (font.defaultCode !== -1) {
defaultIndex = font.chars.findIndex(char => char.code === font.defaultCode);
}
if (minChar <= 0x20 && maxChar >= 0x20) {
breakIndex = 0x20 - minChar;
}
ofs.write8(defaultIndex);
ofs.write8(breakIndex);
ofs.write16(widthBytes);
ofs.write32(0); // device name
ofs.write32(vtell);
ofs.write32(0); // gdi bits pointer
ofs.write32(bitsOffset);
ofs.write8(0); // reserved
// CTABLE
ctable.forEach(value => ofs.write16(value));
// GLYPHS
let data = Buffer.alloc(font.bbx.height * font.bbx.rowSize());
font.chars.forEach(char => {
const rowSize = char.rowSize();
let counter = 0;
// MS coordinates
for (let n = 0; n < rowSize; n++) {
for (let y = 0; y < font.bbx.height; y++) {
data[counter++] = char.data[rowSize * y + n];
}
}
ofs.write(data.slice(0, counter));
});
ofs.write(Buffer.alloc(sentinel * font.bbx.height));
// FAMILY
ofs.writeZStr(family, 1);
ofs.close();
} catch (e) {
e.message = ofs.location() + e.message + ofs.destroy();
throw e;
}
}
if (require.main === module) {
fncli.start('bdftofnt.js', new Options(), new Params(), mainProgram);
}

228
bin/bdftofnt.py Normal file
View File

@ -0,0 +1,228 @@
#
# Copyright (c) 2019 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
import re
import fnutil
import fncli
import fnio
import bdf
import bmpf
class Params(fncli.Params):
def __init__(self):
fncli.Params.__init__(self)
self.char_set = -1
self.min_char = -1
self.fnt_family = 0
self.output = None
HELP = ('' +
'usage: bdftofnt [-c CHARSET] [-m MINCHAR] [-f FAMILY] [-o OUTPUT] [INPUT]\n' +
'Convert a BDF font to Windows FNT\n' +
'\n' +
' -c CHARSET fnt character set (default = 0, see wingdi.h ..._CHARSET)\n' +
' -m MINCHAR fnt minimum character code (8-bit CP decimal, not unicode)\n' +
' -f FAMILY fnt family: DontCare, Roman, Swiss, Modern or Decorative\n' +
' -o OUTPUT output file (default = stdout, must not be a terminal)\n' +
' --help display this help and exit\n' +
' --version display the program version and license, and exit\n' +
' --excstk display the exception stack on error\n' +
'\n' +
'The input must be a BDF font encoded in the unicode range.\n')
VERSION = 'bdftofnt 1.55, Copyright (C) 2019 Dimitar Toshkov Zhekov\n\n' + fnutil.GPL2PLUS_LICENSE
FNT_FAMILIES = ['DontCare', 'Roman', 'Swiss', 'Modern', 'Decorative']
class Options(fncli.Options):
def __init__(self):
fncli.Options.__init__(self, ['-c', '-m', '-f', '-o'], HELP, VERSION)
def parse(self, name, value, params):
if name == '-c':
params.char_set = fnutil.parse_dec('charset', value, 0, 255)
elif name == '-m':
params.min_char = fnutil.parse_dec('minchar', value, 0, 255)
elif name == '-f':
if value in FNT_FAMILIES:
params.fnt_family = FNT_FAMILIES.index(value)
else:
raise Exception('invalid fnt family')
elif name == '-o':
params.output = value
else:
self.fallback(name, params)
WIN_FONTHEADERSIZE = 118
FNT_CHARSETS = [238, 204, 0, 161, 162, 177, 178, 186, 163]
def main_program(nonopt, parsed):
if len(nonopt) > 1:
raise Exception('invalid number of arguments, try --help')
char_set = parsed.char_set
min_char = parsed.min_char
# READ INPUT
ifs = fnio.InputStream(nonopt[0] if nonopt else None)
try:
font = bmpf.Font.read(ifs)
ifs.close()
except Exception as ex:
raise Exception(ifs.location() + str(ex))
# COMPUTE
if char_set == -1:
encoding = font.xlfd[bdf.XLFD.CHARSET_ENCODING]
if re.fullmatch(b'(cp)?125[0-8]', encoding.lower()):
char_set = FNT_CHARSETS[int(encoding[-1:])]
else:
char_set = 255
try:
num_chars = len(font.chars)
if num_chars > 256:
raise Exception('too many characters, the maximum is 256')
if min_char == -1:
if num_chars in [192, 256]:
min_char = 256 - num_chars
else:
min_char = font.chars[0].code
max_char = min_char + num_chars - 1
if max_char >= 256:
raise Exception('the maximum character code is too big, (re)specify -m')
# HEADER
vtell = WIN_FONTHEADERSIZE + (num_chars + 1) * 4
bits_offset = vtell
ctable = []
width_bytes = 0
# CTABLE/GLYPHS
for char in font.chars:
row_size = char.row_size()
ctable.append(char.width)
ctable.append(vtell)
vtell += row_size * font.bbx.height
width_bytes += row_size
if vtell > 0xFFFF:
raise Exception('too much character data')
# SENTINEL
sentinel = 2 - width_bytes % 2
ctable.append(sentinel * 8)
ctable.append(vtell)
vtell += sentinel * font.bbx.height
width_bytes += sentinel
if width_bytes > 0xFFFF:
raise Exception('the total character width is too big')
except Exception as ex:
raise Exception(ifs.location() + str(ex))
# WRITE
ofs = fnio.OutputStream(parsed.output)
if ofs.file.isatty():
raise Exception('binary output may not be send to a terminal, use -o or redirect/pipe it')
try:
# HEADER
family = font.xlfd[bdf.XLFD.FAMILY_NAME]
copyright = font.props.get('COPYRIGHT')
copyright = fnutil.unquote(copyright)[:60] if copyright is not None else b''
proportional = font.get_proportional()
ofs.write16(0x0200) # font version
ofs.write32(vtell + len(family) + 1) # total size
ofs.write_zstr(copyright, 60 - len(copyright))
ofs.write16(0) # gdi, device type
ofs.write16(round(font.bbx.height * 72 / 96))
ofs.write16(96) # vertical resolution
ofs.write16(96) # horizontal resolution
ofs.write16(font.get_ascent()) # base line
ofs.write16(0) # internal leading
ofs.write16(0) # external leading
ofs.write8(font.get_italic())
ofs.write8(0) # underline
ofs.write8(0) # strikeout
ofs.write16(400 + 300 * font.get_bold())
ofs.write8(char_set)
ofs.write16(0 if proportional else font.bbx.width)
ofs.write16(font.bbx.height)
ofs.write8((parsed.fnt_family << 4) + proportional)
ofs.write16(font.avg_width)
ofs.write16(font.bbx.width)
ofs.write8(min_char)
ofs.write8(max_char)
default_index = max_char - min_char
break_index = 0
if font.default_code != -1:
default_index = next(index for index, char in enumerate(font.chars) if char.code == font.default_code)
if min_char <= 0x20 <= max_char:
break_index = 0x20 - min_char
ofs.write8(default_index)
ofs.write8(break_index)
ofs.write16(width_bytes)
ofs.write32(0) # device name
ofs.write32(vtell)
ofs.write32(0) # gdi bits pointer
ofs.write32(bits_offset)
ofs.write8(0) # reserved
# CTABLE
for value in ctable:
ofs.write16(value)
# GLYPHS
data = bytearray(font.bbx.height * font.bbx.row_size())
for char in font.chars:
row_size = char.row_size()
counter = 0
# MS coordinates
for n in range(0, row_size):
for y in range(0, font.bbx.height):
data[counter] = char.data[row_size * y + n]
counter += 1
ofs.write(data[:counter])
ofs.write(bytes(sentinel * font.bbx.height))
# FAMILY
ofs.write_zstr(family, 1)
ofs.close()
except Exception as ex:
raise Exception(ofs.location() + str(ex) + ofs.destroy())
if __name__ == '__main__':
fncli.start('bdftofnt.py', Options(), Params(), main_program)

296
bin/bdftopsf.js Normal file
View File

@ -0,0 +1,296 @@
//
// Copyright (c) 2019 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
'use strict';
const tty = require('tty');
const fnutil = require('./fnutil.js');
const fncli = require('./fncli.js');
const fnio = require('./fnio.js');
const bmpf = require('./bmpf.js');
class Params extends fncli.Params {
constructor() {
super();
this.version = -1;
this.exchange = -1;
this.output = null;
}
}
const HELP = ('' +
'usage: bdftopsf [-1|-2|-r] [-g|-G] [-o OUTPUT] [INPUT.bdf] [TABLE...]\n' +
'Convert a BDF font to PC Screen Font or raw font\n' +
'\n' +
' -1, -2 write a PSF version 1 or 2 font (default = 1 if possible)\n' +
' -r, --raw write a RAW font\n' +
' -g, --vga exchange the characters at positions 0...31 with these at\n' +
' 192...223 (default for VGA text mode compliant PSF fonts\n' +
' with 224 to 512 characters starting with unicode 00A3)\n' +
' -G do not exchange characters 0...31 and 192...223\n' +
' -o OUTPUT output file (default = stdout, must not be a terminal)\n' +
' --help display this help and exit\n' +
' --version display the program version and license, and exit\n' +
' --excstk display the exception stack on error\n' +
'\n' +
'The input must be a monospaced unicode-encoded BDF 2.1 font.\n' +
'\n' +
'The tables are text files with two or more hexadecimal unicodes per line:\n' +
'a character code from the BDF, and extra code(s) for it. All extra codes\n' +
'are stored sequentially in the PSF unicode table for their character.\n' +
'<ss> is always specified as FFFE, although it is stored as FE in PSF2.\n');
const VERSION = 'bdftopsf 1.50, Copyright (C) 2019 Dimitar Toshkov Zhekov\n\n' + fnutil.GPL2PLUS_VERSION;
class Options extends fncli.Options {
constructor() {
super(['-o'], HELP, VERSION);
}
parse(name, value, params) {
switch (name) {
case '-1':
case '-2':
params.version = parseInt(name[1]);
break;
case '-r':
case '--raw':
params.version = 0;
break;
case '-g':
case '--vga':
params.exchange = true;
break;
case '-G':
params.exchange = false;
break;
case '-o':
params.output = value;
break;
default:
this.fallback(name, params);
}
}
}
function mainProgram(nonopt, parsed) {
const bdfile = nonopt.length > 0 && nonopt[0].toLowerCase().endsWith('.bdf');
let version = parsed.version;
let exchange = parsed.exchange;
let ver1Unicodes = true;
// READ INPUT
let ifs = new fnio.InputStream(bdfile ? nonopt[0] : null);
try {
var font = bmpf.Font.read(ifs);
ifs.close();
font.chars.forEach(char => {
const prefix = `char ${char.code}: `;
if (char.width !== font.bbx.width) {
throw new Error(prefix + 'output width not equal to maximum output width');
}
if (char.code === 65534) {
throw new Error(prefix + 'not a character, use 65535 for empty position');
}
if (char.code >= 65536) {
if (version === 1) {
throw new Error(prefix + '-1 requires unicodes <= 65535');
}
ver1Unicodes = false;
}
});
// VERSION
var ver1NumChars = (font.chars.length === 256 || font.chars.length === 512);
if (version === 1) {
if (!ver1NumChars) {
throw new Error('-1 requires a font with 256 or 512 characters');
}
if (font.bbx.width !== 8) {
throw new Error('-1 requires a font with width 8');
}
}
// EXCHANGE
var vgaNumChars = font.chars.length >= 224 && font.chars.length <= 512;
var vgaTextSize = font.bbx.width === 8 && [8, 14, 16].indexOf(font.bbx.height) !== -1;
if (exchange === true) {
if (!vgaNumChars) {
throw new Error('-g/--vga requires a font with 224...512 characters');
}
if (!vgaTextSize) {
throw new Error('-g/--vga requires an 8x8, 8x14 or 8x16 font');
}
}
} catch (e) {
e.message = ifs.location() + e.message;
throw e;
}
// READ TABLES
let tables = [];
function loadExtra(line) {
const words = line.split(/\s+/);
if (words.length < 2) {
throw new Error('invalid format');
}
const uni = fnutil.parseHex('unicode', words[0]);
let table = tables[uni];
if (uni === 0xFFFE) {
throw new Error('FFFE is not a character');
}
if (font.chars.findIndex(char => char.code === uni) !== -1) {
if (uni >= 0x10000) {
ver1Unicodes = false;
}
if (table == null) {
table = tables[uni] = [];
}
words.slice(1).forEach(word => {
const dup = fnutil.parseHex('extra code', word);
if (dup === 0xFFFF) {
throw new Error('FFFF is not a character');
}
if (dup >= 0x10000) {
ver1Unicodes = false;
}
if (table.indexOf(dup) === -1 || table.indexOf(0xFFFE) !== -1) {
table.push(dup);
}
});
if (version === 1 && !ver1Unicodes) {
throw new Error('-1 requires unicodes <= FFFF');
}
}
}
nonopt.slice(Number(bdfile)).forEach(name => {
ifs = new fnio.InputStream(name);
try {
ifs.readLines(loadExtra);
ifs.close();
} catch (e) {
e.message = ifs.location() + e.message;
throw e;
}
});
// VERSION
if (version === -1) {
version = ver1NumChars && ver1Unicodes && font.bbx.width === 8 ? 1 : 2;
}
// EXCHANGE
if (exchange === -1) {
exchange = vgaTextSize && version >= 1 && vgaNumChars && font.chars[0].code === 0x00A3;
}
if (exchange) {
const control = font.chars.splice(0, 32, ...font.chars.splice(192, 32));
font.chars.splice(192, 0, ...control);
}
// WRITE
let ofs = new fnio.OutputStream(parsed.output);
if (tty.isatty(ofs.fd)) {
throw new Error('binary output may not be send to a terminal, use -o or redirect/pipe it');
}
try {
// HEADER
if (version === 1) {
ofs.write8(0x36);
ofs.write8(0x04);
ofs.write8((font.chars.length >> 8) + 1);
ofs.write8(font.bbx.height);
} else if (version === 2) {
ofs.write32(0x864AB572);
ofs.write32(0x00000000);
ofs.write32(0x00000020);
ofs.write32(0x00000001);
ofs.write32(font.chars.length);
ofs.write32(font.chars[0].data.length);
ofs.write32(font.bbx.height);
ofs.write32(font.bbx.width);
}
// GLYPHS
font.chars.forEach(char => ofs.write(char.data));
// UNICODES
if (version > 0) {
const writeUnicode = function(code) {
if (version === 1) {
ofs.write16(code);
} else if (code <= 0x7F) {
ofs.write8(code);
} else if (code === 0xFFFE || code === 0xFFFF) {
ofs.write8(code & 0xFF);
} else {
if (code <= 0x7FF) {
ofs.write8(0xC0 + (code >> 6));
} else {
if (code <= 0xFFFF) {
ofs.write8(0xE0 + (code >> 12));
} else {
ofs.write8(0xF0 + (code >> 18));
ofs.write8(0x80 + ((code >> 12) & 0x3F));
}
ofs.write8(0x80 + ((code >> 6) & 0x3F));
}
ofs.write8(0x80 + (code & 0x3F));
}
};
font.chars.forEach(char => {
if (char.code !== 0xFFFF) {
writeUnicode(char.code);
}
if (tables[char.code] != null) {
tables[char.code].forEach(extra => writeUnicode(extra));
}
writeUnicode(0xFFFF);
});
}
// FINISH
ofs.close();
} catch (e) {
e.message = ofs.location() + e.message + ofs.destroy();
throw e;
}
}
if (require.main === module) {
fncli.start('bdftopsf.js', new Options(), new Params(), mainProgram);
}

254
bin/bdftopsf.py Normal file
View File

@ -0,0 +1,254 @@
#
# Copyright (c) 2019 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
import re
import fnutil
import fncli
import fnio
import bmpf
class Params(fncli.Params):
def __init__(self):
fncli.Params.__init__(self)
self.version = -1
self.exchange = -1
self.output = None
HELP = ('' +
'usage: bdftopsf [-1|-2|-r] [-g|-G] [-o OUTPUT] [INPUT.bdf] [TABLE...]\n' +
'Convert a BDF font to PC Screen Font or raw font\n' +
'\n' +
' -1, -2 write a PSF version 1 or 2 font (default = 1 if possible)\n' +
' -r, --raw write a RAW font\n' +
' -g, --vga exchange the characters at positions 0...31 with these at\n' +
' 192...223 (default for VGA text mode compliant PSF fonts\n' +
' with 224 to 512 characters starting with unicode 00A3)\n' +
' -G do not exchange characters 0...31 and 192...223\n' +
' -o OUTPUT output file (default = stdout, must not be a terminal)\n' +
' --help display this help and exit\n' +
' --version display the program version and license, and exit\n' +
' --excstk display the exception stack on error\n' +
'\n' +
'The input must be a monospaced unicode-encoded BDF 2.1 font.\n' +
'\n' +
'The tables are text files with two or more hexadecimal unicodes per line:\n' +
'a character code from the BDF, and extra code(s) for it. All extra codes\n' +
'are stored sequentially in the PSF unicode table for their character.\n' +
'<ss> is always specified as FFFE, although it is stored as FE in PSF2.\n')
VERSION = 'bdftopsf 1.50, Copyright (C) 2019 Dimitar Toshkov Zhekov\n\n' + fnutil.GPL2PLUS_LICENSE
class Options(fncli.Options):
def __init__(self):
fncli.Options.__init__(self, ['-o'], HELP, VERSION)
def parse(self, name, value, params):
if name in ['-1', '-2']:
params.version = int(name[1])
elif name in ['-r', '--raw']:
params.version = 0
elif name in ['-g', '--vga']:
params.exchange = True
elif name == '-G':
params.exchange = False
elif name == '-o':
params.output = value
else:
self.fallback(name, params)
def main_program(nonopt, parsed):
version = parsed.version
exchange = parsed.exchange
bdfile = len(nonopt) > 0 and nonopt[0].lower().endswith('.bdf')
ver1_unicodes = True
# READ INPUT
ifs = fnio.InputStream(nonopt[0] if bdfile else None)
try:
font = bmpf.Font.read(ifs)
ifs.close()
for char in font.chars:
prefix = 'char %d: ' % char.code
if char.width != font.bbx.width:
raise Exception(prefix + 'output width not equal to maximum output width')
if char.code == 65534:
raise Exception(prefix + 'not a character, use 65535 for empty position')
if char.code >= 65536:
if version == 1:
raise Exception(prefix + '-1 requires unicodes <= 65535')
ver1_unicodes = False
# VERSION
ver1_num_chars = len(font.chars) == 256 or len(font.chars) == 512
if version == 1:
if not ver1_num_chars:
raise Exception('-1 requires a font with 256 or 512 characters')
if font.bbx.width != 8:
raise Exception('-1 requires a font with width 8')
# EXCHANGE
vga_num_chars = len(font.chars) >= 224 and len(font.chars) <= 512
vga_text_size = font.bbx.width == 8 and font.bbx.height in [8, 14, 16]
if exchange is True:
if not vga_num_chars:
raise Exception('-g/--vga requires a font with 224...512 characters')
if not vga_text_size:
raise Exception('-g/--vga requires an 8x8, 8x14 or 8x16 font')
except Exception as ex:
raise Exception(ifs.location() + str(ex))
# READ TABLES
tables = dict()
def load_extra(line):
nonlocal ver1_unicodes
words = re.split(br'\s+', line)
if len(words) < 2:
raise Exception('invalid format')
uni = fnutil.parse_hex('unicode', words[0])
if uni == 0xFFFE:
raise Exception('FFFE is not a character')
if next((char for char in font.chars if char.code == uni), None):
if uni >= 0x10000:
ver1_unicodes = False
if uni not in tables:
tables[uni] = []
table = tables[uni]
for word in words[1:]:
dup = fnutil.parse_hex('extra code', word)
if dup == 0xFFFF:
raise Exception('FFFF is not a character')
if dup >= 0x10000:
ver1_unicodes = False
if not dup in table or 0xFFFE in table:
tables[uni].append(dup)
if version == 1 and not ver1_unicodes:
raise Exception('-1 requires unicodes <= FFFF')
for name in nonopt[int(bdfile):]:
ifs = fnio.InputStream(name)
try:
ifs.read_lines(load_extra)
ifs.close()
except Exception as ex:
raise Exception(ifs.location() + str(ex))
# VERSION
if version == -1:
version = 1 if ver1_num_chars and ver1_unicodes and font.bbx.width == 8 else 2
# EXCHANGE
if exchange == -1:
exchange = vga_text_size and version >= 1 and vga_num_chars and font.chars[0].code == 0x00A3
if exchange:
font.chars = font.chars[192:224] + font.chars[32:192] + font.chars[0:32] + font.chars[224:]
# WRITE
ofs = fnio.OutputStream(parsed.output)
if ofs.file.isatty():
raise Exception('binary output may not be send to a terminal, use -o or redirect/pipe it')
try:
# HEADER
if version == 1:
ofs.write8(0x36)
ofs.write8(0x04)
ofs.write8((len(font.chars) >> 8) + 1)
ofs.write8(font.bbx.height)
elif version == 2:
ofs.write32(0x864AB572)
ofs.write32(0x00000000)
ofs.write32(0x00000020)
ofs.write32(0x00000001)
ofs.write32(len(font.chars))
ofs.write32(len(font.chars[0].data))
ofs.write32(font.bbx.height)
ofs.write32(font.bbx.width)
# GLYPHS
for char in font.chars:
ofs.write(char.data)
# UNICODES
if version > 0:
def write_unicode(code):
if version == 1:
ofs.write16(code)
elif code <= 0x7F:
ofs.write8(code)
elif code in [0xFFFE, 0xFFFF]:
ofs.write8(code & 0xFF)
else:
if code <= 0x7FF:
ofs.write8(0xC0 + (code >> 6))
else:
if code <= 0xFFFF:
ofs.write8(0xE0 + (code >> 12))
else:
ofs.write8(0xF0 + (code >> 18))
ofs.write8(0x80 + ((code >> 12) & 0x3F))
ofs.write8(0x80 + ((code >> 6) & 0x3F))
ofs.write8(0x80 + (code & 0x3F))
for char in font.chars:
if char.code != 0xFFFF:
write_unicode(char.code)
if char.code in tables:
for extra in tables[char.code]:
write_unicode(extra)
write_unicode(0xFFFF)
# FINISH
ofs.close()
except Exception as ex:
raise Exception(ofs.location() + str(ex) + ofs.destroy())
if __name__ == '__main__':
fncli.start('bdftopsf.py', Options(), Params(), main_program)

159
bin/bmpf.js Normal file
View File

@ -0,0 +1,159 @@
//
// Copyright (c) 2018 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
'use strict';
const fnutil = require('./fnutil.js');
const bdf = require('./bdf.js');
class Char {
constructor(code, name, width, data) {
this.code = code;
this.name = name;
this.width = width;
this.data = data;
}
static from(char, fbbox) {
const deltaYOff = char.bbx.yoff - fbbox.yoff; // ~DSB
let width;
let dstXOff;
if (char.dwidth.x >= 0) {
if (char.bbx.xoff >= 0) {
width = Math.max(char.bbx.width + char.bbx.xoff, char.dwidth.x);
dstXOff = char.bbx.xoff;
} else {
width = Math.max(char.bbx.width, char.dwidth.x - char.bbx.xoff);
dstXOff = 0;
}
} else {
dstXOff = Math.max(char.bbx.xoff - char.dwidth.x, 0);
width = char.bbx.width + dstXOff;
}
if (width > bdf.WIDTH_MAX) {
throw new Error(`char ${char.code}: output width > ${bdf.WIDTH_MAX}`);
}
if (char.bbx.yoff < fbbox.yoff) {
throw new Error(`char ${char.code}: BBX yoff < FONTBOUNDINGBOX yoff`);
}
const height = fbbox.height;
const srcRowSize = char.bbx.rowSize();
const dstRowSize = (width + 7) >> 3;
const dstYMax = height - deltaYOff;
const dstYMin = dstYMax - char.bbx.height;
const compatRow = dstXOff === 0 && width >= char.bbx.width;
let data;
if (compatRow && srcRowSize === dstRowSize && dstYMin === 0 && dstYMax === height) {
data = char.data;
} else if (dstYMin < 0) {
throw new Error(`char ${char.code}: start row ${dstYMin}`);
} else {
data = Buffer.alloc(dstRowSize * height);
for (let dstY = dstYMin; dstY < dstYMax; dstY++) {
let srcByteNo = (dstY - dstYMin) * srcRowSize;
let dstByteNo = dstY * dstRowSize + (dstXOff >> 3);
if (compatRow) {
char.data.copy(data, dstByteNo, srcByteNo, srcByteNo + srcRowSize);
} else {
let srcBitNo = 7;
let dstBitNo = 7 - (dstXOff & 7);
for (let x = 0; x < char.bbx.width; x++) {
if (char.data[srcByteNo] & (1 << srcBitNo)) {
data[dstByteNo] |= (1 << dstBitNo);
}
if (--srcBitNo < 0) {
srcBitNo = 7;
srcByteNo++;
}
if (--dstBitNo < 0) {
dstBitNo = 7;
dstByteNo++;
}
}
}
}
}
return new Char(char.code, char.props.get('STARTCHAR'), width, data);
}
packedSize() {
return (this.width * (this.data.length / this.rowSize()) + 7) >> 3;
}
rowSize() {
return (this.width + 7) >> 3;
}
write(output, height, yoffset) {
let header = `STARTCHAR ${this.name}\nENCODING ${this.code}\n`;
const swidth = fnutil.round(this.width * 1000 / height);
header += `SWIDTH ${swidth} 0\nDWIDTH ${this.width} 0\nBBX ${this.width} ${height} 0 ${yoffset}\n`;
output.writeLine(header + 'BITMAP\n' + bdf.Char.bitmap(this.data, this.rowSize()) + 'ENDCHAR');
}
}
class Font extends bdf.Font {
constructor() {
super();
this.minWidth = bdf.WIDTH_MAX;
this.avgWidth = 0;
}
_read(input) {
let totalWidth = 0;
super._read(input);
this.chars = this.chars.map(char => Char.from(char, this.bbx));
this.bbx.xoff = 0;
this.chars.forEach(char => {
this.minWidth = Math.min(this.minWidth, char.width);
this.bbx.width = Math.max(this.bbx.width, char.width);
totalWidth += char.width;
});
this.avgWidth = fnutil.round(totalWidth / this.chars.length);
this.props.set('FONTBOUNDINGBOX', this.bbx.toString());
return this;
}
static read(input) {
return (new Font())._read(input);
}
getProportional() {
return Number(this.bbx.width > this.minWidth);
}
write(output) {
this.props.forEach((name, value) => output.writeProp(name, value));
this.chars.forEach(char => char.write(output, this.bbx.height, this.bbx.yoff));
output.writeLine('ENDFONT');
}
}
module.exports = Object.freeze({
Char,
Font
});

147
bin/bmpf.py Normal file
View File

@ -0,0 +1,147 @@
#
# Copyright (c) 2018 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
import bdf
class Char:
def __init__(self, code, name, width, data):
self.code = code
self.name = name
self.width = width
self.data = data
@staticmethod
def from_bdf(char, fbbox):
delta_yoff = char.bbx.yoff - fbbox.yoff # ~DSB
if delta_yoff < 0:
raise Exception('char %d: BBX yoff < FONTBOUNDINGBOX yoff' % char.code)
if char.dwidth.x >= 0:
if char.bbx.xoff >= 0:
width = max(char.bbx.width + char.bbx.xoff, char.dwidth.x)
dst_xoff = char.bbx.xoff
else:
width = max(char.bbx.width, char.dwidth.x - char.bbx.xoff)
dst_xoff = 0
else:
dst_xoff = max(char.bbx.xoff - char.dwidth.x, 0)
width = char.bbx.width + dst_xoff
if width > bdf.WIDTH_MAX:
raise Exception('char %d: output width > %d' % (char.code, bdf.WIDTH_MAX))
height = fbbox.height
src_row_size = char.bbx.row_size()
dst_row_size = (width + 7) >> 3
dst_ymax = height - delta_yoff
dst_ymin = dst_ymax - char.bbx.height
compat_row = dst_xoff == 0 and width >= char.bbx.width
if compat_row and src_row_size == dst_row_size and dst_ymin == 0 and dst_ymax == height:
data = char.data
elif dst_ymin < 0:
raise Exception('char %d: start row %d' % (char.code, dst_ymin))
elif compat_row:
src_byte_no = 0
data = bytearray(dst_ymin * dst_row_size)
line_fill = bytes(dst_row_size - src_row_size)
for dst_y in range(dst_ymin, dst_ymax):
data += char.data[src_byte_no : src_byte_no + src_row_size] + line_fill
src_byte_no += src_row_size
data += bytes(delta_yoff * dst_row_size)
else:
data = bytearray(dst_row_size * height)
for dst_y in range(dst_ymin, dst_ymax):
src_byte_no = (dst_y - dst_ymin) * src_row_size
dst_byte_no = dst_y * dst_row_size + (dst_xoff >> 3)
src_bit_no = 7
dst_bit_no = 7 - (dst_xoff & 7)
for _ in range(0, char.bbx.width):
if char.data[src_byte_no] & (1 << src_bit_no):
data[dst_byte_no] |= (1 << dst_bit_no)
if src_bit_no > 0:
src_bit_no -= 1
else:
src_bit_no = 7
src_byte_no += 1
if dst_bit_no > 0:
dst_bit_no -= 1
else:
dst_bit_no = 7
dst_byte_no += 1
return Char(char.code, char.props.get('STARTCHAR'), width, data)
def row_size(self):
return (self.width + 7) >> 3
def write(self, output, max_width, yoffset):
output.write_line(b'STARTCHAR %s\nENCODING %d' % (self.name, self.code))
output.write_line(b'SWIDTH %d 0\nDWIDTH %d 0' % (round(self.width * 1000 / max_width), self.width))
output.write_line(b'BBX %d %d 0 %d' % (self.width, len(self.data) / self.row_size(), yoffset))
output.write_line(b'BITMAP\n' + bdf.Char.bitmap(self.data, self.row_size()) + b'ENDCHAR')
class Font(bdf.Font):
def __init__(self):
bdf.Font.__init__(self)
self.min_width = bdf.WIDTH_MAX
self.avg_width = 0
def _read(self, input):
bdf.Font._read(self, input)
self.chars = [Char.from_bdf(char, self.bbx) for char in self.chars]
self.bbx.xoff = 0
total_width = 0
for char in self.chars:
self.min_width = min(self.min_width, char.width)
self.bbx.width = max(self.bbx.width, char.width)
total_width += char.width
self.avg_width = round(total_width / len(self.chars))
self.props.set('FONTBOUNDINGBOX', bytes(str(self.bbx), 'ascii'))
return self
@staticmethod
def read(input):
return Font()._read(input) # pylint: disable=protected-access
def get_proportional(self):
return int(self.bbx.width > self.min_width)
def write(self, output):
for [name, value] in self.props:
output.write_prop(name, value)
for char in self.chars:
char.write(output, self.bbx.width, self.bbx.yoff)
output.write_line(b'ENDFONT')

173
bin/fncli.js Normal file
View File

@ -0,0 +1,173 @@
//
// Copyright (c) 2019 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
'use strict';
class Params {
constructor() {
this.excstk = false;
}
}
class Options {
constructor(needArgs, helpText, versionText) {
needArgs.forEach(name => {
if (!name.match(/^(-[^-]|--[^=]+)$/)) {
throw new Error(`invalid option name "${name}"`);
}
});
this.needArgs = needArgs;
this.helpText = helpText;
this.versionText = versionText;
}
posixlyCorrect() { // eslint-disable-line class-methods-use-this
return process.env['POSIXLY_CORRECT'] != null;
}
needsArg(name) {
return this.needArgs.includes(name);
}
fallback(name, params) {
if (name === '--excstk') {
params.excstk = true;
} else if (name === '--help' && this.helpText != null) {
process.stdout.write(this.helpText);
process.exit(0);
} else if (name === '--version' && this.versionText != null) {
process.stdout.write(this.versionText);
process.exit(0);
} else {
let suffix = this.needsArg(name) ? ' (taking an argument?)' : '';
suffix += (this.helpText != null) ? ', try --help' : '';
throw new Error(`unknown option "${name}"${suffix}`);
}
}
reader(args, skip = 2) {
return new Options.Reader(this, args, skip);
}
}
Options.Reader = class {
constructor(options, args, skip) {
this.options = options;
this.args = args;
this.skip = skip;
}
forEach(callback) {
let optind;
for (optind = this.skip; optind < this.args.length; optind++) {
let arg = this.args[optind];
if (arg === '-' || !arg.startsWith('-')) {
if (this.options.posixlyCorrect()) {
break;
}
callback(null, arg);
} else if (arg === '--') {
optind++;
break;
} else {
let name, value;
if (!arg.startsWith('--')) {
for (;;) {
name = arg.substring(0, 2);
value = (name !== arg) ? arg.substring(2) : null;
if (this.options.needsArg(name) || value == null) {
break;
}
callback(name, null);
arg = '-' + value;
}
} else if (arg.indexOf('=') >= 3) {
name = arg.split('=', 1)[0];
if (!this.options.needsArg(name)) {
throw new Error(`option "${name}" does not take an argument`);
}
value = arg.substring(name.length + 1);
} else {
name = arg;
value = null;
}
if (value === null && Number(this.options.needsArg(name)) > 0) {
if (++optind === this.args.length) {
throw new Error(`option "${name}" requires an argument`);
}
value = this.args[optind];
}
callback(name, value);
}
}
this.args.slice(optind).forEach(value => callback(null, value));
}
};
Object.defineProperty(Options, 'Reader', { 'enumerable': false });
Object.defineProperty(Options.Reader, 'name', { value: 'Reader' });
function start(programName, options, params, mainProgram) { // eslint-disable-line consistent-return
let parsed = (params != null) ? params : new Params();
try {
const version = process.version.match(/^v?(\d+)\.(\d+)/);
if (version.length < 3) {
throw new Error('unable to obtain node version');
} else if ((parseInt(version[1]) * 1000 + parseInt(version[2])) < 6009) {
throw new Error('node version 6.9.0 or later required');
}
if (params == null) {
return mainProgram(options.reader(process.argv), name => options.fallback(name, parsed));
} else {
let nonopt = [];
options.reader(process.argv).forEach((name, value) => {
if (name == null) {
nonopt.push(value);
} else {
options.parse(name, value, parsed);
}
});
return mainProgram(nonopt, parsed);
}
} catch (e) {
if (parsed.excstk) {
throw e;
} else {
process.stderr.write(`${process.argv.length >= 2 ? process.argv[1] : programName}: ${e.message}\n`);
process.exit(1);
}
}
}
module.exports = Object.freeze({
Params,
Options,
start
});

154
bin/fncli.py Normal file
View File

@ -0,0 +1,154 @@
#
# Copyright (c) 2019 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
import sys
import os
import re
class Params:
def __init__(self):
self.excstk = False
class Options:
def __init__(self, need_args, help_text, version_text):
for name in need_args:
if not re.fullmatch('(-[^-]|--[^=]+)', name):
raise Exception('invalid option name "%s"' % name)
self.need_args = need_args
self.help_text = help_text
self.version_text = version_text
def posixly_correct(self): # pylint: disable=no-self-use
return 'POSIXLY_CORRECT' in os.environ
def needs_arg(self, name):
return name in self.need_args
def fallback(self, name, params):
if name == '--excstk':
params.excstk = True
elif name == '--help' and self.help_text is not None:
sys.stdout.write(self.help_text)
sys.exit(0)
elif name == '--version' and self.version_text is not None:
sys.stdout.write(self.version_text)
sys.exit(0)
else:
suffix = ' (taking an argument?)' if self.needs_arg(name) else ''
suffix += ', try --help' if self.help_text is not None else ''
raise Exception('unknown option "%s"%s' % (name, suffix))
def reader(self, args, skip_zero=True):
return Options.Reader(self, args, skip_zero)
class Reader:
def __init__(self, options, args, skip_zero):
self.options = options
self.args = args
self.skip_zero = skip_zero
def __iter__(self):
return Options.Reader.Iterator(self)
class Iterator:
def __init__(self, reader):
self.options = reader.options
self.args = reader.args
self.optind = int(reader.skip_zero)
self.chrind = 1
self.endopt = False
def __next__(self):
if self.chrind == 0:
self.optind += 1
self.chrind = 1
if self.optind == len(self.args):
raise StopIteration
arg = self.args[self.optind]
if self.endopt or arg == '-' or not arg.startswith('-'):
self.endopt = self.options.posixly_correct()
name = None
value = arg
elif arg == '--':
self.chrind = 0
self.endopt = True
return next(self)
elif not arg.startswith('--'):
name = '-' + arg[self.chrind]
self.chrind += 1
if self.chrind < len(arg):
if not self.options.needs_arg(name):
return (name, None)
value = arg[self.chrind:]
else:
value = None
elif '=' in arg and arg.index('=') >= 3:
name = arg.split('=', 1)[0]
if not self.options.needs_arg(name):
raise Exception('option "%s" does not take an argument' % name)
value = arg[len(name) + 1:]
else:
name = arg
value = None
if value is None and int(self.options.needs_arg(name)) > 0:
self.optind += 1
if self.optind == len(self.args):
raise Exception('option "%s" requires an argument' % name)
value = self.args[self.optind]
self.chrind = 0
return (name, value)
def start(program_name, options, params, main_program):
parsed = Params() if params is None else params
try:
if sys.hexversion < 0x3050000:
raise Exception('python 3.5.0 or later required')
if params is None:
return main_program(options.reader(sys.argv), lambda name: options.fallback(name, parsed))
nonopt = []
for [name, value] in options.reader(sys.argv):
if name is None:
nonopt.append(value)
else:
options.parse(name, value, parsed)
return main_program(nonopt, parsed)
except Exception as ex:
if parsed.excstk:
raise
sys.stderr.write('%s: %s\n' % (sys.argv[0] if sys.argv[0] else program_name, str(ex)))
sys.exit(1)

213
bin/fnio.js Normal file
View File

@ -0,0 +1,213 @@
//
// Copyright (c) 2018 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
'use strict';
const fs = require('fs');
const BINARY_ENCODING = 'latin1';
(function() {
let orig = Buffer.alloc(256);
for (let i = 0; i < 256; i++) {
orig[i] = i;
}
const test = Buffer.from(orig.toString(BINARY_ENCODING), BINARY_ENCODING);
if (orig.compare(test) !== 0) {
throw new Error(`the ${BINARY_ENCODING} encoding is not 8-bit clean`);
}
})();
const BLOCK_SIZE = 4096;
class InputStream {
constructor(fileName, encoding = BINARY_ENCODING) {
if (fileName != null) {
this.fd = fs.openSync(fileName, 'r');
this.stName = fileName;
} else {
this.fd = process.stdin.fd;
this.stName = '<stdin>';
}
this.encoding = encoding;
this.lineNo = 0;
this.eof = false;
this.lines = [];
this.index = 0;
this.buffer = Buffer.alloc(BLOCK_SIZE);
this.remainder = '';
}
close() {
this.lineNo = 0;
this.eof = false;
fs.closeSync(this.fd);
}
location() {
let location = ' ';
if (this.eof) {
location = 'EOF: ';
} else if (this.lineNo > 0) {
location = `${this.lineNo}: `;
}
return `${this.stName}:${location}`;
}
_readBlock() {
for (;;) {
try {
return fs.readSync(this.fd, this.buffer, 0, BLOCK_SIZE);
} catch (e) {
if (e.code === 'EOF') {
return 0;
}
if (e.code !== 'EAGAIN') {
this.lineNo = 0;
this.eof = false;
throw e;
}
}
}
}
readLine() {
return this.readLines(line => line);
}
readLines(callback) {
let line;
do {
while (this.index < this.lines.length) {
this.lineNo++;
line = callback(this.lines[this.index++].trimRight());
if (line != null) {
return line;
}
}
var count = this._readBlock();
this.index = 0;
this.lines = (this.remainder + this.buffer.toString(this.encoding, 0, count)).split('\n');
this.remainder = this.lines.pop();
this.eof = false;
} while (count > 0);
if (this.remainder.length > 0) {
this.lineNo++;
line = callback(this.remainder.trimRight());
this.remainder = '';
} else {
this.eof = true;
line = null;
}
return line;
}
}
class OutputStream {
constructor(fileName) {
if (fileName != null) {
this.fd = fs.openSync(fileName, 'w');
this.stName = fileName;
} else {
this.fd = process.stdout.fd;
this.stName = '<stdout>';
}
this.fbbuf = Buffer.alloc(4);
this.closeAttempt = false;
}
close() {
this.closeAttempt = true;
fs.closeSync(this.fd);
}
destroy() {
let errors = '';
if (this.fd !== process.stdout.fd) {
if (!this.closeAttempt) {
try {
fs.closeSync(this.fd);
} catch (e) {
errors += `\n${this.stName}: close: ${e.message}`;
}
}
try {
fs.unlinkSync(this.stName);
} catch (e) {
errors += `\n${this.stName}: unlink: ${e.message}`;
}
}
return errors;
}
location() {
return this.stName + ': ';
}
write(buffer) {
fs.writeSync(this.fd, buffer, 0, buffer.length);
}
write8(value) {
this.fbbuf.writeUInt8(value, 0);
fs.writeSync(this.fd, this.fbbuf, 0, 1);
}
write16(value) {
this.fbbuf.writeUInt16LE(value, 0);
fs.writeSync(this.fd, this.fbbuf, 0, 2);
}
write32(value) {
this.fbbuf.writeUInt32LE(value, 0);
fs.writeSync(this.fd, this.fbbuf, 0, 4);
}
writeLine(bstr) {
fs.writeSync(this.fd, bstr + '\n', null, BINARY_ENCODING);
}
writeProp(name, value) {
this.writeLine((name + ' ' + value).trim());
}
writeZStr(bstr, numZeros) {
fs.writeSync(this.fd, bstr, null, BINARY_ENCODING);
this.write(Buffer.alloc(numZeros));
}
}
module.exports = Object.freeze({
BINARY_ENCODING,
InputStream,
OutputStream
});

141
bin/fnio.py Normal file
View File

@ -0,0 +1,141 @@
#
# Copyright (c) 2018 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
import codecs
import struct
import sys
import os
BINARY_ENCODING = '_fnio_binary'
class InputStream:
def __init__(self, file_name, encoding=BINARY_ENCODING):
if file_name is not None:
if encoding == BINARY_ENCODING:
self.file = open(file_name, 'rb')
else:
self.file = open(file_name, 'r', encoding=encoding)
self.st_name = file_name
else:
if encoding == BINARY_ENCODING:
self.file = sys.stdin.buffer
elif encoding is None:
self.file = sys.stdin
else:
self.file = codecs.getreader(encoding)(sys.stdin.buffer)
self.st_name = '<stdin>'
self.line_no = 0
self.eof = False
def close(self):
self.line_no = 0
self.eof = False
self.file.close()
def location(self):
return '%s:%s' % (self.st_name, 'EOF: ' if self.eof else '%d: ' % self.line_no if self.line_no > 0 else ' ')
def read_line(self):
return self.read_lines(lambda line: line)
def read_lines(self, callback):
try:
for line in self.file:
self.line_no += 1
self.eof = False
line = callback(line.rstrip())
if line is not None:
return line
except OSError:
self.line_no = 0
self.eof = False
raise
self.eof = True
return None
class OutputStream:
def __init__(self, file_name):
if file_name is not None:
self.file = open(file_name, 'wb')
self.st_name = file_name
else:
self.file = sys.stdout.buffer
self.st_name = '<stdout>'
self.close_attempt = False
def close(self):
self.close_attempt = True
self.file.close()
def destroy(self):
errors = ''
if self.file != sys.stdout.buffer:
if not self.close_attempt:
try:
self.file.close()
except Exception as ex:
errors += '\n%s: close: %s' % (self.st_name, str(ex))
try:
os.remove(self.st_name)
except Exception as ex:
errors += '\n%s: unlink: %s' % (self.st_name, str(ex))
return errors
def location(self):
return self.st_name + ': '
def write(self, buffer):
self.file.write(buffer)
def write8(self, value):
self.file.write(struct.pack('B', value))
def write16(self, value):
self.file.write(struct.pack('<H', value))
def write32(self, value):
self.file.write(struct.pack('<L', value))
def write_line(self, bstr):
self.file.write(bstr + b'\n')
def write_prop(self, name, value):
self.write_line((bytes(name, 'ascii') + b' ' + value).strip())
def write_zstr(self, bstr, num_zeros):
self.file.write(bstr + bytes(num_zeros))

120
bin/fnutil.js Normal file
View File

@ -0,0 +1,120 @@
//
// Copyright (c) 2018 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
'use strict';
const UNICODE_MAX = 1114111; // 0x10FFFF
function parseDec(name, s, minValue = 0, maxValue = UNICODE_MAX) {
if (s.match(/^\s*-?\d+\s*$/) == null) {
throw new Error(`invalid ${name} format`);
}
const value = parseInt(s, 10);
if (minValue != null && value < minValue) {
throw new Error(`${name} must be >= ${minValue}`);
}
if (maxValue != null && value > maxValue) {
throw new Error(`${name} must be <= ${maxValue}`);
}
return value;
}
function parseHex(name, s, minValue = 0, maxValue = UNICODE_MAX) {
if (s.match(/^\s*(0[xX])?[\dA-Fa-f]+\s*$/) == null) {
throw new Error(`invalid ${name} format`);
}
const value = parseInt(s, 16);
if (minValue != null && value < minValue) {
throw new Error(`${name} must be >= ` + minValue.toString(16).toUpperCase());
}
if (maxValue != null && value > maxValue) {
throw new Error(`${name} must be <= ` + maxValue.toString(16).toUpperCase());
}
return value;
}
function unihex(code) {
return ('000' + code.toString(16).toUpperCase()).replace(/0+(?=[\dA-F]{4})/, '');
}
function round(value) {
let result = Math.round(value);
return result - Number(result % 2 !== 0 && result - value === 0.5);
}
function quote(s) {
return '"' + s.replace(/"/g, '""') + '"';
}
function unquote(s, name) {
if (s.length >= 2 && s.startsWith('"') && s.endsWith('"')) {
s = s.substring(1, s.length - 1).replace(/""/g, '"');
} else if (name != null) {
throw new Error(name + ' must be quoted');
}
return s;
}
function warning(prefix, message) {
if (prefix.endsWith(':')) {
prefix += ' ';
} else if (prefix.length > 0 && !prefix.endsWith(': ')) {
prefix += ': ';
}
process.stderr.write(`${prefix}warning: ${message}\n`);
}
function splitWords(name, value, count) {
const words = value.split(/\s+/, count + 1);
if (words.length !== count) {
throw new Error(`${name} must contain ${count} values`);
}
return words;
}
const GPL2PLUS_LICENSE = ('' +
'This program is free software; you can redistribute it and/or\n' +
'modify it under the terms of the GNU General Public License as\n' +
'published by the Free Software Foundation; either version 2 of\n' +
'the License, or (at your option) any later version.\n' +
'\n' +
'This program is distributed in the hope that it will be useful,\n' +
'but WITHOUT ANY WARRANTY; without even the implied warranty of\n' +
'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n' +
'GNU General Public License for more details.\n');
module.exports = Object.freeze({
UNICODE_MAX,
parseDec,
parseHex,
unihex,
round,
quote,
unquote,
warning,
splitWords,
GPL2PLUS_LICENSE
});

92
bin/fnutil.py Normal file
View File

@ -0,0 +1,92 @@
#
# Copyright (c) 2018 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
import sys
import re
UNICODE_MAX = 1114111 # 0x10FFFF
def parse_dec(name, s, min_value=0, max_value=UNICODE_MAX):
try:
value = int(s)
except ValueError:
raise Exception('invalid %s format' % name)
if min_value is not None and value < min_value:
raise Exception('%s must be >= %d' % (name, min_value))
if max_value is not None and value > max_value:
raise Exception('%s must be <= %d' % (name, max_value))
return value
def parse_hex(name, s, min_value=0, max_value=UNICODE_MAX):
try:
value = int(s, 16)
except ValueError:
raise Exception('invalid %s format' % name)
if min_value is not None and value < min_value:
raise Exception('%s must be >= %X' % (name, min_value))
if max_value is not None and value > max_value:
raise Exception('%s must be <= %X' % (name, max_value))
return value
def quote(bstr):
return b'"%s"' % bstr.replace(b'"', b'""')
def unquote(bstr, name=None):
if len(bstr) >= 2 and bstr.startswith(b'"') and bstr.endswith(b'"'):
bstr = bstr[1 : len(bstr) - 1].replace(b'""', b'"')
elif name is not None:
raise Exception(name + ' must be quoted')
return bstr
def warning(prefix, message):
if prefix.endswith(':'):
prefix += ' '
elif prefix and not prefix.endswith(': '):
prefix += ': '
sys.stderr.write('%swarning: %s\n' % (prefix, message))
def split_words(name, bstr, count):
words = re.split(br'\s+', bstr, count)
if len(words) != count:
raise Exception('%s must contain %d values' % (name, count))
return words
GPL2PLUS_LICENSE = ('' +
'This program is free software; you can redistribute it and/or\n' +
'modify it under the terms of the GNU General Public License as\n' +
'published by the Free Software Foundation; either version 2 of\n' +
'the License, or (at your option) any later version.\n' +
'\n' +
'This program is distributed in the hope that it will be useful,\n' +
'but WITHOUT ANY WARRANTY; without even the implied warranty of\n' +
'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n' +
'GNU General Public License for more details.\n')

242
bin/ucstoany.js Normal file
View File

@ -0,0 +1,242 @@
//
// Copyright (c) 2019 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
'use strict';
const fnutil = require('./fnutil.js');
const fncli = require('./fncli.js');
const fnio = require('./fnio.js');
const bdf = require('./bdf.js');
class Params extends fncli.Params {
constructor() {
super();
this.filter = false;
this.family = null;
this.output = null;
}
}
const HELP = ('' +
'usage: ucstoany [-f] [-F FAMILY] [-o OUTPUT] INPUT REGISTRY ENCODING TABLE...\n' +
'Generate a BDF font subset.\n' +
'\n' +
' -f, --filter Discard characters with unicode FFFF; with registry ISO10646,\n' +
' encode the first 32 characters with their indexes; with other\n' +
' registries, encode all characters with indexes\n' +
' -F FAMILY output font family name (default = input)\n' +
' -o OUTPUT output file (default = stdout)\n' +
' TABLE text file, one hexadecimal unicode per line\n' +
' --help display this help and exit\n' +
' --version display the program version and license, and exit\n' +
' --excstk display the exception stack on error\n' +
'\n' +
'The input must be a BDF 2.1 font encoded in the unicode range.\n' +
'Unlike ucs2any, all TABLE-s form a single subset of the input font.\n');
const VERSION = 'ucstoany 1.55, Copyright (C) 2019 Dimitar Toshkov Zhekov\n\n' + fnutil.GPL2PLUS_LICENSE;
class Options extends fncli.Options {
constructor() {
super(['-F', '-o'], HELP, VERSION);
}
parse(name, value, params) {
switch (name) {
case '-f':
case '--filter':
params.filter = true;
break;
case '-F':
if (value.includes('-')) {
throw new Error('family name may not contain "-"');
}
params.family = value;
break;
case '-o':
params.output = value;
break;
default:
this.fallback(name, params);
}
}
}
function mainProgram(nonopt, parsed) {
if (nonopt.length < 4) {
throw new Error('invalid number of arguments, try --help');
}
const input = nonopt[0];
const registry = nonopt[1];
const encoding = nonopt[2];
let newCodes = [];
if (!registry.match(/^[A-Za-z][\w.:()]*$/) || !encoding.match(/^[\w.:()]+$/)) {
throw new Error('invalid registry or encoding');
}
// READ INPUT
let ifs = new fnio.InputStream(input);
try {
var oldFont = bdf.Font.read(ifs);
ifs.close();
} catch (e) {
e.message = ifs.location() + e.message;
throw e;
}
// READ TABLES
nonopt.slice(3).forEach(name => {
ifs = new fnio.InputStream(name);
try {
ifs.readLines(line => {
newCodes.push(fnutil.parseHex('unicode', line));
});
ifs.close();
} catch (e) {
e.message = ifs.location() + e.message;
throw e;
}
});
if (newCodes.length === 0) {
throw new Error('no characters in the output font');
}
// CREATE GLYPHS
let newFont = new bdf.Font();
let charMap = [];
let index = 0;
let unstart = 0;
if (parsed.filter) {
unstart = (registry === 'ISO10646') ? 32 : bdf.CHARS_MAX;
}
// faster than Map() for <= 4K chars
oldFont.chars.forEach(char => (charMap[char.code] = char));
newCodes.forEach(code => {
let oldChar = charMap[code];
let uniFFFF = (oldChar == null);
if (code === 0xFFFF && parsed.filter) {
index++;
return;
}
if (uniFFFF) {
if (code !== 0xFFFF) {
throw new Error(`${input} does not contain U+${fnutil.unihex(code)}`);
}
if (oldFont.defaultCode !== -1) {
oldChar = charMap[oldFont.defaultCode];
} else {
oldChar = charMap[0xFFFD];
if (oldChar == null) {
throw new Error(`${input} does not contain U+FFFF, and no replacement found`);
}
}
}
let newChar = Object.assign(new bdf.Char(), oldChar);
newChar.code = index >= unstart ? code : index;
index++;
newChar.props = newChar.props.clone();
newChar.props.set('ENCODING', newChar.code.toString());
newFont.chars.push(newChar);
if (uniFFFF) {
newChar.props.set('STARTCHAR', 'uniFFFF');
} else if (oldChar.code === oldFont.defaultCode || (oldChar.code === 0xFFFD && newFont.defaultCode === -1)) {
newFont.defaultCode = newChar.code;
}
});
// CREATE HEADER
let numProps;
let family = (parsed.family !== null) ? parsed.family : oldFont.xlfd[bdf.XLFD.FAMILY_NAME];
oldFont.props.forEach((name, value) => {
switch (name) {
case 'FONT':
newFont.xlfd = oldFont.xlfd.slice();
newFont.xlfd[bdf.XLFD.FAMILY_NAME] = family;
newFont.xlfd[bdf.XLFD.CHARSET_REGISTRY] = registry;
newFont.xlfd[bdf.XLFD.CHARSET_ENCODING] = encoding;
value = newFont.xlfd.join('-');
break;
case 'STARTPROPERTIES':
numProps = fnutil.parseDec(name, value, 1);
break;
case 'FAMILY_NAME':
value = fnutil.quote(family);
break;
case 'CHARSET_REGISTRY':
value = fnutil.quote(registry);
break;
case 'CHARSET_ENCODING':
value = fnutil.quote(encoding);
break;
case 'DEFAULT_CHAR':
if (newFont.defaultCode !== -1) {
value = newFont.defaultCode.toString();
} else {
numProps -= 1;
return;
}
break;
case 'ENDPROPERTIES':
if (newFont.defaultCode !== -1 && newFont.props.get('DEFAULT_CHAR') == null) {
newFont.props.add('DEFAULT_CHAR', newFont.defaultCode.toString());
numProps += 1;
}
newFont.props.set('STARTPROPERTIES', numProps.toString());
break;
case 'CHARS':
value = newFont.chars.length.toString();
break;
}
newFont.props.add(name, value);
});
// COPY FIELDS
newFont.bbx = oldFont.bbx;
newFont.finis = oldFont.finis;
// WRITE OUTPUT
let ofs = new fnio.OutputStream(parsed.output);
try {
newFont.write(ofs);
ofs.close();
} catch (e) {
e.message = ofs.location() + e.message + ofs.destroy();
throw e;
}
}
if (require.main === module) {
fncli.start('ucstoany.js', new Options(), new Params(), mainProgram);
}

204
bin/ucstoany.py Normal file
View File

@ -0,0 +1,204 @@
#
# Copyright (c) 2019 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
import re
import copy
import fnutil
import fncli
import fnio
import bdf
class Params(fncli.Params):
def __init__(self):
fncli.Params.__init__(self)
self.filter = False
self.family = None
self.output = None
HELP = ('' +
'usage: ucstoany [-f] [-F FAMILY] [-o OUTPUT] INPUT REGISTRY ENCODING TABLE...\n' +
'Generate a BDF font subset.\n' +
'\n' +
' -f, --filter Discard characters with unicode FFFF; with registry ISO10646,\n' +
' encode the first 32 characters with their indexes; with other\n' +
' registries, encode all characters with indexes\n' +
' -F FAMILY output font family name (default = input)\n' +
' -o OUTPUT output file (default = stdout)\n' +
' TABLE text file, one hexadecimal unicode per line\n' +
' --help display this help and exit\n' +
' --version display the program version and license, and exit\n' +
' --excstk display the exception stack on error\n' +
'\n' +
'The input must be a BDF 2.1 font encoded in the unicode range.\n' +
'Any COMMENT-s are discarded, duplicate properties are collapsed.\n' +
'Unlike ucs2any, all TABLE-s form a single subset of the input font.\n')
VERSION = 'ucstoany 1.55, Copyright (C) 2019 Dimitar Toshkov Zhekov\n\n' + fnutil.GPL2PLUS_LICENSE
class Options(fncli.Options):
def __init__(self):
fncli.Options.__init__(self, ['-F', '-o'], HELP, VERSION)
def parse(self, name, value, params):
if name in ['-f', '--filter']:
params.filter = True
elif name == '-F':
params.family = bytes(value, 'ascii')
if '-' in value:
raise Exception('family name may not contain "-"')
elif name == '-o':
params.output = value
else:
self.fallback(name, params)
def main_program(nonopt, parsed):
bstr = lambda number: bytes(str(number), 'ascii')
# NON-OPTIONS
if len(nonopt) < 4:
raise Exception('invalid number of arguments, try --help')
input = nonopt[0]
registry = nonopt[1]
encoding = nonopt[2]
new_codes = []
if not re.fullmatch(r'[A-Za-z][\w.:()]*', registry) or not re.fullmatch(r'[\w.:()]+', encoding):
raise Exception('invalid registry or encoding')
# READ INPUT
ifs = fnio.InputStream(input)
try:
old_font = bdf.Font.read(ifs)
ifs.close()
except Exception as ex:
raise Exception(ifs.location() + str(ex))
# READ TABLES
def load_code(line):
new_codes.append(fnutil.parse_hex('unicode', line))
for name in nonopt[3:]:
ifs = fnio.InputStream(name)
try:
ifs.read_lines(load_code)
ifs.close()
except Exception as ex:
raise Exception(ifs.location() + str(ex))
if not new_codes:
raise Exception('no characters in the output font')
# CREATE GLYPHS
new_font = bdf.Font()
charmap = {char.code:char for char in old_font.chars}
index = 0
unstart = 0
family = parsed.family if parsed.family is not None else old_font.xlfd[bdf.XLFD.FAMILY_NAME]
if parsed.filter:
unstart = 32 if registry == 'ISO10646' else bdf.CHARS_MAX
for code in new_codes:
if code == 0xFFFF and parsed.filter:
index += 1
continue
if code in charmap:
old_char = charmap[code]
uni_ffff = False
else:
uni_ffff = True
if code != 0xFFFF:
raise Exception('%s does not contain U+%04X' % (input, code))
if old_font.default_code != -1:
old_char = charmap[old_font.default_code]
elif 0xFFFD in charmap:
old_char = charmap[0xFFFD]
else:
raise Exception('%s does not contain U+FFFF, and no replacement found' % input)
new_char = copy.copy(old_char)
new_char.code = code if index >= unstart else index
index += 1
new_char.props = new_char.props.clone()
new_char.props.set('ENCODING', bstr(new_char.code))
new_font.chars.append(new_char)
if uni_ffff:
new_char.props.set('STARTCHAR', b'uniFFFF')
elif old_char.code == old_font.default_code or (old_char.code == 0xFFFD and new_font.default_code == -1):
new_font.default_code = new_char.code
# CREATE HEADER
registry = bytes(registry, 'ascii')
encoding = bytes(encoding, 'ascii')
for [name, value] in old_font.props:
if name == 'FONT':
new_font.xlfd = old_font.xlfd[:]
new_font.xlfd[bdf.XLFD.FAMILY_NAME] = family
new_font.xlfd[bdf.XLFD.CHARSET_REGISTRY] = registry
new_font.xlfd[bdf.XLFD.CHARSET_ENCODING] = encoding
value = b'-'.join(new_font.xlfd)
elif name == 'STARTPROPERTIES':
num_props = fnutil.parse_dec(name, value, 1)
elif name == 'FAMILY_NAME':
value = fnutil.quote(family)
elif name == 'CHARSET_REGISTRY':
value = fnutil.quote(registry)
elif name == 'CHARSET_ENCODING':
value = fnutil.quote(encoding)
elif name == 'DEFAULT_CHAR':
if new_font.default_code != -1:
value = bstr(new_font.default_code)
else:
num_props -= 1
continue
elif name == 'ENDPROPERTIES':
if new_font.default_code != -1 and new_font.props.get('DEFAULT_CHAR') is None:
new_font.props.add('DEFAULT_CHAR', bstr(new_font.default_code))
num_props += 1
new_font.props.set('STARTPROPERTIES', bstr(num_props))
elif name == 'CHARS':
value = bstr(len(new_font.chars))
new_font.props.add(name, value)
# COPY FIELDS
new_font.bbx = old_font.bbx
new_font.finis = old_font.finis
# WRITE OUTPUT
ofs = fnio.OutputStream(parsed.output)
try:
new_font.write(ofs)
ofs.close()
except Exception as ex:
raise Exception(ofs.location() + str(ex) + ofs.destroy())
if __name__ == '__main__':
fncli.start('ucstoany.py', Options(), Params(), main_program)

66
configure vendored Executable file
View File

@ -0,0 +1,66 @@
#!/bin/sh
if test "$1" = "--help" ; then
echo usage: $0 [--var=VALUE] [VAR=VALUE] ...
echo
cat configure.help 2> /dev/null && echo
echo "Any variables not explicitly set are reset to their defaults"
elif test "$1" = "--version" ; then
cat << EOT
micro configure 0.21, Copyright (C) 2015 Dimitar Toshkov Zhekov
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Report bugs to dimitar.zhekov@gmail.com
EOT
elif test -z `printf "\r"` ; then
echo "$0: printf failure"
false
elif test -f Makefile ; then
if test -f Makefile.in ; then
cp -fp Makefile.in Makefile
else
cp -p Makefile Makefile.in
fi
w=`printf "[\t ]*"`
r=`printf "\r"`
l="[a-z][a-z0-9-]*[^-]"
for i do
if test "$i" != "`echo "$i" | sed -e 1q`" ; then
echo "$0: `echo "$i" | sed -e "s/$r/^M/" -e 1q`^J...: contains line feed" 1>&2
elif echo "$i" | grep "$r" > /dev/null ; then
echo "$0: `echo "$i" | sed -e "s/$r.*//"`^M...: contains carriage return" 1>&2
elif test -n "$i" ; then
if echo "$i" | grep -E "^--$l=|^[A-Z][A-Z0-9_]*[^_]=" > /dev/null ; then
n=`echo "$i" | sed -e "s$r^-*$r$r" -e "s$r=.*$r$r" | sed -e "s/-/_/g"`
if grep -E "^$n$w:?=" Makefile > /dev/null ; then
cp -f Makefile Makefile.$$
sed -e "s$r^\($n$w:*=$w\).*$r\1`echo "$i" | sed -e "s$r^[^=]*=$r$r"`$r" Makefile.$$ > Makefile
grep -E "^$n$w:?=" Makefile /dev/null
else
echo "$0: $n: not found in Makefile" 1>&2
fi
unset n
else
echo "$0: $i: not recognized" 1>&2
fi
fi
done
unset i l r w
if test -f Makefile.$$ ; then
rm -f Makefile.$$
else
rm -f Makefile.in
fi
else
echo "$0: Makefile: not found" 1>&2
false
fi

13
configure.help Normal file
View File

@ -0,0 +1,13 @@
To assign environment variables (e.g., CC, CFLAGS...), specify them as
NAME=VALUE. See the README for description of all options and targets.
Defaults for the options are specified in brackets.
Configuration:
--help display this help and exit
--version display version information and exit
Installation directories:
--prefix=PREFIX directories prefix [/usr]
--psfdir=DIR PC screen fonts directory [PREFIX/share/consolefonts]
--x11dir=DIR X11 fonts directory [PREFIX/X11R6/lib/X11/fonts/local]

2
dup/ascii-h.dup Normal file
View File

@ -0,0 +1,2 @@
0020 0000
2302 007F

5
dup/cntrl.dup Normal file
View File

@ -0,0 +1,5 @@
25B6 25BA
25C0 25C4
2666 25C6
266B 266C
FFFD 0000

7
dup/ibm-437.dup Normal file
View File

@ -0,0 +1,7 @@
00B5 03BC
03A3 2211
03A9 2126
03B2 00DF
220A 03B5
220A 2208
2205 03C6

1
dup/ka1.dup Normal file
View File

@ -0,0 +1 @@
0138 043A

1
dup/ka2.dup Normal file
View File

@ -0,0 +1 @@
006B 043A

1
dup/koi8.dup Normal file
View File

@ -0,0 +1 @@
043F 03C0

8
dup/vgagr.dup Normal file
View File

@ -0,0 +1,8 @@
2191 25B2
2193 25BC
25B6 2192
25B6 25BA
25A0 FFFD
25C0 2190
25C0 25C4
2666 25C6

107
dup/xos4-2.dup Normal file
View File

@ -0,0 +1,107 @@
0020 0000
0020 00A0
0020 2000
0020 2001
0020 2002
0020 2003
0020 2004
0020 2005
0020 2006
0020 2007
0020 2008
0020 2009
0020 200A
0020 202F
002D 2012
002D 2013
002D 2212
0033 0417
0041 0391
0041 0410
0042 0392
0042 0412
0043 0421
0045 0395
0045 0415
0048 0397
0048 041D
0049 0399
0049 0406
0049 04C0
004A 0408
004B 039A
004B 041A
004D 039C
004D 041C
004E 039D
004F 039F
004F 041E
0050 03A1
0050 0420
0053 0405
0054 03A4
0054 0422
0058 03A7
0058 0425
0059 03A5
0059 04AE
005A 0396
0061 0430
0063 03F2
0063 0441
0065 0435
0068 210E
0069 0456
006A 03F3
006A 0458
006C 04CF
006F 03BF
006F 043E
0070 0440
0073 0455
0076 03BD
0078 0445
0079 0443
00AD 2010
00AD 2011
00B4 0301
00B5 03BC
00C4 04D2
00C6 04D4
00C8 0400
00CB 0401
00CF 03AA
00CF 0407
00D0 0110
00D6 04E6
00E4 04D3
00E6 04D5
00E8 0450
00EB 0451
00EF 0457
00F3 03CC
00F6 04E7
0102 04D0
0103 04D1
0138 03BA
0178 03AB
02C6 0302
02C7 030C
02D8 0306
02DC 0303
0393 0413
03A9 2126
03B5 2208
03B5 220A
03C0 043F
03C6 2205
041F 03A0
045B 0127
045B 210F
04AF 03B3
04D8 018F
04D9 0259
04E8 03F4
2014 2015
2206 0394
0138 043A

25754
ter-u12b.bdf Normal file

File diff suppressed because it is too large Load Diff

25754
ter-u12n.bdf Normal file

File diff suppressed because it is too large Load Diff

28462
ter-u14b.bdf Normal file

File diff suppressed because it is too large Load Diff

28462
ter-u14n.bdf Normal file

File diff suppressed because it is too large Load Diff

28462
ter-u14v.bdf Normal file

File diff suppressed because it is too large Load Diff

31170
ter-u16b.bdf Normal file

File diff suppressed because it is too large Load Diff

31170
ter-u16n.bdf Normal file

File diff suppressed because it is too large Load Diff

31170
ter-u16v.bdf Normal file

File diff suppressed because it is too large Load Diff

33878
ter-u18b.bdf Normal file

File diff suppressed because it is too large Load Diff

33878
ter-u18n.bdf Normal file

File diff suppressed because it is too large Load Diff

36586
ter-u20b.bdf Normal file

File diff suppressed because it is too large Load Diff

36586
ter-u20n.bdf Normal file

File diff suppressed because it is too large Load Diff

39294
ter-u22b.bdf Normal file

File diff suppressed because it is too large Load Diff

39294
ter-u22n.bdf Normal file

File diff suppressed because it is too large Load Diff

42002
ter-u24b.bdf Normal file

File diff suppressed because it is too large Load Diff

42002
ter-u24n.bdf Normal file

File diff suppressed because it is too large Load Diff

47418
ter-u28b.bdf Normal file

File diff suppressed because it is too large Load Diff

47418
ter-u28n.bdf Normal file

File diff suppressed because it is too large Load Diff

52834
ter-u32b.bdf Normal file

File diff suppressed because it is too large Load Diff

52834
ter-u32n.bdf Normal file

File diff suppressed because it is too large Load Diff

1353
uni/10646-1.uni Normal file

File diff suppressed because it is too large Load Diff

96
uni/8859-13.uni Normal file
View File

@ -0,0 +1,96 @@
00A0
201D
00A2
00A3
00A4
201E
00A6
00A7
00D8
00A9
0156
00AB
00AC
00AD
00AE
00C6
00B0
00B1
00B2
00B3
201C
00B5
00B6
00B7
00F8
00B9
0157
00BB
00BC
00BD
00BE
00E6
0104
012E
0100
0106
00C4
00C5
0118
0112
010C
00C9
0179
0116
0122
0136
012A
013B
0160
0143
0145
00D3
014C
00D5
00D6
00D7
0172
0141
015A
016A
00DC
017B
017D
00DF
0105
012F
0101
0107
00E4
00E5
0119
0113
010D
00E9
017A
0117
0123
0137
012B
013C
0161
0144
0146
00F3
014D
00F5
00F6
00F7
0173
0142
015B
016B
00FC
017C
017E
2019

96
uni/8859-15.uni Normal file
View File

@ -0,0 +1,96 @@
00A0
00A1
00A2
00A3
20AC
00A5
0160
00A7
0161
00A9
00AA
00AB
00AC
00AD
00AE
00AF
00B0
00B1
00B2
00B3
017D
00B5
00B6
00B7
017E
00B9
00BA
00BB
0152
0153
0178
00BF
00C0
00C1
00C2
00C3
00C4
00C5
00C6
00C7
00C8
00C9
00CA
00CB
00CC
00CD
00CE
00CF
00D0
00D1
00D2
00D3
00D4
00D5
00D6
00D7
00D8
00D9
00DA
00DB
00DC
00DD
00DE
00DF
00E0
00E1
00E2
00E3
00E4
00E5
00E6
00E7
00E8
00E9
00EA
00EB
00EC
00ED
00EE
00EF
00F0
00F1
00F2
00F3
00F4
00F5
00F6
00F7
00F8
00F9
00FA
00FB
00FC
00FD
00FE
00FF

96
uni/8859-16.uni Normal file
View File

@ -0,0 +1,96 @@
00A0
0104
0105
0141
20AC
201E
0160
00A7
0161
00A9
0218
00AB
0179
00AD
017A
017B
00B0
00B1
010C
0142
017D
201D
00B6
00B7
017E
010D
0219
00BB
0152
0153
0178
017C
00C0
00C1
00C2
0102
00C4
0106
00C6
00C7
00C8
00C9
00CA
00CB
00CC
00CD
00CE
00CF
0110
0143
00D2
00D3
00D4
0150
00D6
015A
0170
00D9
00DA
00DB
00DC
0118
021A
00DF
00E0
00E1
00E2
0103
00E4
0107
00E6
00E7
00E8
00E9
00EA
00EB
00EC
00ED
00EE
00EF
0111
0144
00F2
00F3
00F4
0151
00F6
015B
0171
00F9
00FA
00FB
00FC
0119
021B
00FF

96
uni/8859-2.uni Normal file
View File

@ -0,0 +1,96 @@
00A0
0104
02D8
0141
00A4
013D
015A
00A7
00A8
0160
015E
0164
0179
00AD
017D
017B
00B0
0105
02DB
0142
00B4
013E
015B
02C7
00B8
0161
015F
0165
017A
02DD
017E
017C
0154
00C1
00C2
0102
00C4
0139
0106
00C7
010C
00C9
0118
00CB
011A
00CD
00CE
010E
0110
0143
0147
00D3
00D4
0150
00D6
00D7
0158
016E
00DA
0170
00DC
00DD
0162
00DF
0155
00E1
00E2
0103
00E4
013A
0107
00E7
010D
00E9
0119
00EB
011B
00ED
00EE
010F
0111
0144
0148
00F3
00F4
0151
00F6
00F7
0159
016F
00FA
0171
00FC
00FD
0163
02D9

96
uni/8859-5.uni Normal file
View File

@ -0,0 +1,96 @@
00A0
0401
0402
0403
0404
0405
0406
0407
0408
0409
040A
040B
040C
00AD
040E
040F
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
041A
041B
041C
041D
041E
041F
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
042A
042B
042C
042D
042E
042F
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
043A
043B
043C
043D
043E
043F
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
044A
044B
044C
044D
044E
044F
2116
0451
0452
0453
0454
0455
0456
0457
0458
0459
045A
045B
045C
00A7
045E
045F

96
uni/8859-7.uni Normal file
View File

@ -0,0 +1,96 @@
00A0
02BD
02BC
00A3
20AC
FFFF
00A6
00A7
00A8
00A9
FFFF
00AB
00AC
00AD
FFFF
2015
00B0
00B1
00B2
00B3
0384
0385
0386
00B7
0388
0389
038A
00BB
038C
00BD
038E
038F
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
039A
039B
039C
039D
039E
039F
03A0
03A1
FFFF
03A3
03A4
03A5
03A6
03A7
03A8
03A9
03AA
03AB
03AC
03AD
03AE
03AF
03B0
03B1
03B2
03B3
03B4
03B5
03B6
03B7
03B8
03B9
03BA
03BB
03BC
03BD
03BE
03BF
03C0
03C1
03C2
03C3
03C4
03C5
03C6
03C7
03C8
03C9
03CA
03CB
03CC
03CD
03CE
FFFF

96
uni/ascii-h.uni Normal file
View File

@ -0,0 +1,96 @@
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
002A
002B
002C
002D
002E
002F
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
003A
003B
003C
003D
003E
003F
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
004A
004B
004C
004D
004E
004F
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
005A
005B
005C
005D
005E
005F
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
006A
006B
006C
006D
006E
006F
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
007A
007B
007C
007D
007E
2302

128
uni/bg-mik.uni Normal file
View File

@ -0,0 +1,128 @@
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
041A
041B
041C
041D
041E
041F
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
042A
042B
042C
042D
042E
042F
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
043A
043B
043C
043D
043E
043F
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
044A
044B
044C
044D
044E
044F
2514
2534
252C
251C
2500
253C
2563
2551
255A
2554
2569
2566
2560
2550
256C
2510
2591
2592
2593
2502
2524
2116
00A7
2557
255D
2518
250C
2588
2584
258C
2590
2580
03B1
03B2
0393
03C0
03A3
03C3
00B5
03C4
03A6
0398
03A9
03B4
221E
2205
220A
2229
2261
00B1
2265
2264
2320
2321
00F7
2248
00B0
2219
00B7
221A
207F
00B2
25A0
00A0

32
uni/char0.uni Normal file
View File

@ -0,0 +1,32 @@
0000
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF

32
uni/cntrl.uni Normal file
View File

@ -0,0 +1,32 @@
FFFD
263A
263B
2665
2666
2663
2660
2022
25D8
25CB
25D9
2642
2640
266A
266B
263C
25B6
25C0
2195
203C
00B6
00A7
25AC
21A8
2191
2193
2192
2190
221F
2194
25B2
25BC

32
uni/empty.uni Normal file
View File

@ -0,0 +1,32 @@
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF

128
uni/ibm-437.uni Normal file
View File

@ -0,0 +1,128 @@
00C7
00FC
00E9
00E2
00E4
00E0
00E5
00E7
00EA
00EB
00E8
00EF
00EE
00EC
00C4
00C5
00C9
00E6
00C6
00F4
00F6
00F2
00FB
00F9
00FF
00D6
00DC
00A2
00A3
00A5
20A7
0192
00E1
00ED
00F3
00FA
00F1
00D1
00AA
00BA
00BF
2310
00AC
00BD
00BC
00A1
00AB
00BB
2591
2592
2593
2502
2524
2561
2562
2556
2555
2563
2551
2557
255D
255C
255B
2510
2514
2534
252C
251C
2500
253C
255E
255F
255A
2554
2569
2566
2560
2550
256C
2567
2568
2564
2565
2559
2558
2552
2553
256B
256A
2518
250C
2588
2584
258C
2590
2580
03B1
03B2
0393
03C0
03A3
03C3
00B5
03C4
03A6
0398
03A9
03B4
221E
2205
220A
2229
2261
00B1
2265
2264
2320
2321
00F7
2248
00B0
2219
00B7
221A
207F
00B2
25A0
00A0

128
uni/koi8-r.uni Normal file
View File

@ -0,0 +1,128 @@
2500
2502
250C
2510
2514
2518
251C
2524
252C
2534
253C
2580
2584
2588
258C
2590
2591
2592
2593
2320
25A0
2022
221A
2248
2264
2265
00A0
2321
00B0
00B2
00B7
00F7
2550
2551
2552
0451
2553
2554
2555
2556
2557
2558
2559
255A
255B
255C
255D
255E
255F
2560
2561
0401
2562
2563
2564
2565
2566
2567
2568
2569
256A
256B
256C
00A9
044E
0430
0431
0446
0434
0435
0444
0433
0445
0438
0439
043A
043B
043C
043D
043E
043F
044F
0440
0441
0442
0443
0436
0432
044C
044B
0437
0448
044D
0449
0447
044A
042E
0410
0411
0426
0414
0415
0424
0413
0425
0418
0419
041A
041B
041C
041D
041E
041F
042F
0420
0421
0422
0423
0416
0412
042C
042B
0417
0428
042D
0429
0427
042A

128
uni/koi8-u.uni Normal file
View File

@ -0,0 +1,128 @@
2500
2502
250C
2510
2514
2518
251C
2524
252C
2534
253C
2580
2584
2588
258C
2590
2591
2592
2593
2320
25A0
2022
221A
2248
2264
2265
00A0
2321
00B0
00B2
00B7
00F7
2550
2551
2552
0451
0454
2554
0456
0457
2557
2558
2559
255A
255B
0491
255D
255E
255F
2560
2561
0401
0404
2563
0406
0407
2566
2567
2568
2569
256A
0490
256C
00A9
044E
0430
0431
0446
0434
0435
0444
0433
0445
0438
0439
043A
043B
043C
043D
043E
043F
044F
0440
0441
0442
0443
0436
0432
044C
044B
0437
0448
044D
0449
0447
044A
042E
0410
0411
0426
0414
0415
0424
0413
0425
0418
0419
041A
041B
041C
041D
041E
041F
042F
0420
0421
0422
0423
0416
0412
042C
042B
0417
0428
042D
0429
0427
042A

128
uni/koibm8-r.uni Normal file
View File

@ -0,0 +1,128 @@
2502
2510
2524
2591
2592
2593
2320
25A0
2022
221A
2248
2264
2265
00A0
2321
00B0
00B2
00B7
00F7
2551
0451
2555
2556
2557
255B
255C
255D
2561
0401
2562
2563
00A9
044E
0430
0431
0446
0434
0435
0444
0433
0445
0438
0439
043A
043B
043C
043D
043E
043F
044F
0440
0441
0442
0443
0436
0432
044C
044B
0437
0448
044D
0449
0447
044A
2514
2534
252C
251C
2500
253C
255E
255F
255A
2554
2569
2566
2560
2550
256C
2567
2568
2564
2565
2559
2558
2552
2553
256B
256A
2518
250C
2588
2584
258C
2590
2580
042E
0410
0411
0426
0414
0415
0424
0413
0425
0418
0419
041A
041B
041C
041D
041E
041F
042F
0420
0421
0422
0423
0416
0412
042C
042B
0417
0428
042D
0429
0427
042A

128
uni/koibm8-u.uni Normal file
View File

@ -0,0 +1,128 @@
2502
2510
2524
2591
2592
2593
2320
25A0
2022
221A
2248
2264
2265
00A0
2321
00B0
00B2
00B7
00F7
2551
0451
0456
0457
2557
255B
0491
255D
2561
0401
0404
2563
00A9
044E
0430
0431
0446
0434
0435
0444
0433
0445
0438
0439
043A
043B
043C
043D
043E
043F
044F
0440
0441
0442
0443
0436
0432
044C
044B
0437
0448
044D
0449
0447
044A
2514
2534
252C
251C
2500
253C
255E
255F
255A
2554
2569
2566
2560
2550
256C
2567
2568
0406
0407
2559
2558
2552
0454
0490
256A
2518
250C
2588
2584
258C
2590
2580
042E
0410
0411
0426
0414
0415
0424
0413
0425
0418
0419
041A
041B
041C
041D
041E
041F
042F
0420
0421
0422
0423
0416
0412
042C
042B
0417
0428
042D
0429
0427
042A

32
uni/nls-1250.uni Normal file
View File

@ -0,0 +1,32 @@
0164
0165
02C7
02D8
00A8
015E
02DB
00B4
00B8
015F
013D
02DD
013E
0154
0139
011A
010E
0147
0158
016E
00DD
0162
0155
013A
011B
010F
0148
0159
016F
00FD
0163
02D9

128
uni/pt-154.uni Normal file
View File

@ -0,0 +1,128 @@
0496
0492
04EE
0493
201E
2026
04B6
04AE
04B2
04AF
04A0
04E2
04A2
049A
04BA
04B8
0497
2018
2019
201C
201D
2022
2013
2014
04B3
04B7
04A1
04E3
04A3
049B
04BB
04B9
00A0
040E
045E
0408
04E8
0498
04B0
00A7
0401
00A9
04D8
00AB
00AC
04EF
00AE
049C
00B0
04B1
0406
0456
0499
04E9
00B6
00B7
0451
2116
04D9
00BB
0458
04AA
04AB
049D
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
041A
041B
041C
041D
041E
041F
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
042A
042B
042C
042D
042E
042F
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
043A
043B
043C
043D
043E
043F
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
044A
044B
044C
044D
044E
044F

128
uni/pt-254.uni Normal file
View File

@ -0,0 +1,128 @@
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
041A
041B
041C
041D
041E
041F
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
042A
042B
042C
042D
042E
042F
04B6
00B0
0498
00A3
00A7
2022
00B6
0406
00AE
00A9
04B7
0496
0497
04AE
0492
0493
04B0
04B1
04E2
04E3
0456
04E9
0499
0408
04D8
04D9
049C
049D
04A0
04A1
04A2
04A3
0458
04AA
00AC
04B2
04EE
04B3
04AF
00AB
00BB
2026
00A0
04BA
04BB
049A
049B
04AB
2013
2014
201C
201D
2018
2019
04EF
201E
040E
045E
04B8
04B9
2116
0401
0451
044F
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
043A
043B
043C
043D
043E
043F
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
044A
044B
044C
044D
044E
04E8

32
uni/vga-1250.uni Normal file
View File

@ -0,0 +1,32 @@
20AC
FFFF
201A
FFFF
201E
2026
2020
2021
FFFF
2030
2039
FFFF
2018
2019
201C
201D
2022
2013
2014
FFFF
2122
203A
00A6
00A9
00AB
00AC
00AE
00B1
00B5
00B6
00B7
00BB

32
uni/vga-1251.uni Normal file
View File

@ -0,0 +1,32 @@
0402
0403
201A
0453
201E
2026
2020
2021
20AC
2030
0409
2039
040A
040C
040B
040F
0452
2018
2019
201C
201D
2022
2013
2014
045D
2122
0459
203A
045A
045C
045B
045F

32
uni/vga-1253.uni Normal file
View File

@ -0,0 +1,32 @@
20AC
FFFF
201A
0192
201E
2026
2020
2021
FFFF
2030
FFFF
2039
00A4
00A5
00AE
00B5
00B6
2018
2019
201C
201D
2022
2013
2014
FFFF
2122
FFFF
203A
FFFF
FFFF
FFFF
FFFF

32
uni/vga-1257.uni Normal file
View File

@ -0,0 +1,32 @@
20AC
00B4
201A
02D9
201E
2026
2020
2021
FFFF
2030
FFFF
2039
FFFF
00A8
02C7
00B8
FFFF
2018
2019
201C
201D
2022
2013
2014
FFFF
2122
FFFF
203A
FFFF
00AF
02DB
FFFF

32
uni/vgagr.uni Normal file
View File

@ -0,0 +1,32 @@
00A3
2193
25C0
25B6
2191
2591
25A0
2592
00B0
2666
2265
03C0
2500
256C
253C
2264
2514
2518
256A
00B1
23BA
23BB
23BC
23BD
2588
252C
2524
251C
2534
250C
2510
2502

128
uni/win-1250.uni Normal file
View File

@ -0,0 +1,128 @@
20AC
FFFF
201A
FFFF
201E
2026
2020
2021
FFFF
2030
0160
2039
015A
0164
017D
0179
FFFF
2018
2019
201C
201D
2022
2013
2014
FFFF
2122
0161
203A
015B
0165
017E
017A
00A0
02C7
02D8
0141
00A4
0104
00A6
00A7
00A8
00A9
015E
00AB
00AC
00AD
00AE
017B
00B0
00B1
02DB
0142
00B4
00B5
00B6
00B7
00B8
0105
015F
00BB
013D
02DD
013E
017C
0154
00C1
00C2
0102
00C4
0139
0106
00C7
010C
00C9
0118
00CB
011A
00CD
00CE
010E
0110
0143
0147
00D3
00D4
0150
00D6
00D7
0158
016E
00DA
0170
00DC
00DD
0162
00DF
0155
00E1
00E2
0103
00E4
013A
0107
00E7
010D
00E9
0119
00EB
011B
00ED
00EE
010F
0111
0144
0148
00F3
00F4
0151
00F6
00F7
0159
016F
00FA
0171
00FC
00FD
0163
02D9

96
uni/win-1251.uni Normal file
View File

@ -0,0 +1,96 @@
00A0
040E
045E
0408
00A4
0490
00A6
00A7
0401
00A9
0404
00AB
00AC
00AD
00AE
0407
00B0
00B1
0406
0456
0491
00B5
00B6
00B7
0451
2116
0454
00BB
0458
0405
0455
0457
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
041A
041B
041C
041D
041E
041F
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
042A
042B
042C
042D
042E
042F
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
043A
043B
043C
043D
043E
043F
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
044A
044B
044C
044D
044E
044F

128
uni/win-1252.uni Normal file
View File

@ -0,0 +1,128 @@
20AC
FFFF
201A
0192
201E
2026
2020
2021
02C6
2030
0160
2039
0152
FFFF
017D
FFFF
FFFF
2018
2019
201C
201D
2022
2013
2014
02DC
2122
0161
203A
0153
FFFF
017E
0178
00A0
00A1
00A2
00A3
00A4
00A5
00A6
00A7
00A8
00A9
00AA
00AB
00AC
00AD
00AE
00AF
00B0
00B1
00B2
00B3
00B4
00B5
00B6
00B7
00B8
00B9
00BA
00BB
00BC
00BD
00BE
00BF
00C0
00C1
00C2
00C3
00C4
00C5
00C6
00C7
00C8
00C9
00CA
00CB
00CC
00CD
00CE
00CF
00D0
00D1
00D2
00D3
00D4
00D5
00D6
00D7
00D8
00D9
00DA
00DB
00DC
00DD
00DE
00DF
00E0
00E1
00E2
00E3
00E4
00E5
00E6
00E7
00E8
00E9
00EA
00EB
00EC
00ED
00EE
00EF
00F0
00F1
00F2
00F3
00F4
00F5
00F6
00F7
00F8
00F9
00FA
00FB
00FC
00FD
00FE
00FF

128
uni/win-1253.uni Normal file
View File

@ -0,0 +1,128 @@
20AC
FFFF
201A
0192
201E
2026
2020
2021
FFFF
2030
FFFF
2039
FFFF
FFFF
FFFF
FFFF
FFFF
2018
2019
201C
201D
2022
2013
2014
FFFF
2122
FFFF
203A
FFFF
FFFF
FFFF
FFFF
00A0
0385
0386
00A3
00A4
00A5
00A6
00A7
00A8
00A9
FFFF
00AB
00AC
00AD
00AE
2015
00B0
00B1
00B2
00B3
0384
00B5
00B6
00B7
0388
0389
038A
00BB
038C
00BD
038E
038F
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
039A
039B
039C
039D
039E
039F
03A0
03A1
FFFF
03A3
03A4
03A5
03A6
03A7
03A8
03A9
03AA
03AB
03AC
03AD
03AE
03AF
03B0
03B1
03B2
03B3
03B4
03B5
03B6
03B7
03B8
03B9
03BA
03BB
03BC
03BD
03BE
03BF
03C0
03C1
03C2
03C3
03C4
03C5
03C6
03C7
03C8
03C9
03CA
03CB
03CC
03CD
03CE
FFFF

128
uni/win-1254.uni Normal file
View File

@ -0,0 +1,128 @@
20AC
FFFF
201A
0192
201E
2026
2020
2021
02C6
2030
0160
2039
0152
FFFF
017D
FFFF
FFFF
2018
2019
201C
201D
2022
2013
2014
02DC
2122
0161
203A
0153
FFFF
017E
0178
00A0
00A1
00A2
00A3
00A4
00A5
00A6
00A7
00A8
00A9
00AA
00AB
00AC
00AD
00AE
00AF
00B0
00B1
00B2
00B3
00B4
00B5
00B6
00B7
00B8
00B9
00BA
00BB
00BC
00BD
00BE
00BF
00C0
00C1
00C2
00C3
00C4
00C5
00C6
00C7
00C8
00C9
00CA
00CB
00CC
00CD
00CE
00CF
011E
00D1
00D2
00D3
00D4
00D5
00D6
00D7
00D8
00D9
00DA
00DB
00DC
0130
015E
00DF
00E0
00E1
00E2
00E3
00E4
00E5
00E6
00E7
00E8
00E9
00EA
00EB
00EC
00ED
00EE
00EF
011F
00F1
00F2
00F3
00F4
00F5
00F6
00F7
00F8
00F9
00FA
00FB
00FC
0131
015F
00FF

Some files were not shown because too many files have changed in this diff Show More