File: PostScript_Support.hpp

package info (click to toggle)
exempi 2.6.6-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 11,780 kB
  • sloc: cpp: 79,791; sh: 4,606; ansic: 538; makefile: 383
file content (266 lines) | stat: -rw-r--r-- 9,691 bytes parent folder | download | duplicates (2)
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
#ifndef __PostScript_Support_hpp__
#define __PostScript_Support_hpp__ 1

// =================================================================================================
// Copyright Adobe
// Copyright 2012 Adobe
// All Rights Reserved
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
// of the Adobe license agreement accompanying it. 
// =================================================================================================

#include "public/include/XMP_Environment.h"	

#include "public/include/XMP_Const.h"
#include "public/include/XMP_IO.hpp"

#include "XMPFiles/source/XMPFiles_Impl.hpp"
#include "source/XMPFiles_IO.hpp"
#include "source/XIO.hpp"


#define MAX_NO_MARK 100
#define IsNumeric( ch ) ( ch >='0' && ch<='9' )
#define Uns8Ptr(p) ((XMP_Uns8 *) (p))
#define IsPlusMinusSign(ch)  ( ch =='+' || ch=='-' )
#define IsDateDelimiter( ch ) ( ((ch) == '/') || ((ch) == '-') || ((ch) == '.') )
#define IsTimeDelimiter( ch ) ( ((ch) == ':') )
#define IsDelimiter(ch) (IsDateDelimiter( ch ) || IsTimeDelimiter( ch ))
#define IsAlpha(ch) ((ch>=97 &&ch <=122) || (ch>=65 && ch<=91))


enum {
	kPSHint_NoMarker  = 0,
	kPSHint_NoMain    = 1,
	kPSHint_MainFirst = 2,
	kPSHint_MainLast  = 3
};

enum UpdateMethod{
	kPS_None			= 0,
	kPS_Inplace			= 1,
	kPS_ExpandSFDFilter = 2,
	kPS_InjectNew		= 3
};

enum TokenFlag{
	// --------------------
	// Flags for native Metadata  and DSC commnents in EPS format

	/// No Native MetaData
	kPS_NoData			=   0x00000001,
	/// Document Creator tool
	kPS_CreatorTool		=   0x00000002,
	/// Document Creation Date
	kPS_CreateDate		=   0x00000004,
	/// Document Modify Date
	kPS_ModifyDate		=   0x00000008,
	/// Document Creator/Author
	kPS_Creator			=   0x00000010,
	/// Document Title
	kPS_Title			=   0x00000020,
	/// Document Desciption
	kPS_Description		=   0x00000040,
	/// Document Subject/Keywords
	kPS_Subject			=   0x00000080,
	/// ADO_ContainsXMP hint
	kPS_ADOContainsXMP	=   0x00000100,
	/// End Comments
	kPS_EndComments		=   0x00000200,
	/// Begin Prolog
	kPS_BeginProlog		=   0x00000400,
	/// End Prolog
	kPS_EndProlog	    =   0x00000800,
	/// Begin Setup
	kPS_BeginSetup	    =   0x00001000,
	/// End Setup
	kPS_EndSetup	    =   0x00002000,
	/// Page
	kPS_Page	        =   0x00004000,
	/// End Page Comments
	kPS_EndPageComments	=   0x00008000,
	/// Begin Page SetUp
	kPS_BeginPageSetup	=   0x00010000,
	/// End Page SetUp
	kPS_EndPageSetup	=   0x00020000,
	/// Trailer
	kPS_Trailer			=   0x00040000,
	/// EOF
	kPS_EOF				=   0x00080000,
	/// End PostScript
	kPS_EndPostScript	=   0x00100000,
	/// Max Token
	kPS_MaxToken		=   0x00200000
};

enum NativeMetadataIndex{
	// --------------------
	// Index native Metadata ina PS file
	kPS_dscCreator			= 0, 
	kPS_dscCreateDate		= 1,
	kPS_dscFor				= 2,
	kPS_dscTitle			= 3,
	kPS_docInfoCreator		= 4,
	kPS_docInfoCreateDate	= 5,
	kPS_docInfoModDate		= 6,
	kPS_docInfoAuthor		= 7,
	kPS_docInfoTitle		= 8,
	kPS_docInfoSubject		= 9,
	kPS_docInfoKeywords		= 10,
	kPS_MaxNativeIndexValue 
};

