📄 font2pcl.ps
字号:
% Copyright (C) 1993, 1994, 1995, 1997 Aladdin Enterprises. All rights reserved.
%
% This file is part of Aladdin Ghostscript.
%
% Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND. No author
% or distributor accepts any responsibility for the consequences of using it,
% or for whether it serves any particular purpose or works at all, unless he
% or she says so in writing. Refer to the Aladdin Ghostscript Free Public
% License (the "License") for full details.
%
% Every copy of Aladdin Ghostscript must include a copy of the License,
% normally in a plain ASCII text file named PUBLIC. The License grants you
% the right to copy, modify and redistribute Aladdin Ghostscript, but only
% under certain conditions described in the License. Among other things, the
% License requires that the copyright notice and this notice be preserved on
% all copies.
% $Id: font2pcl.ps $
% font2pcl.ps
% Write out a font as a PCL bitmap font.
/pcldict 60 dict def
% Write out the current font as a PCL bitmap font.
% The current transformation matrix defines the font size and orientation.
/WriteResolution? false def % true=use "resolution bound font" format,
% false=use older format
/LJ4 false def % true=use LJ4 Typeface code
% false=use LJIIP/IID/IIIx Typeface code
pcldict begin % internal procedures
/findstring % <string> <substring> findstring <bool>
{ search { pop pop pop true } { pop false } ifelse
} def
% Determine which set of keywords is present in a string.
% The last keyword set must be empty.
/keysearch % <string> <array of arrays of keywords> keysearch <index>
{ 0 1 2 index length 1 sub
{ 2 copy get true exch
{ % Stack: <string> <a.a.k.> <index> <bool> <keyword>
4 index exch findstring and
}
forall
{ 0 exch getinterval exit
}
if pop
}
for
exch pop length % invalid index if missing
} def
% Determine the device height of a string in quarter-dots.
/charheight % <string> charheight <int>
{ gsave newpath 0 0 moveto false charpath
pathbbox exch pop exch sub exch pop 0 exch grestore
dtransform add abs 4 mul cvi
} def
% Compute an integer version of the transformed FontBBox.
/inflate % <num> inflate <num>
{ dup 0 gt { ceiling } { floor } ifelse
} def
/ixbbox % - ixbbox <llx> <lly> <urx> <ury>
{ /FontBBox load aload pop % might be executable or literal
4 2 roll transform exch truncate cvi exch truncate cvi
4 2 roll transform exch inflate cvi exch inflate cvi
} def
% Determine the original font of a possibly transformed font.
% Since some badly behaved PostScript files construct transformed
% fonts "by hand", we can't just rely on the OrigFont pointers.
% Instead, if a font with the given name exists, and if its
% entries for FontType and UniqueID match those of the font we
% obtain by following the OrigFont chain, we use that font.
/origfont
{ { dup /OrigFont known not { exit } if /OrigFont get } loop
FontDirectory 1 index /FontName get .knownget
{ % Stack: origfont namedfont
1 index /FontType get 1 index /FontType get eq
{ 1 index /UniqueID .knownget
{ 1 index /UniqueID .knownget
{ eq { exch } if }
{ pop }
ifelse
}
if
}
if pop
}
if
} def
% Determine the bounding box of the current device's image.
% Free variables: row, zerow.
/devbbox % <rw> <rh> devbbox <ymin> <ymax1> <xmin> <xmax1>
{ % Find top and bottom whitespace.
dup
{ dup 0 eq { exit } if 1 sub
dup currentdevice exch row copyscanlines
zerow ne { 1 add exit } if
}
loop % ymax1
0
{ 2 copy eq { exit } if
dup currentdevice exch row copyscanlines
zerow ne { exit } if
1 add
}
loop % ymin
exch
% Find left and right whitespace.
3 index 0
% Stack: rw rh ymin ymax1 xmin xmax1
3 index 1 4 index 1 sub
{ currentdevice exch row copyscanlines .findzeros
exch 4 1 roll max 3 1 roll min exch
}
for % xmin xmax1
% Special check: xmin > xmax1 if height = 0
2 copy gt { exch pop dup } if
6 -2 roll pop pop
} def
% Write values on outfile.
/w1 { 255 and outfile exch write } def
/w2 { dup -8 bitshift w1 w1 } def
/wbyte % <byte> <label> wbyte
{ VDEBUG { print ( =byte= ) print dup == flush } { pop } ifelse w1
} def
/wword % <word16> <label> wword
{ VDEBUG { print ( =word= ) print dup == flush } { pop } ifelse w2
} def
/wdword % <word32> <label> wdword
{ VDEBUG { print ( =dword= ) print dup == flush } { pop } ifelse
dup -16 bitshift w2 w2
} def
/style.posture.keys
[ { (Italic) } { (Oblique) }
{ }
] def
/style.posture.values <010100> def
/style.appearance.width.keys
[ { (Ultra) (Compressed) }
{ (Extra) (Compressed) }
{ (Extra) (Condensed) }
{ (Extra) (Extended) }
{ (Extra) (Expanded) }
{ (Compressed) }
{ (Condensed) }
{ (Extended) }
{ (Expanded) }
{ }
] def
/style.appearance.width.values <04030207070201060600> def
/width.type.keys
[ { (Ultra) (Compressed) }
{ (Extra) (Compressed) }
{ (Extra) (Condensed) }
{ (Extra) (Expanded) }
{ (Compressed) }
{ (Condensed) }
{ (Expanded) }
{ }
] def
/width.type.values <fbfcfd03fdfe0200> def
/stroke.weight.keys
[ { (Ultra) (Thin) }
{ (Ultra) (Black) }
{ (Extra) (Thin) }
{ (Extra) (Light) }
{ (Extra) (Bold) }
{ (Extra) (Black) }
{ (Demi) (Light) }
{ (Demi) (Bold) }
{ (Semi) (Light) }
{ (Semi) (Bold) }
{ (Thin) }
{ (Light) }
{ (Bold) }
{ (Black) }
{ }
] def
/stroke.weight.values <f907fafc0406fe02ff01fbfd030500> def
/vendor.keys
[ { (Agfa) }
{ (Bitstream) }
{ (Linotype) }
{ (Monotype) }
{ (Adobe) }
{ }
] def
/vendor.default.index 4 def % might as well be Adobe
/old.vendor.values <020406080a00> def
/new.vendor.values <010203040500> def
/vendor.initials (CBLMA\000) def
currentdict readonly end pop % pcldict
% Convert and write a PCL font for the current font and transformation.
% Write the font header. We split this off only to avoid overflowing
% the limit on the maximum size of a procedure.
% Free variables: outfile uury u0y rw rh orientation uh ully
/writefontheader
{ outfile (\033\)s) writestring
outfile 64 WriteResolution? { 4 add } if
Copyright length add write==only
outfile (W) writestring
WriteResolution? { 20 68 } { 0 64 } ifelse
(Font Descriptor Size) wword
(Header Format) wbyte
1 (Font Type) wbyte
FullName style.posture.keys keysearch style.posture.values exch get
FullName style.appearance.width.keys keysearch
style.appearance.width.values exch get 4 mul add
PaintType 2 eq { 32 add } if
/style exch def
style -8 bitshift (Style MSB) wbyte
0 (Reserved) wbyte
/baseline uury 1 sub u0y sub def
baseline (Baseline Position) wword
rw (Cell Width) wword
rh (Cell Height) wword
orientation (Orientation) wbyte
FontInfo /isFixedPitch .knownget not { false } if
{ 0 } { 1 } ifelse (Spacing) wbyte
% Use loop/exit to fake a multiple-exit block.
{ Encoding StandardEncoding eq { 10 (J) exit } if
Encoding ISOLatin1Encoding eq { 11 (J) exit } if
Encoding SymbolEncoding eq { 19 (M) exit } if
Encoding DingbatsEncoding eq { 10 (L) exit } if
% (Warning: unknown Encoding, using ISOLatin1.\n) print flush
11 (J) exit
}
loop
0 get 64 sub exch 32 mul add (Symbol Set) wword
( ) stringwidth pop 0 dtransform add abs 4 mul
/pitch exch def
pitch cvi (Pitch) wword
uh 4 mul (Height) wword % Height
(x) charheight (x-Height) wword
FullName width.type.keys keysearch
width.type.values exch get (Width Type) wbyte
style 255 and (Style LSB) wbyte
FullName stroke.weight.keys keysearch
stroke.weight.values exch get (Stroke Weight) wbyte
FullName vendor.keys keysearch
dup vendor.initials exch get 0 eq
{ % No vendor in FullName, try Notice
pop Copyright vendor.keys keysearch
dup vendor.initials exch get 0 eq { pop vendor.default.index } if
}
if
/vendor.index exch def
0 (Typeface LSB) wbyte % punt
0 (Typeface MSB) wbyte % punt
0 (Serif Style) wbyte % punt
2 (Quality) wbyte
0 (Placement) wbyte
gsave FontMatrix concat rot neg rotate
/ulwidth
FontInfo /UnderlineThickness .knownget
{ 0 exch dtransform exch pop abs }
{ resolution 100 div }
ifelse def
FontInfo /UnderlinePosition .knownget
{ 0 exch transform exch pop negY ulwidth 2 div add }
{ ully ulwidth add }
ifelse u0y sub
round cvi 1 max 255 min (Underline Position) wbyte
ulwidth round cvi 1 max 255 min (Underline Thickness) wbyte
grestore
uh 1.2 mul 4 mul cvi (Text Height) wword
(average lowercase character) dup stringwidth
pop 0 dtransform add abs
exch length div 4 mul cvi (Text Width) wword
0
{ dup Encoding exch get /.notdef ne { exit } if
1 add
}
loop (First Code) wword
255
{ dup Encoding exch get /.notdef ne { exit } if
1 sub
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -