晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /usr/share/doc/kbd/ |
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>