Server IP : 103.119.228.120 / Your IP : 52.15.68.97 Web Server : Apache System : Linux v8.techscape8.com 3.10.0-1160.119.1.el7.tuxcare.els2.x86_64 #1 SMP Mon Jul 15 12:09:18 UTC 2024 x86_64 User : nobody ( 99) PHP Version : 5.6.40 Disable Function : shell_exec,symlink,system,exec,proc_get_status,proc_nice,proc_terminate,define_syslog_variables,syslog,openlog,closelog,escapeshellcmd,passthru,ocinum cols,ini_alter,leak,listen,chgrp,apache_note,apache_setenv,debugger_on,debugger_off,ftp_exec,dl,dll,myshellexec,proc_open,socket_bind,proc_close,escapeshellarg,parse_ini_filepopen,fpassthru,exec,passthru,escapeshellarg,escapeshellcmd,proc_close,proc_open,ini_alter,popen,show_source,proc_nice,proc_terminate,proc_get_status,proc_close,pfsockopen,leak,apache_child_terminate,posix_kill,posix_mkfifo,posix_setpgid,posix_setsid,posix_setuid,dl,symlink,shell_exec,system,dl,passthru,escapeshellarg,escapeshellcmd,myshellexec,c99_buff_prepare,c99_sess_put,fpassthru,getdisfunc,fx29exec,fx29exec2,is_windows,disp_freespace,fx29sh_getupdate,fx29_buff_prepare,fx29_sess_put,fx29shexit,fx29fsearch,fx29ftpbrutecheck,fx29sh_tools,fx29sh_about,milw0rm,imagez,sh_name,myshellexec,checkproxyhost,dosyayicek,c99_buff_prepare,c99_sess_put,c99getsource,c99sh_getupdate,c99fsearch,c99shexit,view_perms,posix_getpwuid,posix_getgrgid,posix_kill,parse_perms,parsesort,view_perms_color,set_encoder_input,ls_setcheckboxall,ls_reverse_all,rsg_read,rsg_glob,selfURL,dispsecinfo,unix2DosTime,addFile,system,get_users,view_size,DirFiles,DirFilesWide,DirPrintHTMLHeaders,GetFilesTotal,GetTitles,GetTimeTotal,GetMatchesCount,GetFileMatchesCount,GetResultFiles,fs_copy_dir,fs_copy_obj,fs_move_dir,fs_move_obj,fs_rmdir,SearchText,getmicrotime MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /usr/local/ssl/local/ssl/share/doc/kbd-1.15.5/ |
Upload File : |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9"> <TITLE>Font-formats recognized by the Linux kbd package: PSF fonts</TITLE> <LINK HREF="font-formats-2.html" REL=next> <LINK HREF="font-formats.html#toc1" REL=contents> </HEAD> <BODY> <A HREF="font-formats-2.html">Next</A> Previous <A HREF="font-formats.html#toc1">Contents</A> <HR> <H2><A NAME="s1">1. PSF fonts</A></H2> <P>PSF fonts come in two types: old (psf1) and new (psf2). A PSF font consists of (1) <A HREF="#psfheader">The header</A>, (2) <A HREF="#psffont">The font</A>, (3) <A HREF="#psfunimap">Unicode information</A>. <P> <H2><A NAME="psfheader"></A> <A NAME="ss1.1">1.1 The header</A> </H2> <P>For psf1 this is <BLOCKQUOTE><CODE> <PRE> #define PSF1_MAGIC0 0x36 #define PSF1_MAGIC1 0x04 #define PSF1_MODE512 0x01 #define PSF1_MODEHASTAB 0x02 #define PSF1_MODEHASSEQ 0x04 #define PSF1_MAXMODE 0x05 #define PSF1_SEPARATOR 0xFFFF #define PSF1_STARTSEQ 0xFFFE struct psf1_header { unsigned char magic[2]; /* Magic number */ unsigned char mode; /* PSF font mode */ unsigned char charsize; /* Character size */ }; </PRE> </CODE></BLOCKQUOTE> <P>For psf2 this is <BLOCKQUOTE><CODE> <PRE> #define PSF2_MAGIC0 0x72 #define PSF2_MAGIC1 0xb5 #define PSF2_MAGIC2 0x4a #define PSF2_MAGIC3 0x86 /* bits used in flags */ #define PSF2_HAS_UNICODE_TABLE 0x01 /* max version recognized so far */ #define PSF2_MAXVERSION 0 /* UTF8 separators */ #define PSF2_SEPARATOR 0xFF #define PSF2_STARTSEQ 0xFE struct psf2_header { unsigned char magic[4]; unsigned int version; unsigned int headersize; /* offset of bitmaps in file */ unsigned int flags; unsigned int length; /* number of glyphs */ unsigned int charsize; /* number of bytes for each character */ unsigned int height, width; /* max dimensions of glyphs */ /* charsize = height * ((width + 7) / 8) */ }; </PRE> </CODE></BLOCKQUOTE> <P>The meaning is fairly clear from the field names. The fonts here are bitmap fonts (not, for example, vector fonts), and each glyph has a <CODE>height</CODE> and a <CODE>width</CODE>. The bitmap for a glyph is stored as <CODE>height</CODE> consecutive pixel rows, where each pixel row consists of <CODE>width</CODE> bits followed by some filler bits in order to fill an integral number of (8-bit) bytes. Altogether the bitmap of a glyph takes <CODE>charsize</CODE> bytes. <P>For psf1 the width is constant 8, so that the height equals the charsize. <P>The number of glyphs in the font equals <CODE>length</CODE>. For psf1 the length is constant 256, unless the <CODE>PSF1_MODE512</CODE> bit is set in the <CODE>mode</CODE> field, in which case it is 512. <P>The font is followed by a table associating Unicode values with each glyph in case (for psf1) the <CODE>PSF1_MODEHASTAB</CODE> bit is set in the <CODE>mode</CODE> field, or (for psf2) the <CODE>PSF2_HAS_UNICODE_TABLE</CODE> bit is set in the <CODE>flags</CODE> field. <P>The starting offset of the bitmaps in the font file is given by <CODE>headersize</CODE>. (This allows the header to grow, probably depending on <CODE>version</CODE>, without changes in the code.) <P>The integers in the psf2 header struct are little endian 4-byte integers. <P> <H2><A NAME="psffont"></A> <A NAME="ss1.2">1.2 The font</A> </H2> <P>The actual bitmaps. <P> <H2><A NAME="psfunimap"></A> <A NAME="ss1.3">1.3 Unicode information</A> </H2> <P>The bitmaps may be followed by a Unicode description of the glyphs. This Unicode description of a position has grammar <BLOCKQUOTE><CODE> <PRE> <unicodedescription> := <uc>*<seq>*<term> <seq> := <ss><uc><uc>* <ss> := psf1 ? 0xFFFE : 0xFE <term> := psf1 ? 0xFFFF : 0xFF </PRE> </CODE></BLOCKQUOTE> where <CODE><uc></CODE> is a 2-byte little endian Unicode value (psf1), or a Unicode value coded in UTF-8 (psf2), and <CODE>*</CODE> denotes zero or more occurrences of the preceding item. <P>The semantics is as follows. The leading <CODE><uc>*</CODE> part gives Unicode symbols that are all represented by this font position. The following sequences are sequences of Unicode symbols - probably a symbol together with combining accents - also represented by this font position. <P>Example: At the font position for a capital A-ring glyph, we may have (psf1): <BLOCKQUOTE><CODE> <PRE> 00C5,212B,FFFE,0041,030A,FFFF </PRE> </CODE></BLOCKQUOTE> where the Unicode values here are LATIN CAPITAL LETTER A WITH RING ABOVE and ANGSTROM SIGN and LATIN CAPITAL LETTER A and COMBINING RING ABOVE. Some font positions may be described by sequences only, namely when there is no precomposed Unicode value for the glyph. <P> <H2><A NAME="ss1.4">1.4 Historical</A> </H2> <P>PSF stands for PC Screen Font. The psf1 format without Unicode map was designed by H. Peter Anvin in 1989 or so for his DOS screen font editor <CODE>FONTEDIT.EXE</CODE>. In Oct 1994 he added the Unicode map and the programs <CODE>psfaddtable</CODE>, <CODE>psfgettable</CODE>, <CODE>psfstriptable</CODE> to manipulate it - see <CODE>kbd-0.90</CODE>. Andries Brouwer added support for sequences of Unicode values and the psf2 format in Sep 1999 in order to handle Tibetan - see <CODE>kbd-1.00</CODE>. <P> <HR> <A HREF="font-formats-2.html">Next</A> Previous <A HREF="font-formats.html#toc1">Contents</A> </BODY> </HTML>