static XMP_Uns64 nativeIndextoFlag[]={	kPS_CreatorTool,
										kPS_CreateDate,
										kPS_Creator,
										kPS_Title,
										kPS_CreatorTool,
										kPS_CreateDate,
										kPS_ModifyDate,
										kPS_Creator,
										kPS_Title,
										kPS_Description,
										kPS_Subject
									};

static const std::string kPSFileTag    = "%!PS-Adobe-";
static const std::string kPSContainsXMPString = "%ADO_ContainsXMP:";
static const std::string kPSContainsBBoxString = "%%BoundingBox:";
static const std::string kPSContainsBeginDocString = "%%BeginDocument:";
static const std::string kPSContainsEndDocString = "%%EndDocument";
static const std::string kPSContainsTrailerString = "%%Trailer";
static const std::string kPSContainsCreatorString = "%%Creator:";
static const std::string kPSContainsCreateDateString = "%%CreationDate:";
static const std::string kPSContainsForString = "%%For:";
static const std::string kPSContainsTitleString = "%%Title:";
static const std::string kPSContainsAtendString = "(atend)";
static const std::string kPSEndCommentString  = "%%EndComments";	// ! Assumed shorter than kPSContainsXMPString.
static const std::string kPSContainsDocInfoString  = "/DOCINFO";	
static const std::string kPSContainsPdfmarkString  = "pdfmark";	
static const std::string kPS_XMPHintMainFirst="%ADO_ContainsXMP: MainFirst\n";
static const std::string kPS_XMPHintMainLast="%ADO_ContainsXMP: MainLast\n";

// For new xpacket injection into the EPS file is done in Postscript using the pdfmark operator
// There are different conventions described for EPS and PS files in XMP Spec part 3.
// The tokens kEPS_Injectdata1, kEPS_Injectdata2 and kEPS_Injectdata3 are used to
// embedd xpacket in EPS files.the xpacket is written inbetween kEPS_Injectdata1 and kEPS_Injectdata2.
// The tokens kPS_Injectdata1 and kPS_Injectdata2 are used to embedd xpacket in DSC compliant PS files
// The code inside the tokens is taken from examples in XMP Spec part 3 
// section 2.6.2 PS, EPS (PostScript and Encapsulated PostScript)
static const std::string kEPS_Injectdata1="\n/currentdistillerparams where\n"
"{pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse\n"
"{userdict /EPSHandler1_pdfmark /cleartomark load put\n"
"userdict /EPSHandler1_ReadMetadata_pdfmark {flushfile cleartomark} bind put}\n"
"{ userdict /EPSHandler1_pdfmark /pdfmark load put\n"
"userdict /EPSHandler1_ReadMetadata_pdfmark {/PUT pdfmark} bind put } ifelse\n"
"[/NamespacePush EPSHandler1_pdfmark\n"
"[/_objdef {eps_metadata_stream} /type /stream /OBJ EPSHandler1_pdfmark\n"
"[{eps_metadata_stream} 2 dict begin\n"
"/Type /Metadata def /Subtype /XML def currentdict end /PUT EPSHandler1_pdfmark\n"
"[{eps_metadata_stream}\n"
"currentfile 0 (% &&end EPS XMP packet marker&&)\n"
"/SubFileDecode filter EPSHandler1_ReadMetadata_pdfmark\n";

static const std::string kPS_Injectdata1="\n/currentdistillerparams where\n"
"{pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse\n"
"{userdict /PSHandler1_pdfmark /cleartomark load put\n"
"userdict /PSHandler1_ReadMetadata_pdfmark {flushfile cleartomark} bind put}\n"
"{ userdict /PSHandler1_pdfmark /pdfmark load put\n"
"userdict /PSHandler1_ReadMetadata_pdfmark {/PUT pdfmark} bind put } ifelse\n"
"[/NamespacePush PSHandler1_pdfmark\n"
"[/_objdef {ps_metadata_stream} /type /stream /OBJ PSHandler1_pdfmark\n"
"[{ps_metadata_stream} 2 dict begin\n"
"/Type /Metadata def /Subtype /XML def currentdict end /PUT PSHandler1_pdfmark\n"
"[{ps_metadata_stream}\n"
"currentfile 0 (% &&end PS XMP packet marker&&)\n"
"/SubFileDecode filter PSHandler1_ReadMetadata_pdfmark\n";

