This file is indexed.

/usr/share/psychtoolbox-3/PsychFiles/PsychSaveAsEps.m is in psychtoolbox-3-common 3.0.11.20140816.dfsg1-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
function SaveAsEps(filename,m,pageRect,resolution)
% SaveAsEps(filename,m,[pageRect],[resolution]);
% Based on WindowToEps.c of the VideoToolbox.
% Copyright © 1996-2003 Denis G. Pelli
% 
% SaveAsEps converts a grayscale image (in a Matlab matrix) to a
% PostScript file that a LaserWriter or Linotype will accurately render on
% paper. The output file is a standard Encapsulated PostScript File, with
% file type 'EPSF', commonly referred to as an "eps" file. Most word
% processors, e.g. Word and PageMaker, know how to import eps files.
% Macintoshes only understand QuickDraw, not PostScript, so they don't
% know what image the PostScript code would produce. The Macintosh file
% "creator" of the eps file is set to Microsoft Word, so double-clicking
% it will open it as a Word document containg the image.
% 
% I suggest you use the $25 shareware Macintosh application EPS¥Factory 
% to add a PICT preview to your file, based on the postscript already 
% there. You can download EPS¥Factory from 
% web http://www.artage.com/pages/products/products.html
% (The old freeware ps2eps is incompatible with Mac OS 8.6 and 9, alas.)
% The PICT preview will make the image will look approximately right on 
% your monitor, e.g. in Word. 
% 
% If you want to convert the EPS file to some other format, we recommend
% using Adobe Illustrator, especially the "Export to Web" feature.
%
% To import into Word, use the Insert:Picture or
% Insert:File command. Once imported, you can get Word to rescale the
% image by dragging the image's lower right corner while holding down the
% shift key. Try the VideoToolbox demo Grating. Bear in mind that
% on-screen you're looking at the PICT, whereas, when you print on a
% LaserWriter, the image is produced by the PostScript code. When in your
% word processor, the on-screen images will look best if you use the
% Monitors control panel to set your monitor to 256 Grays, but this won't
% affect printing.
% 
% The filename, by convention, should end in '.eps' to indicate that it's
% an encapsulated postscript file, but this is not enforced. The file's
% type is set to 'EPSF' with creator 'R*ch'. (This creator corresponds to
% BBEdit, so double-clicking will open it as a text file in BBEdit, which
% includes a Special:SendPostScript command for downloading poscript
% images to the laserwriter. You can change the creator to be anything you
% want.)
% 
% 	The image matrix must have 8 bits per pixel (i.e. values 0 to 255). No
% color tables are used. The raw pixel value (Apple calls it an "index")
% is sent directly to the printer with no transformation. PostScript
% assumes that the number, from 0 to 255 is proportional to desired
% reflectance, from zero to 1.
%  	The pageRect is subtle. It describes, in typographers points (1/72"),
% the rectangle that your image will be mapped onto on the printed page.
% It is essential that you keep in mind that Apple and Adobe use different
% coordinate systems. Both Apple and Adobe increase x from left to right.
% However, Apple has y increasing from top to bottom, whereas Adobe
% increases y from bottom to top. Adobe's origin is the lower left corner
% of the page, even though that point is usually not printable, since most
% printers can only print to within about a half inch of the edge. The
% pageRect, though supplied in Apple's Rect data structure, must be in
% Adobe's coordinates, respecting the names of the Rect structure's
% fields: left, top, right, bottom. So, for an image to fill most of an
% 8.5x11 page, with 0.5" margins, you might use the following:
% 
% 		pageRect=SetRect(0.5,10.5,8,0.5)*72;
% 
% In printing PostScript halftones the halftone cell size determines both
% the spatial and graylevel resolutions of the resulting image. If the
% "resolution" parameter is positive, then it specifies the cellsPerInch;
% if it's negative then it specifies the number of grayLevels. If
% "resolution" is omitted then the printer will be left at its default
% cell size, which is usually a good choice. Note that there need not be
% any particular correspondence between pixels in your image and cells in
% the halftone; the printer automatically resamples your image to produce
% the halftone.
% 	If you specify cellsPerInch (resolution>0) then the printer will be
% asked to print its halftone with that many halftone cells per inch. E.g.
% to produce a halftone original for subsequent one-to-one reproduction in
% a journal, you'll want the cells to be coarse enough for them to
% reproduce without re-screening, e.g. 100 cells per inch.
% 	Alternatively, if you specify grayLevels (resolution<0) then the printer
% will be asked to print its halftone with cells containing grayLevels-1
% printer pixels, yielding the specified number of gray levels. E.g. you
% might want to force your 300 dpi LaserWriter to use big cells yielding
% 256 gray levels.
%  	If resolution==0 or resolution==[], it will be ignored.
% 	Here's a minimal example that prints an image to disk, preserving the
% size and scale of the image,
% 
% 		SaveAsEps('test.eps',m);
% 
% The default pageRect is equivalent to this:
% 
% 		pageRect=SetRect(0,-0,size(m,2),-size(m,1));% Adobe coordinates
% 		pageRect=CenterRect(pageRect,SetRect(0,11,8.5,0)*72);
% 		SaveAsEps('test.eps',m,pageRect);
% 
% Tiling is something we often want to do, creating a huge image by taping
% many pages together. You accomplish this by repeatedly printing the huge
% image--only one pageful appears each time--shifting the image so that
% eventually every bit has been printed. (It's slow, since the whole image
% is transmitted to the printer each time.) Here's an example that creates
% a big "width" by "height" image. We tile onto multiple 8.5"x11" pages,
% using 7.5"x10" of each page, allowing for 0.5" nonprinting margins:
% 
% 		delete 'test.eps';
% 		mosaicRect=SetRect(0,height,width,0);	% In units of "points". 72 points/inch.
% 		mosaicRect=OffsetRect(mosaicRect,0.5*72,0.5*72);	% allow for nonprinting margin
% 		for i=0:7.5*72:width
% 			for j=0:10*72:height
% 				pageRect=mosaicRect;
% 				OffsetRect(&pageRect,-i,-j);
% 				ImageToPs('test.ps',m,pageRect);
% 			end
% 		end
% 
% In case your PostScript manual isn't handy, the easy way to obtain
% multiple copies of each page is to use the #copies variable that's built
% into Postscript. Anywhere in your file before "showpage", set #copies to
% the desired value: '/#copies 3 def\n'
% 
% There are many free PostScript downloaders, but I find them clumsy to
% use, especially the ones that don't inform you of errors, should they
% occur. I like these:
% 
% BBEdit (used to come with an extension for downloading postscript)
% 
% (Don't know if this is still available.)
% LaserStatus, a desk accessory included in the 
% MockPackage Plus Utilities
% from:
% CE Software
% 1854 Fuller Road
% PO Box 65580
% West Des Moines, Iowa 50265
% (515)-224-1995
% 
% You may also want to read:
% 
% Adobe Systems (1985) PostScript Language Reference Manual, Second
% Edition. Reading, MA: Addison-Wesley.
% 
% Pelli, D. G. (1987) Programming in PostScript: Imaging on paper from a
% mathematical description. BYTE, 12 (5), 185-202.
% 
% BUGS:
% The "resolution" parameter is ignored by my Apple LaserWriter 16/600.
% I've looked at the PostScript code in the .eps file and it looks
% perfect. For reasons that I don't understand, the printer is ignoring
% the setscreen command, leaving you at the default printer resolution.

% HISTORY:
% 4/21/91 dgp	wrote original PixmapToPostScript.c
% 1995 dgp	wrote WindowToEPS.c based on above.
% 7/14/96 dgp	wrote SaveAsEps.m, based on above
% 7/17/96 dgp	work around Matlab "feature" of logical Boolean indexing
% 7/18/96 dgp	set Mac file CREATOR to Microsoft Word.
% 5/8/97 dgp	make sure pixel values are real (not complex) and in bounds.
% 9/7/98 dgp	convert image (which might be uint8) to double.
% 3/17/99 dgp	mention ps2eps.
% 1/23/00 dgp	ps2eps is incompatible with Mac OS 8.6 and 9; recommend
% 				EPS¥Factory instead.

if nargin<2
	error('Usage: SaveAsEps(filename,m,[pageRect,resolution])');
end
if ~ischar(filename)
	error('Usage: SaveAsEps(filename,m,[pageRect,resolution])');
end
m=round(double(m));
if ~all(all(m<=255 & m>=0))
	fprintf('Image pixels must be in range 0 to 255, not %d to %d\n',min(min(m)),max(max(m)));
	error('Usage: SaveAsEps(filename,m,[pageRect,resolution])');
end	
rect=SetRect(0,0,size(m,2),size(m,1));
if nargin<3
	pageRect=[];
end
if isempty(pageRect)
	pageRect=ScaleRect(rect,1,-1);% convert Apple to Adobe coordinates
	pageRect=CenterRect(pageRect,SetRect(0,11*72,8.5*72,0));
elseif length(pageRect)~=4
	error('pageRect argument should have 1 row and 4 columns, or none []');
end
if nargin<4
	resolution=[];
end
[file,message]=fopen(filename,'wt');
if file==-1
	error(sprintf('SaveAsEps: Error in opening file ''%s''. %s\n',filename,message))
end
t=clock; % [year month day hour minute seconds]
string=sprintf('%s %02d:%02d',date,t(4),t(5));

fprintf(file, ...
	'%%!PS-Adobe-2.0 EPSF-1.2\n');
fprintf(file, ...
	'%%%%Creator:%s\n','SaveAsEps.m, Copyright 1996 Denis G. Pelli');
fprintf(file, ...
	'%%%%For:%s\n','Matlab');
fprintf(file, ...
	'%%%%Title:%s\n',filename);
fprintf(file, ...
	'%%%%CreationDate:%s\n',string);
fprintf(file, ...
	['%%%%Pages: 0\n' ...
	'%%%%BoundingBox:%g %g %g %g\n'] ...
	,pageRect(RectLeft),pageRect(RectBottom) ...
	,pageRect(RectRight),pageRect(RectTop));
fprintf(file, ...
	['%%%%EndComments\n' ...
	'%%%%BeginProlog\n' ...
	'%%%%EndProlog\n' ...
	'%%%%BeginSetup\n' ...
	'/VideoToolbox dup 25 dict def load begin\n' ...
	'end\n' ...
	'VideoToolbox begin\n' ...
	'gsave\n' ...
	'%%%%EndSetup\n']);
fprintf(file, ...
	'/nx %g def				%% pixels per raster line\n',RectWidth(rect));
fprintf(file, ...
	'/ny %g def				%% lines in image\n',RectHeight(rect));
fprintf(file, ...
	['/hypotenuse {dup mul exch dup mul add sqrt} bind def\n' ...
	'/pixelsPerInch gsave initmatrix 72 0 dtransform hypotenuse grestore def\n' ...
	'%g %g translate		%% locate lower left of image\n'] ...
	,pageRect(RectLeft),pageRect(RectBottom));
fprintf(file, ...
	'%g %g scale			%% print image with these dimensions on page\n' ...
	,RectWidth(pageRect),-RectHeight(pageRect));
if resolution>0
	fprintf(file, ...
		'/cellsPerInch %.4f def	%% halftone dot frequency\n',resolution);
	fprintf(file, ...
		'cellsPerInch currentscreen 4 -2 roll pop 3 1 roll setscreen\n');
end
if resolution<0	% -graylevels
	fprintf(file, ...
		'/cellsPerInch pixelsPerInch %.4f div def	%% halftone dot frequency\n' ...
		,sqrt(-resolution-1));
	fprintf(file, ...
		'cellsPerInch currentscreen 4 -2 roll pop 3 1 roll setscreen\n');
end
fprintf(file, ...
	['/s nx string def		%% string to hold one raster line\n' ...
	'nx ny 8					%% dimensions and bits/pixel of source image\n' ...
	'[nx 0 0 ny neg 0 ny]	%% map unit square to PixMap data\n' ...
	'{currentfile s readhexstring pop}	%% read data\n' ...
	'bind					%% speed up reading\n' ...
	'image\n']);
hex=zeros(2,256);
hex(:)=sprintf('%02x',0:255);
if length(hex)==RectWidth(rect)
	% work around Matlab "feature" of logical Boolean indexing when 
	% subscript array is of same size and all 0's and 1's.
	hex=[hex [0;0]];
end
% one row of image per line in postscript file
clear pix;
for i=1+rect(RectTop):rect(RectBottom)
	pix=m(i,1+rect(RectLeft):rect(RectRight));
	fprintf(file,'%s\n',hex(:,1+pix));
end
clear hex buffer
fprintf(file, ...
	['%%%%Trailer\n' ...
	'grestore\n' ...
	'end\n' ...
	'showpage\n' ...
	'%%%%EOF\n']);
fclose(file);