Update ooo320-m1
[ooovba.git] / vcl / unx / source / printergfx / psheader.ps
blob7b947b3a470b1251697d454c95ad0dc7b99c242a
1 %*************************************************************************
3 % DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
5 % Copyright 2008 by Sun Microsystems, Inc.
7 % OpenOffice.org - a multi-platform office productivity suite
9 % $RCSfile: psheader.ps,v $
11 % $Revision: 1.7 $
13 % This file is part of OpenOffice.org.
15 % OpenOffice.org is free software: you can redistribute it and/or modify
16 % it under the terms of the GNU Lesser General Public License version 3
17 % only, as published by the Free Software Foundation.
19 % OpenOffice.org is distributed in the hope that it will be useful,
20 % but WITHOUT ANY WARRANTY; without even the implied warranty of
21 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22 % GNU Lesser General Public License version 3 for more details
23 % (a copy is included in the LICENSE file that accompanied this code).
25 % You should have received a copy of the GNU Lesser General Public License
26 % version 3 along with OpenOffice.org.  If not, see
27 % <http://www.openoffice.org/license.html>
28 % for a copy of the LGPLv3 License.
30 %*************************************************************************
34 % readpath
36 % The intention of readpath is to save disk space since the vcl clip region routines 
37 % produce a huge amount of lineto/moveto commands
39 % The principal idea is to maintain the current point on stack and to provide only deltas
40 % in the command. These deltas are added to the current point. The new point is used for
41 % the lineto and moveto command and saved on stack for the next command.
43 % pathdict implements binary/hex representation of lineto and moveto commands. 
44 % The command consists of a 1byte opcode to switch between lineto and moveto and the size
45 % of the following delta-x and delta-y values. The opcode is read with /rcmd, the two 
46 % coordinates are read with /rhex. The whole command is executed with /xcmd
48
50 /pathdict dup 8 dict def load 
51 begin
53         % the command is of the bit format cxxyy
54         % with c=0 meaning lineto
55         %      c=1 meaning moveto
56         % xx is a 2bit value for the number of bytes for x position
57         % yy is the same for y, values are off by one: 00 means 1; 11 means 4 !
58         % the command has been added to 'A' to be always in the ascii character
59         % range. the command is followed by 2*xx + 2*yy hexchars. 
60         % '~' denotes the special case of EOD 
61         /rcmd   { 
62                                 { 
63                                         currentfile 1 string readstring % s bool
64                                         pop                                                             % s
65                                         0 get                                                   % s[0]
66                                                                                                         % --- check wether s[0] is CR, LF ...
67                                         dup 32 gt                                               % s > ' ' ? then read on
68                                         { exit }
69                                         { pop  }
70                                         ifelse
71                                 }
72                                 loop
74                                 dup 126 eq { pop exit } if              % -- Exit loop if cmd is '~'
75                                 65 sub                                                  % cmd=s[0]-'A'
76                                                                                                 % -- Separate yy bits
77                                 dup 16#3 and 1 add                              % cmd yy
78                                                                                                 % -- Separate xx bits
79                                 exch                                                    % yy cmd
80                                 dup 16#C and -2 bitshift 
81                                 16#3 and 1 add exch                     % yy xx cmd
82                                                                                                 % -- Separate command bit
83                                 16#10 and 16#10 eq                              % yy xx bool
84                                 3 1 roll exch                                   % bool xx yy
85                         } def
87         % length rhex -- reads a signed hex value of given length
88         % the left most bit of char 0 is considered as the sign (0 means '+', 1 means '-')
89         % the rest of the bits is considered to be the abs value. Please note that this 
90         % does not match the C binary representation of integers 
91         /rhex   { 
92                                 dup 1 sub exch                  % l-1 l
93                                 currentfile exch string readhexstring   % l-1 substring[l] bool
94                                 pop 
95                                 dup 0 get dup                   % l-1 s s[0] s[0]
96                                                                                 % -- Extract the sign
97                                 16#80 and 16#80 eq dup  % l-1 s s[0] sign=- sign=-
98                                                                                 % -- Mask out the sign bit and put value back
99                                 3 1 roll                                % l-1 s sign=- s[0] sign=-
100                                 { 16#7f and } if                % l-1 s sign=- +s[0]
101                                 2 index 0                               % l-1 s sign=- +s[0] s 0
102                                 3 -1 roll put                   % l-1 s sign=- s 0 +s[0]
103                                                                                 % -- Read loop: add to prev sum, mul with 256
104                                 3 1 roll 0                          % sign=- l-1 s Sum=0 
105                                 0 1 5 -1 roll                   % sign=- s Sum=0 0 1 l-1
106                                 {                                               % sign=- s Sum idx
107                                         2 index exch            % sign=- s Sum s idx 
108                                         get                             % sign=- s Sum s[idx]
109                                         add     256 mul                 % sign=- s Sum=(s[idx]+Sum)*256
110                                 }
111                                 for
112                                                                                 % -- mul was once too often, weave in the sign
113                                 256 div                                 % sign=- s Sum/256
114                                 exch pop                                % sign=- Sum/256
115                                 exch { neg } if                 % (sign=- ? -Sum : Sum) 
116                         } def
118         % execute a single command, the former x and y position is already on stack
119         % only offsets are read from cmdstring 
120         /xcmd   {                                                       % x y
121                                 rcmd                                    % x y bool wx wy
122                                 exch rhex                               % x y bool wy Dx
123                                 exch rhex                               % x y bool Dx Dy
124                                 exch 5 -1 roll                  % y bool Dy Dx x
125                                 add exch                                % y bool X Dy
126                                 4 -1 roll add                   % bool X Y
127                                 1 index 1 index                 % bool X Y X Y
128                                 5 -1 roll                               % X Y X Y bool
129                                 { moveto }
130                                 { lineto }
131                                 ifelse                                  % X Y
132                         } def
135 /readpath
136 {       
137         0 0             % push initial-x initial-y 
138         pathdict begin
139                 { xcmd } loop 
140         end
141         pop pop % pop final-x final-y
142 } def
146 % if languagelevel is not in the systemdict then its level 1 interpreter:
147 % provide compatibility routines
151 systemdict /languagelevel known not
153         % string numarray xxshow -
154         % does only work for single byte fonts
155         /xshow {
156                 exch dup                                        % a s s
157                 length 0 1                                      % a s l(s) 1 1
158                 3 -1 roll 1 sub                         % a s 0 1 l(s)-1
159                 {                                                       % a s idx
160                         dup                                     % a s idx idx
161                                                                         % -- extract the delta offset
162                         3 index exch get                % a s idx a[idx]
163                                                                         % -- extract the character
164                         exch                                    % a s a[idx] idx
165                         2 index exch get                % a s a[idx] s[idx]
166                                                                         % -- create a tmp string for show
167                         1 string dup 0                  % a s a[idx] s[idx] s1 s1 0
168                         4 -1 roll                               % a s a[idx] s1 s1 0 s[idx]
169                         put                                             % a s a[idx] s1
170                                                                         % -- store the current point
171                         currentpoint 3 -1 roll  % a s a[idx] x y s1
172                                                                         % -- draw the character
173                         show                                    % a s a[idx] x y  
174                                                                         % -- move to the offset
175                         moveto 0 rmoveto                % a s
176                 }
177                 for
178                 pop pop                                         % -
179         } def
181         % x y width height rectfill
182         % x y width height rectshow
183         % in contrast to the languagelevel 2 operator 
184         % they use and change the currentpath
185         /rectangle {
186                 4 -2 roll                       % width height x y 
187                 moveto                          % width height
188                 1 index 0 rlineto       % width height  % rmoveto(width,  0)
189                 0 exch rlineto          % width                 % rmoveto(0,      height)
190                 neg 0 rlineto           % -                     % rmoveto(-width, 0)
191                 closepath
192         } def 
194         /rectfill   { rectangle fill   } def
195         /rectstroke { rectangle stroke } def
197 if 
199 % -- small test program
200 % 75 75 moveto /Times-Roman findfont 12 scalefont setfont
201 % <292a2b2c2d2e2f30313233343536373839>
202 % [5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 5] xshow <21>[0] xshow 
203 % showpage
207 % shortcuts for image header with compression
211 /psp_lzwfilter { 
212     currentfile /ASCII85Decode filter /LZWDecode filter 
213 } def
214 /psp_ascii85filter { 
215     currentfile /ASCII85Decode filter 
216 } def
217 /psp_lzwstring { 
218     psp_lzwfilter 1024 string readstring 
219 } def
220 /psp_ascii85string { 
221     psp_ascii85filter 1024 string readstring 
222 } def
223 /psp_imagedict {
224     /psp_bitspercomponent { 
225         3 eq 
226         { 1 }
227         { 8 } 
228         ifelse 
229     } def
230     /psp_decodearray { 
231         [ [0 1 0 1 0 1] [0 255] [0 1] [0 255] ] exch get 
232     } def 
234     7 dict dup
235         /ImageType 1                    put dup
236         /Width 7 -1 roll                put dup
237         /Height 5 index                 put dup
238         /BitsPerComponent 4 index 
239             psp_bitspercomponent        put dup
240         /Decode 5 -1 roll 
241             psp_decodearray             put dup
242         /ImageMatrix [1 0 0 1 0 0] dup 
243             5 8 -1 roll put             put dup
244         /DataSource 4 -1 roll 
245             1 eq 
246             { psp_lzwfilter } 
247             { psp_ascii85filter } 
248             ifelse                      put
249 } def
254 % font encoding and reencoding
258 /ISO1252Encoding [
259     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
260     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
261     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
262     /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
263     /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
264     /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
265     /zero /one /two /three /four /five /six /seven
266     /eight /nine /colon /semicolon /less /equal /greater /question
267     /at /A /B /C /D /E /F /G
268     /H /I /J /K /L /M /N /O
269     /P /Q /R /S /T /U /V /W
270     /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
271     /grave /a /b /c /d /e /f /g
272     /h /i /j /k /l /m /n /o
273     /p /q /r /s /t /u /v /w
274     /x /y /z /braceleft /bar /braceright /asciitilde /unused
275     /Euro /unused /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl
276     /circumflex /perthousand /Scaron /guilsinglleft /OE /unused /Zcaron /unused
277     /unused /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash
278     /tilde /trademark /scaron /guilsinglright /oe /unused /zcaron /Ydieresis
279     /space /exclamdown /cent /sterling /currency /yen /brokenbar /section
280     /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron
281     /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
282     /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
283     /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
284     /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
285     /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
286     /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
287     /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
288     /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
289     /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
290     /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis
291 ] def
293 % /fontname /encoding psp_findfont 
294 /psp_findfont {
295     exch dup                % encoding fontname fontname 
296     findfont                % encoding fontname
297     dup length dict 
298     begin
299     {  
300         1 index /FID ne
301         { def }
302         { pop pop }
303         ifelse
304     } forall
305     /Encoding 3 -1 roll def
306     currentdict 
307     end
308     /psp_reencodedfont exch definefont
309 } def
311 % bshow shows a text in artificial bold
312 % this is achieved by first showing the text
313 % then stroking its outline over it with
314 % the linewidth set to the second parameter
315 % usage: (string) num bshow
317 /bshow {
318   currentlinewidth              % save current linewidth
319   3 1 roll                              % move it to the last stack position
320   currentpoint                  % save the current point
321   3 index                               % copy the string to show
322   show                                  % show it
323   moveto                                % move to the original coordinates again
324   setlinewidth                  % set the linewidth
325   false charpath                % create the outline path of the shown string
326   stroke                                % and stroke it
327   setlinewidth                  % reset the stored linewidth
328 } def
330 % bxshow shows a text with a delta array in artificial bold
331 % that is it does what bshow does for show
332 % usage: (string) [deltaarray] num bxshow
334 /bxshow {
335   currentlinewidth              % save linewidth
336   4 1 roll                              % move it to the last stack position
337   setlinewidth                  % set the new linewidth
338   exch                                  % exchange string and delta array
339   dup
340   length                                % get length of string
341   1 sub                                 % prepare parameters for {} for
342   0 1
343   3 -1 roll
344   {
345     1 string                    % create a string object length 1
346     2 index                             % get the text
347     2 index                             % get charpos (for index variable)
348     get                                 % have char value at charpos
349     1 index                             % prepare string for put
350     exch
351     0
352     exch
353     put                                 % put into string of length 1
354     dup                                 % duplicate the it
355     currentpoint                % save current position
356     3 -1 roll                   % prepare show
357     show                                % show the character
358     moveto                              % move back to beginning
359     currentpoint                % save current position
360     3 -1 roll                   % prepare outline path of character
361     false charpath
362     stroke                              % stroke it
363     moveto                              % move back
364     % now move to next point
365     2 index                             % get advance array
366     exch                                % get charpos
367     get                                 % get advance element
368     0 rmoveto                   % advance current position
369   } for
370   pop pop                               % remove string and delta array
371   setlinewidth                  % restore linewidth
372 } def