static const std::string kEPS_Injectdata2="\n% &&end EPS XMP packet marker&&\n"
"[/Document\n"
"1 dict begin /Metadata {eps_metadata_stream} def\n"
"currentdict end /BDC EPSHandler1_pdfmark\n"
"[/NamespacePop EPSHandler1_pdfmark\n";


static const std::string kPS_Injectdata2="\n% &&end PS XMP packet marker&&\n"
"[{Catalog} {ps_metadata_stream} /Metadata PSHandler1_pdfmark\n"
"[/NamespacePop PSHandler1_pdfmark\n";

static const std::string  kEPS_Injectdata3="\n/currentdistillerparams where\n"
	"{pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse\n"
	"{userdict /EPSHandler1_pdfmark /cleartomark load put}\n"
	"{ userdict /EPSHandler1_pdfmark /pdfmark load put} ifelse\n"
	"[/EMC EPSHandler1_pdfmark\n";


namespace PostScript_Support
{
	struct Date
	{
		short day;
		short month;
		short year;
		short hours;
		short minutes;
		short seconds;
		bool containsOffset;
		char offsetSign;
		short offsetHour;
		short offsetMin;
		Date(short pday=1,short pmonth=1,short pyear=1900,short phours=0,
			short pminutes=0,short pseconds=0):day(pday),month(pmonth),
			year(pyear),hours(phours),minutes(pminutes),seconds(pseconds),
			containsOffset(false),offsetSign('+'),offsetHour(0),offsetMin(0)
		{
		}
		bool operator==(const Date &a)
		{
			return this->day==a.day &&
				this->month==a.month &&
				this->year==a.year &&
				this->hours==a.hours &&
				this->minutes==a.minutes &&
				this->seconds==a.seconds &&
				this->containsOffset==a.containsOffset &&
				this->offsetSign==a.offsetSign &&
				this->offsetHour==a.offsetHour &&
				this->offsetMin==a.offsetMin;
		}
	};
	struct DateTimeTokens
	{
		std::string token;
		short noOfDelimiter;
		char delimiter;
		DateTimeTokens(std::string ptoken="",short pnoOfDelimiter=0,char pdelimiter=0):
		token(ptoken),noOfDelimiter(pnoOfDelimiter),delimiter(pdelimiter)
		{
		}
	};

	//function to parse strings and get date out of it
	std::string ConvertToDate(const char* inString);
	// These helpers are similar to RefillBuffer and CheckFileSpace with the difference that the it traverses
	// the file stream in reverse order
	void RevRefillBuffer ( XMP_IO* fileRef, IOBuffer* ioBuf );
	bool RevCheckFileSpace ( XMP_IO* fileRef, IOBuffer* ioBuf, size_t neededLen );

	// function to detect character codes greater than 127 in a string
	bool HasCodesGT127(const std::string & value);
	
	// function moves the file pointer ahead such that it skips all tabs and spaces 
	bool  SkipTabsAndSpaces(XMP_IO* file,IOBuffer& ioBuf);
	
	// function moves the file pointer ahead such that it skips all characters until a newline 
	bool SkipUntilNewline(XMP_IO* file,IOBuffer& ioBuf);
	
	// function to detect character codes greater than 127 in a string
	bool IsValidPSFile(XMP_IO*    fileRef,XMP_FileFormat &format);
	
	// Determines Whether the metadata is embedded using the Sub-FileDecode Approach or no
	bool IsSFDFilterUsed(XMP_IO* &fileRef, XMP_Int64 xpacketOffset);

} // namespace PostScript_Support

#endif	// __PostScript_Support_hpp__