123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- % Copyright (C) 1992, 1996 Aladdin Enterprises. All rights reserved.
- %
- % This file is part of AFPL Ghostscript.
- %
- % AFPL 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 Free Public License (the
- % "License") for full details.
- %
- % Every copy of AFPL 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 AFPL 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: impath.ps,v 1.3 2000/12/28 17:06:07 alexcher Exp $
- % impath.ps
- % Reverse-rasterize a bitmap to produce a Type 1 outline.
- % (This was formerly a Ghostscript operator implemented in C.)
- % <image> <width> <height> <wx> <wy> <ox> <oy> <string>
- % type1imagepath <substring>
- % Converts an image (bitmap) description of a character into
- % a scalable description in Adobe Type 1 format. The
- % current transformation matrix should be the same as the
- % FontMatrix of the font in which this character will be
- % used: this establishes the scaling relationship between
- % image pixels (the image is assumed to be 1 unit high in
- % user space) and the character coordinate system used in
- % the scalable description. wx and wy are the character
- % width, and ox and oy are the character origin relative
- % to the lower left corner of the bitmap, in *pixels*.
- % The image is assumed to be stored in left-to-right,
- % top-to-bottom order. Note that this is not consistent
- % with the `image' operator's interpretation of the CTM.
- % All coordinates in the scalable description are rounded to
- % integers, so the coefficients in the FontMatrix should
- % be on the order of 1/N for some value of N that is
- % either a multiple of the height/width or is large
- % compared to the width and height. (There is a
- % convention, which some PostScript programs rely on, that
- % N=1000.)
- % Note that the encoded description has *not* been subjected
- % to CharString encryption, which is necessary before the
- % description can be given to type1addpath: to do this,
- % follow the type1imagepath with
- % 4330 exch dup .type1encrypt exch pop
- % If the description is too complex to fit into the supplied
- % string, a limitcheck error results. A good rule of
- % thumb is that the size of the string should be about 6
- % times the number of 1-bits in the image that are not
- % completely surrounded by other 1-bits.
- % Import the Type 1 opcodes.
- (type1ops.ps) runlibfile
- 100 dict
- dup /type1imagepath_dict exch def
- begin
- /rc { round cvi } bind def
- /moving [/rmoveto /hmoveto /vmoveto] def
- /drawing [/rlineto /hlineto /vlineto] def
- % Convert the current path to a Type 1 token array.
- /putxy % x y ops -> cs_elements
- { 3 -1 roll dup x sub rc exch /x exch def
- 3 -1 roll dup y sub rc exch /y exch def
- % stack: ops dx dy
- dup 0 eq
- { % dy = 0, use hmoveto/lineto
- pop exch 1 get
- }
- { 1 index 0 eq
- { % dx = 0, use vmoveto/lineto
- exch pop exch 2 get
- }
- { % use rmoveto/rlineto
- 3 -1 roll 0 get
- }
- ifelse
- }
- ifelse
- } bind def
- /pathtotype1 % -> charstack
- { 3 dict begin /x 0 def /y 0 def
- mark
- { moving putxy
- }
- { drawing putxy
- }
- { % Convert curve to relative form
- x y 3
- { exch neg 7 index add rc
- exch neg 6 index add rc
- 8 -2 roll
- }
- repeat /y exch def /x exch def
- 1 index 0 eq 5 index 0 eq and % dy1=dx3=0, hv
- { 5 -1 roll pop exch pop /hvcurveto
- }
- { dup 0 eq 6 index 0 eq and % dx1=dy3=0, vh
- { 6 -1 roll pop pop /vhcurveto
- }
- { /rrcurveto % none of the above
- }
- ifelse
- }
- ifelse
- }
- { /closepath
- }
- pathforall end
- } bind def
- end % type1imagepath_dict
- % The main program
- /type1imagepath % image width height wx wy ox oy string ->
- % substring
- { type1imagepath_dict begin
- /tsave save def
- /ostring exch def
- /oy exch def /ox exch def
- /wy exch def /wx exch def
- /height exch def /width exch def
- /data exch def
- /ofilter ostring /NullEncode filter def
- /raster width 7 add 8 idiv def
- % Construct the coordinate transformation.
- height dup scale
- matrix currentmatrix matrix invertmatrix setmatrix
- % Determine the left side bearing.
- /lsbx width
- 0 1 width 1 sub
- { dup dup 8 idiv 0 exch
- raster raster height mul 1 sub
- { data exch get or }
- for exch 8 mod bitshift 128 and 0 ne
- { exch pop exit }
- if pop
- }
- for def
- % Compute and encode the origin, width, and side bearing.
- mark
- ox oy dtransform
- rc /opty exch def rc /optx exch def
- wx wy dtransform
- rc /iwy exch def rc /iwx exch def
- lsbx ox sub 0 dtransform
- rc /ilsby exch def rc /ilsbx exch def
- ilsbx
- iwy 0 ne ilsby 0 ne or
- { ilsby iwx iwy /sbw }
- { iwx /hsbw }
- ifelse
- ofilter charstack_write
- % Flip over the Y axis, because the image is stored top-to-bottom.
- [1 0 0 -1 0 height] concat
- % Account for the character origin.
- lsbx oy translate
- % Trace the outline.
- newpath
- width height data .imagepath
- gsave matrix setmatrix pathtotype1 grestore
- ofilter charstack_write
- % Terminate the output
- mark /endchar ofilter charstack_write
- ofilter .fileposition ofilter closefile % flush buffers
- ostring 0 3 -1 roll getinterval
- tsave restore
- end
- } bind def
|