Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
--% Our types: --% rawarr: an array of raw char images, each padded to 32 bytes. --% rawfont: a string of nchars*height bytes. --% font: an array with entries nchars, height, 0..nchars-1 (w/len 32 each). --% psf: four magic bytes followed by a rawfont. --% bigstr: a user-friendly 2D representation, like demo_bigstr. --% vcsa: nrows,ncols,crsr_x,crsr_y,nrows*ncols*(char,attr) --% --% The conversions (modulo extra info like height and nchars): --% psffile <-> psf <-> rawfont <-> font <-> bigstr --% rawfontfile <-> rawfont --% --% Here's how to do some of the conversions: --% psffile -> psf readfile(fname) --% psffile <- psf writefile(fname, psf) --% psf -> font psftofont(psf) --% psf <- font fonttopsf(psf) --% font -> bigstr fonttobigstr(font, 0, font.nchars-1) --% font <- bigstr bigstrtofont(bigstr, nchars, height) --% --% rawfontfile -> rawfont readfile(fname) --% rawfontfile <- rawfont writefile(fname, rawfont) --% rawfont -> font rawfonttofont(rawfont, nchars, height) --% rawfont <- font fonttorawfont(font, font.height) --% --% "vcsa" corresponds to the contents of a "/dev/vcsann" in Linux, --% and is used for taking screenshots. --% «.tools_and_samples» (to "tools_and_samples") --% «.demo_bigstr» (to "demo_bigstr") --% «.psf_stuff» (to "psf_stuff") --% «.psftofont» (to "psftofont") --% «.fonttopsf» (to "fonttopsf") --% «.bigstr_stuff» (to "bigstr_stuff") --% «.bigstrtorawarr» (to "bigstrtorawarr") --% «.bigstrtofont» (to "bigstrtofont") --% «.fonttobigstr» (to "fonttobigstr") --% «.other_conversions» (to "other_conversions") --% «.rawfonttofont» (to "rawfonttofont") --% «.fonttorawfont» (to "fonttorawfont") --% «.vcsatounix» (to "vcsatounix") --% «.explode» (to "explode") --% «.split_clines» (to "split_clines") --% «.changefont» (to "changefont") --% «.makecomposes» (to "makecomposes") --% «.trfont» (to "trfont") --% «.setfont» (to "setfont") --% «.e_scripts» (to "e_scripts") --% «.vcsatoBIGstring» (to "vcsatoBIGstring") --%%%%% --% --% «tools_and_samples» (to ".tools_and_samples") --% --%%%%% --% «demo_bigstr» (to ".demo_bigstr") demo_bigstr = [[ +--------+--------+--------+--------+--------+--------+--------+--------+ | o | o | oo | | | | | | | oo | o | oo o | o | o o | o o | |o | |ooo o | ooo | oo | o o | o o | o o | oo oo |o | | o | o o | oo | o o | o o | o o |o o o |oo oo | | ooo | ooo | oo | o o | o o | o o |o o o |o o o | | | o | oo | o o | o | oooooo | oo oo |o o oo | | | o | o oo | | | | |oo o | | | | oo | | | | | o | +--------+--------+--------+--------+--------+--------+--------+--------+ | oooo | oooo |ooo ooo | | | | o | o |o o | | | | o | o |o o | | o o | | o | o |o o |oo oooo |o o | | | | |o o o o|o o | | | | |o o o o|o o o | | | | |o o o o| oo oo | | | | | | | +--------+--------+--------+--------+--------+]] bits = {128, 64, 32, 16, 8, 4, 2, 1} padbytes_zeroes = strrep("\000", 32) function padbytes(bytes) return strsub(bytes..padbytes_zeroes, 1, 32) end function pixelstobyte(str) local byte, i, bit = 0 for i, bit in bits do if strbyte(str, i) ~= 32 then byte = byte + bit end end return byte end function bytetopixels(byte) local str, i, bit = "" for i, bit in bits do if band(byte, bit) ~= 0 then str = str .. "o" else str = str .. " " end end return str end --%%%%% --% --% «psf_stuff» (to ".psf_stuff") --% --%%%%% --% «psftofont» (to ".psftofont") function psftofont(psf) -- (find-fline "/usr/doc/console-tools/file-formats/psf" "psf_header =") local magic1, magic2, filemode, height magic1 = strbyte(psf, 1) -- 0x36 magic2 = strbyte(psf, 2) -- 0x04 filemode = strbyte(psf, 3) -- 0 means 256 chars, no unicode height = strbyte(psf, 4) -- in scanlines; typically 8, 14 or 16 -- I'm not checking magic1, magic2, and filemode yet return rawfonttofont(strsub(psf, 5), 256, height) end --% «fonttopsf» (to ".fonttopsf") function fonttopsf(font) return strchar(54, 4, 0, font.height) .. fonttorawfont(font, font.height) end --%%%%% --% --% «bigstr_stuff» (to ".bigstr_stuff") --% --%%%%% --% «bigstrtorawarr» (to ".bigstrtorawarr") --% Convert a "bigstr" (like demo_bigstr, above) to an array containing --% a string of length 32 with each character in raw form. --% --% Rationale for the naming of variables in "bigstrtorawarr": --% 73 = 1+8+1+8+1+8+1+8+1+8+1+8+1+8+1+8+1 --% 74 = 73+1 (\n) --% 592 = 74*8 --% bigstr = 74+592+74+592+...+74 --% bigstrtorawarr_re = regex("^\n?[-+]+\n" .. "((\\|(([ o]+\\|)+)\n)+)(.*)$") function bigstrtorawarr(bigstr) local p1, p2, a, s592, rest local arr = {} while 1 do -- p1, p2, a = match(bigstr, re) p1, p2, a = match(bigstr, bigstrtorawarr_re) if a then s592, rest = a[1], a[5] arr.nready = getn(arr) gsub(s592, "([ o|]+)\n", function(s73) local arr = %arr arr.nnow = arr.nready gsub(s73, "([ o]+)", function(s8) local arr = %arr arr.nnow = arr.nnow + 1 arr[arr.nnow] = arr[arr.nnow] or {} tinsert(arr[arr.nnow], s8) end) end) bigstr = rest else local rawarr = {} foreachi(arr, function(_, prows) local bytes = "" local i for i = 1,getn(prows) do bytes = bytes .. strchar(pixelstobyte(prows[i])) end tinsert(%rawarr, padbytes(bytes)) end) -- return rawarr, arr return rawarr end end end --% «bigstrtofont» (to ".bigstrtofont") --% This function isn't very useful, as bigstrings are used mainly --% for modifying fonts, not for storing fonts in a readable format. --% function bigstrtofont(bigstr, nchars, height) local font = {nchars = nchars, height = height} local rawarr = bigstrtorawarr(bigstr) local i if getn(rawarr) ~= nchars then printf("Warning: getn(rawarr)=%d, nchars=%d\n", getn(rawarr), nchars) end for i=0,nchars-1 do font[i] = rawarr[i+1] end return font end --% «fonttobigstr» (to ".fonttobigstr") --% Convert a font to a "bigstr". --% function horizontalbar(nchars) return "+" .. strrep("--------+", nchars) .. "\n" end function fontto3Dmatrix(font, c0, c1) local bigstr = "" local scanline, nchar for scanline = 1,font.height do bigstr = bigstr .. "|" for nchar = c0,c1 do bigstr = bigstr .. bytetopixels(strbyte(font[nchar], scanline)) .. "|" end bigstr = bigstr .. "\n" end return bigstr end function fonttobigstr(font, c0, c1) local hbar = horizontalbar(8) local bigstr, nchar = hbar for nchar = c0,c1-7,8 do bigstr = bigstr .. fontto3Dmatrix(font, nchar, nchar+7) .. hbar end return bigstr end --%%%%% --% --% «other_conversions» (to ".other_conversions") --% --%%%%% --% «rawfonttofont» (to ".rawfonttofont") --% Convert a font in raw or psf form to a "font" array, --% that has indices "nchars", "height", 0, 1, 2, ..., 255. --% Each entry with a numeric index contains a char in raw --% form (a string with length 32). --% function rawfonttofont(rawfont, nchars, height) nchars = nchars or 256 height = height or floor(strlen(rawfont)/nchars) local font = {nchars = nchars, height = height} local nchar if strlen(rawfont) ~= nchars*height then printf("Bad len: rawfont=%d nchars*height=%d\n", strlen(rawfont), nchars*height) end for nchar=0,nchars-1 do font[nchar] = padbytes(strsub(rawfont, nchar*height+1, (nchar+1)*height)) end return font end --% «fonttorawfont» (to ".fonttorawfont") function fonttorawfont(font, scanlines) local rawfont = "" local nchar for nchar=0,font.nchars-1 do rawfont = rawfont .. strsub(font[nchar], 1, scanlines) end return rawfont end --% «vcsatounix» (to ".vcsatounix") --% (find-angg ".zshrc" "vt") --% (find-luanode "gsub" "gsub (s, pat, repl [, n])" "If repl is a function") --% (find-luanode "gsub" "Here are some examples:" "function") --% (find-luanode "Patterns" "followed by -" "shortest") --% mylua -e 'p(gsub("abcdefg", "(.).", "%1"))' --% function vcsatounix(vcsa) local lines, columns, cursorx, cursory = strbyte(vcsa, 1), strbyte(vcsa, 2), strbyte(vcsa, 3), strbyte(vcsa, 4) local bigstr = "" for y=1,lines-1 do pairs = strsub(vcsa, y*columns*2+5, (y+1)*columns*2+4) str = gsub(pairs, "(.).", "%1") str = gsub(str, "(.) -", "%1") bigstr = bigstr .. str .. "\n" end return bigstr end --%%%%% --% --% Functions for modifying fonts and keymaps --% --%%%%% --% «explode» (to ".explode") function explode_(i, n, arr) if i>=n then return arr[n] end return arr[i], explode_(i+1, n, arr) end function explode(arr) return explode_(1, getn(arr), arr) end --% «split_clines» (to ".split_clines") function split_clines(n, ...) local i, j, strs, arrs strs = {} for i=1,n do strs[i] = "" end for i=0,getn(arg)-n,n do for j=1,n do strs[j] = strs[j] .. " " .. arg[i+j] end end arrs = {} for i=1,n do tinsert(arrs, split(strs[i])) end return explode(arrs) end --% «changefont» (to ".changefont") function changefont(origfont, rawarr, cchars) local i, c for i=1,getn(cchars) do c = cchars[i] if strlen(c) == 1 and c ~= "." then origfont[strbyte(c)] = rawarr[i] end end return origfont end --% «makecomposes» (to ".makecomposes") function tickchar(c) return "'"..gsub(c, "(['\\])", "\\%1").."'" end function makecomposes(cchars, ckeyps) local i,c,thiscompose local composes = "" for i=1,getn(cchars) do c = cchars[i] if c ~= "." then key1 = strsub(ckeyps[i], 1, 1) key2 = strsub(ckeyps[i], 2, 2) thiscompose = format("compose %s %s to %s\n", tickchar(key1), tickchar(key2), tickchar(c)) if strlen(c) == 1 and c ~= "." then composes = composes .. thiscompose else composes = composes .. "# " .. thiscompose end end end return composes end -- (find-node "(elisp)Mapping Functions") -- (find-fline "~/MTA/128") -- (find-fline "~/MTA/128c") -- (insert (mapconcat (lambda (c1) (format "\\%03d" c1)) "abcd" "")) highglyphs_latin = "\128\129\130\131\132\133\134\135\136\137\138\139\140\141\142\143" .. "\144\145\146\147\148\149\150\151\152\153\154\155\156\157\158\159" .. "\160\161\162\163\164\165\166\167\168\169\170\171\172\173\174\175" .. "\176\177\178\179\180\181\182\183\184\185\186\187\188\189\190\191" .. "\192\193\194\195\196\197\198\199\200\201\202\203\204\205\206\207" .. "\208\209\210\211\212\213\214\215\216\217\218\219\220\221\222\223" .. "\224\225\226\227\228\229\230\231\232\233\234\235\236\237\238\239" .. "\240\241\242\243\244\245\246\247\248\249\250\251\252\253\254\255" highglyphs_850 = "\213\159\242\254\196\179\218\191\192\217\195\180\194\193\197\205" .. "\186\201\187\200\188\204\185\203\202\206\223\220\219\176\177\178" .. "\255\173\189\156\207\190\221\245\249\184\166\174\170\240\169\238" .. "\248\241\253\252\239\230\244\250\247\251\167\175\172\171\243\168" .. "\183\181\182\199\142\143\146\128\212\144\210\211\222\214\215\216" .. "\209\165\227\224\226\229\153\158\157\235\233\234\154\237\232\225" .. "\133\160\131\198\132\134\145\135\138\130\136\137\141\161\140\139" .. "\208\164\149\162\147\228\148\246\155\151\163\150\129\236\231\152" --% «trfont» (to ".trfont") function trfont(font, trstr1, trstr2) local newfont, i, c1, c2 newfont = copy(font) for i=1,strlen(trstr1) do c1 = strbyte(trstr1, i) c2 = strbyte(trstr2, i) newfont[c2] = font[c1] end return newfont end --% «setfont» (to ".setfont") --% (find-angg "LUA/pio_fontx.c") function setfont(font, forcedheight) local rawfont32 = fonttorawfont(font, 32) local err if not pio_fontx then -- loadextension(getenv("HOME").."/LUA/pio_fontx.so", "pio_fontx_init") loadextension("./pio_fontx.so", "pio_fontx_init") end err = pio_fontx(rawfont32, font.nchars, forcedheight or font.height) if err then prinf("pio_fontx: %s\n", err) end end function setfont_force(font) setfont(font, font.height-1) setfont(font) end --% «vcsatoBIGstring» (to ".vcsatoBIGstring") --% (find-k22file "drivers/char/vc_screen.c" "4 bytes lines,columns,x,y") --% (find-angg "MTA/vtutilsh.c" "vcsa2pnmdata") --% (find-angg "MTA/vtutil" "vcsa2pnm") --% (find-status "netpbm-dev") --% (find-vldifile "netpbm-dev.list") --% (find-man "5 ppm") vcsa_colors = { [0]=" 0 0 0", [1]=" 0 0 2", [2]=" 0 2 0", [3]=" 0 2 2", [4]=" 2 0 0", [5]=" 2 0 2", [6]=" 2 1 0", [7]=" 2 2 2", [8]=" 1 1 1", [9]=" 1 1 3", [10]=" 1 3 1", [11]=" 1 3 3", [12]=" 3 1 1", [13]=" 3 1 3", [14]=" 3 3 1", [15]=" 3 3 3", } function vcsatoBIGstr(vcsa, font, width, colors) local lines, columns, cursorx, cursory = strbyte(vcsa, 1), strbyte(vcsa, 2), strbyte(vcsa, 3), strbyte(vcsa, 4) local header = format("P3\n%d %d\n3\n", columns*width, lines*font.height) local bigstr = "" local bigy, rowpairs, bigrowstr, scanline, rowstr, col, char, attr, charscanline, fg, bg, minirowstr, i, bit for bigy=0,lines-1 do rowpairs = strsub(vcsa, bigy*columns*2+5, (bigy+1)*columns*2+4) bigrowstr = "" for scanline=1,font.height do rowstr = "" for col=0,columns-1 do char = strbyte(rowpairs, col*2+1) attr = strbyte(rowpairs, col*2+2) -- px(char, scanline) charscanline = strbyte(font[char], scanline) bg = colors[rshift(attr, 4)] fg = colors[band(attr, 15)] minirowstr = "" for i,bit in bits do if band(charscanline, bit) ~= 0 then minirowstr = minirowstr .. fg else minirowstr = minirowstr .. bg end end if width == 9 then minirowstr = minirowstr .. bg end rowstr = rowstr .. minirowstr end bigrowstr = bigrowstr .. rowstr .. "\n" end bigstr = bigstr .. bigrowstr end return header .. bigstr end function loadfont(str) if strlen(str) < 1024 then str = readfile(expandfname(str)) end if band(strlen(str), 255) == 0 then return rawfonttofont(str) elseif band(strlen(str), 255) == 4 then return psftofont(str) end printf("loadfont: str is not a font (len=%d\n)", strlen(str)) end function savefont(font, ...) local i, fname for i=1,getn(arg) do fname = arg[i] if strsub(fname, -4) == ".psf" then writefile(expandfname(fname), fonttopsf(font)) printf("Saved as psf: %s\n", fname) elseif strsub(fname, -7) == ".matrix" then writefile(expandfname(fname), fonttobigstr(font, 0, 255)) printf("Saved as text matrix: %s\n", fname) else writefile(expandfname(fname), fonttorawfont(font, font.height)) printf("Saved as raw font: %s\n", fname) end end end -- (find-luafile "README.rttpatch") -- (find-luanode "For Statement") -- (find-luanode "strbyte") --% «e_scripts» (to ".e_scripts") E_SCRIPTS = [[ #* cd ~/vtutil/ dllua inc.lua vtutil.lua mathchars.lua \ -e 'font850=loadfont("ega1.8")' makefonts_8.lua #* cd ~/vtutil/ dllua inc.lua vtutil.lua -e 'setfont(loadfont("latin.8"))' #* cd ~/vtutil/ dllua inc.lua vtutil.lua -e 'setfont_force(loadfont("latin.8"))' #* lua ~/vtutil/inc.lua ~/vtutil/vtutil.lua \ -e 'savefont("foo.psf"); savefont("aa")' #* lua ~/vtutil/inc.lua ~/vtutil/vtutil.lua \ -e "print(fonttobigstr(rawfonttofont(readfile(\"$HOME/MTA/math1.8\"), 256, 8), 0, 255))" #* lua ~/vtutil/inc.lua ~/vtutil/vtutil.lua \ -e "print(fonttobigstr(psftofont(readfile(\"$HOME/MTA/math1.8.psf\")), 0, 255))" #* lua ~/vtutil/inc.lua ~/vtutil/vtutil.lua \ -e 'px(bigstrtorawarr(demo_bigstr))' |& l #* # (find-angg "LUA/pio_fontx.c") cd ~/vtutil/; gcc -g -Wall -shared -o pio_fontx.so pio_fontx.c #* dllua ~/vtutil/inc.lua ~/vtutil/vtutil.lua \ -e "setfont(psftofont(readfile(\"$HOME/vtutil/math1.8.psf\")))" #* lua ~/vtutil/inc.lua ~/vtutil/vtutil.lua \ -e 'writefile("/tmp/v.ppm", vcsatoBIGstr(readfile("/dev/vcsa4"), psftofont(readfile("/home/root/MTA/ega1.8.psf")), 9, vcsa_colors))' #* pnmtopng < /tmp/v.ppm > /tmp/v.png #* cd ~/vtutil/ lua inc.lua vtutil.lua -e ' px(split_clines(2, "A B C", "a b c", "D E F", "d e f")) ' #* cd ~/vtutil/ dllua inc.lua vtutil.lua \ -e 'write(vcsatounix(readfile("/debian/tmp/vcsa1")))' #* ]] -- Local Variables: -- coding: no-conversion -- ee-anchor-format: "«%s»" -- ee-charset-indicator: "Ñ" -- ee-comment-format: "-- %s\n" -- End: