⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 font2pcl.ps

📁 GhostScript的源代码
💻 PS
📖 第 1 页 / 共 2 页
字号:
%    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 + -