You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
251 lines
6.9 KiB
251 lines
6.9 KiB
% Copyright (C) 2017-2023 Artifex Software, Inc.
|
|
% All Rights Reserved.
|
|
%
|
|
% This software is provided AS-IS with no warranty, either express or
|
|
% implied.
|
|
%
|
|
% This software is distributed under license and may not be copied,
|
|
% modified or distributed except as expressly authorized under the terms
|
|
% of the license contained in the file LICENSE in this distribution.
|
|
%
|
|
% Refer to licensing information at http://www.artifex.com or contact
|
|
% Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
|
|
% CA 94129, USA, for further information.
|
|
%
|
|
|
|
% viewpwg.ps
|
|
% Display a PWG file.
|
|
|
|
% VPWGDEBUG can be predefined to be true to get debugging.
|
|
% /VPWGDEBUG false def
|
|
/VPWGDEBUG where { pop } { /VPWGDEBUG false def } ifelse
|
|
|
|
/read1 % <file> read1 <int>
|
|
{ read pop
|
|
} bind def
|
|
/read2 % <file> read2 <int>
|
|
{ dup read1 8 bitshift exch read1 add
|
|
} bind def
|
|
/read4 % <file> read4 <int>
|
|
{ dup read2 16 bitshift exch read2 add
|
|
} bind def
|
|
/readString % <file> readString <string>
|
|
{ 0 string
|
|
dup
|
|
0 1 63
|
|
{ % <file> <string> <string> <iteration>
|
|
3 index read pop
|
|
% <file> <string> <string> <iteration> <char>
|
|
dup 0 eq {pop pop} {put dup} ifelse
|
|
}
|
|
for
|
|
pop
|
|
exch pop
|
|
} bind def
|
|
/readReserved % <file> readReserved -
|
|
{ read4 0 ne
|
|
{ (Reserved field not zero.\n) print cleartomark stop }
|
|
if
|
|
} bind def
|
|
/readBoolean % <file> readBoolean <bool>
|
|
{ read4 dup 0 eq
|
|
{ pop false }
|
|
{ 1 eq
|
|
{ 0 }
|
|
{ (Boolean not a boolean.\n) print cleartomark stop }
|
|
ifelse
|
|
}
|
|
ifelse
|
|
} bind def
|
|
|
|
/readPWGheader % <file> readPWGheader <dict>
|
|
{ 20 dict begin
|
|
dup 4 string readstring pop
|
|
<52615332> eq not
|
|
{ (Not a PWG file.\n) print cleartomark stop
|
|
} if
|
|
pop
|
|
currentdict end
|
|
} bind def
|
|
|
|
/readPWGpageHeader % <file> readPWGpageHeader <dict>
|
|
% Note: PWG header must be on dict stack
|
|
{ 10 dict begin
|
|
dup readString /PwgRaster exch def
|
|
dup readString /MediaColor exch def
|
|
dup readString /MediaType exch def
|
|
dup readString /PrintContentOptimize exch def
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup read4 /CutMedia exch def
|
|
dup readBoolean /Duplex exch def
|
|
dup read4 /HWResolutionX exch def
|
|
dup read4 /HWResolutionY exch def
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readBoolean /InsertSheet exch def
|
|
dup read4 /Jog exch def
|
|
dup read4 /LeadingEdge exch def
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup read4 /MediaPosition exch def
|
|
dup read4 /MediaWeightMetric exch def
|
|
dup readReserved
|
|
dup readReserved
|
|
dup read4 /NumCopies exch def
|
|
dup read4 /Orientation exch def
|
|
dup readReserved
|
|
dup read4 /PageSizeX exch def
|
|
dup read4 /PageSizeY exch def
|
|
dup readReserved
|
|
dup readReserved
|
|
dup read4 /Tumble exch def
|
|
dup read4 /Width exch def
|
|
dup read4 /Height exch def
|
|
dup readReserved
|
|
dup read4 /BitsPerColor exch def
|
|
dup read4 /BitsPerPixel exch def
|
|
dup read4 /BytesPerLine exch def
|
|
dup read4 /ColorOrder exch def
|
|
dup read4 /ColorSpace exch def
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup read4 /NumColors exch def
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup read4 /TotalPageCount exch def
|
|
dup read4 /CrossFeedTransform exch def
|
|
dup read4 /FeedTransform exch def
|
|
dup read4 /ImageBoxLeft exch def
|
|
dup read4 /ImageBoxTop exch def
|
|
dup read4 /ImageBoxRight exch def
|
|
dup read4 /ImageBoxBottom exch def
|
|
dup read4 /AlternatePrimary exch def
|
|
dup read4 /PrintQuality exch def
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup readReserved
|
|
dup read4 /VendorIdentifier exch def
|
|
dup read4 /VendorLength exch def
|
|
% Skip 1088 bytes of VendorData
|
|
1088 { dup read pop pop } repeat
|
|
% 64 Reserved bytes
|
|
dup readReserved dup readReserved dup readReserved dup readReserved
|
|
dup readReserved dup readReserved dup readReserved dup readReserved
|
|
dup readReserved dup readReserved dup readReserved dup readReserved
|
|
dup readReserved dup readReserved dup readReserved dup readReserved
|
|
dup readString /RenderingIntent exch def
|
|
dup readString /PageSizeName exch def
|
|
pop
|
|
currentdict end
|
|
} bind def
|
|
|
|
/viewPWG % <file|string> viewPWG -
|
|
{ save 20 dict begin
|
|
/saved exch def
|
|
dup type /stringtype eq { (r) file } if
|
|
/F exch def
|
|
F readPWGheader /Header exch def
|
|
|
|
% We have a dictionary with /saved, /F and /Header on the stack.
|
|
|
|
% Debug dump Header fields.
|
|
VPWGDEBUG { Header { exch == == } forall (----------------\n) print flush } if
|
|
|
|
{
|
|
% If we have no bytes left, stop
|
|
F bytesavailable 0 le { exit } if
|
|
|
|
% Read the page header.
|
|
F readPWGpageHeader /PageHeader exch def
|
|
|
|
% Push PageHeader onto the dict stack.
|
|
PageHeader begin
|
|
|
|
% Debug dump the Page Header.
|
|
VPWGDEBUG { PageHeader { exch == == } forall (----------------\n) print flush } if
|
|
|
|
% Define D to be the decoded data from F.
|
|
/D F
|
|
<</Width Width
|
|
/BPP BitsPerPixel
|
|
>> /PWGDecode filter def
|
|
|
|
% Set the Colorspace appropriately.
|
|
ColorSpace dup dup 3 eq exch 18 eq or exch 48 eq or
|
|
{ % Black or SGray or Device1
|
|
/DeviceGray setcolorspace
|
|
/NumComponents 1 def
|
|
}
|
|
{ ColorSpace dup dup dup 1 eq exch 19 eq or exch 20 eq or exch 50 eq or
|
|
{ % Rgb or sRGB or AdobeRGB or Device3
|
|
/DeviceRGB setcolorspace
|
|
/NumComponents 3 def
|
|
}
|
|
{ ColorSpace dup 6 eq exch 51 eq or
|
|
{ % DeviceCMYK or Device4
|
|
/DeviceCMYK setcolorspace
|
|
/NumComponents 4 def
|
|
}
|
|
{ (Unsupported colorspace in PWG file.\n) print cleartomark stop
|
|
}
|
|
ifelse
|
|
}
|
|
ifelse
|
|
}
|
|
ifelse
|
|
|
|
% Do some matrixy stuff I don't understand.
|
|
matrix currentmatrix
|
|
0 1 3 { 2 copy get dup 0 ne { dup abs div } if 3 copy put pop pop } for
|
|
setmatrix
|
|
|
|
<<
|
|
/ImageType 1
|
|
/ImageMatrix [1 0 0 -1 0 Height]
|
|
/BitsPerComponent BitsPerPixel NumComponents div
|
|
/Width Width
|
|
/Height Height
|
|
/DataSource D
|
|
>> image
|
|
|
|
% Bin the PageHeader dictionary
|
|
end
|
|
|
|
showpage
|
|
}
|
|
loop
|
|
saved end restore
|
|
} bind def
|
|
|
|
% This lets you do stuff on the command line like:
|
|
% gs -sDEVICE=pdfwrite -o stuff%03d.pdf viewurf.ps -c "(image.urf) << /PageSize 2 index viewURFgetsize 2 array astore >> setpagedevice viewURF"
|
|
% so the output size is influenced by the original image.
|
|
%/viewURFgetsize % <file|string> ==> [width height]
|
|
%{
|
|
% save 20 dict begin
|
|
% /saved exch def
|
|
% dup type /stringtype eq { (r) file } if
|
|
% /F exch def
|
|
% F readURFheader /Header exch def
|
|
% currentdict Header end begin begin
|
|
% VPWGDEBUG { Header { exch == == } forall (----------------\n) print flush } if
|
|
% F readURFimageHeader /ImageHeader exch def
|
|
% currentdict ImageHeader end begin begin
|
|
% F 0 setfileposition % reset file pointer
|
|
% Width Height
|
|
% saved end end end restore
|
|
%} bind def
|