1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 | #include "PDFPageDriver.h"
|
21 | #include "PDFRectangle.h"
|
22 | #include "ResourcesDictionaryDriver.h"
|
23 | #include "ConstructorsHolder.h"
|
24 |
|
25 | using namespace v8;
|
26 |
|
27 |
|
28 |
|
29 | PDFPageDriver::~PDFPageDriver()
|
30 | {
|
31 | if(mOwnsPage)
|
32 | delete mPDFPage;
|
33 | }
|
34 |
|
35 | PDFPageDriver::PDFPageDriver()
|
36 | {
|
37 | ContentContext = NULL;
|
38 | mPDFPage = NULL;
|
39 | mOwnsPage = false;
|
40 | }
|
41 |
|
42 | DEF_SUBORDINATE_INIT(PDFPageDriver::Init)
|
43 | {
|
44 | CREATE_ISOLATE_CONTEXT;
|
45 |
|
46 | Local<FunctionTemplate> t = NEW_FUNCTION_TEMPLATE_EXTERNAL(New);
|
47 |
|
48 | t->SetClassName(NEW_STRING("PDFPage"));
|
49 | t->InstanceTemplate()->SetInternalFieldCount(1);
|
50 |
|
51 | SET_ACCESSOR_METHODS(t, "mediaBox", GetMediaBox, SetMediaBox);
|
52 | SET_ACCESSOR_METHODS(t, "cropBox", GetCropBox, SetCropBox);
|
53 | SET_ACCESSOR_METHODS(t, "bleedBox", GetBleedBox, SetBleedBox);
|
54 | SET_ACCESSOR_METHODS(t, "trimBox", GetTrimBox, SetTrimBox);
|
55 | SET_ACCESSOR_METHODS(t, "artBox", GetArtBox, SetArtBox);
|
56 | SET_ACCESSOR_METHODS(t, "rotate",GetRotate, SetRotate);
|
57 | SET_PROTOTYPE_METHOD(t, "getResourcesDictionary", GetResourcesDictionary);
|
58 |
|
59 | SET_CONSTRUCTOR_EXPORT("PDFPage", t);
|
60 |
|
61 |
|
62 | EXPOSE_EXTERNAL_FOR_INIT(ConstructorsHolder, holder)
|
63 | SET_CONSTRUCTOR(holder->PDFPage_constructor, t);
|
64 | SET_CONSTRUCTOR_TEMPLATE(holder->PDFPage_constructor_template, t);
|
65 | }
|
66 |
|
67 | METHOD_RETURN_TYPE PDFPageDriver::New(const ARGS_TYPE& args)
|
68 | {
|
69 | CREATE_ISOLATE_CONTEXT;
|
70 | CREATE_ESCAPABLE_SCOPE;
|
71 | EXPOSE_EXTERNAL_ARGS(ConstructorsHolder, externalHolder)
|
72 |
|
73 | PDFPageDriver* pdfPage = new PDFPageDriver();
|
74 | if(args.Length() != 1)
|
75 | {
|
76 | pdfPage->mPDFPage = new PDFPage();
|
77 | pdfPage->mOwnsPage = true;
|
78 |
|
79 | if(args.Length() == 4 && args[0]->IsNumber() && args[1]->IsNumber() && args[2]->IsNumber() && args[3]->IsNumber())
|
80 | {
|
81 | pdfPage->mPDFPage->SetMediaBox(PDFRectangle(TO_NUMBER(args[0])->Value(),
|
82 | TO_NUMBER(args[1])->Value(),
|
83 | TO_NUMBER(args[2])->Value(),
|
84 | TO_NUMBER(args[3])->Value()));
|
85 | }
|
86 |
|
87 | }
|
88 |
|
89 | pdfPage->holder = externalHolder;
|
90 | pdfPage->Wrap(args.This());
|
91 | SET_FUNCTION_RETURN_VALUE(args.This())
|
92 | }
|
93 |
|
94 | METHOD_RETURN_TYPE PDFPageDriver::GetMediaBox(Local<String> property, const PROPERTY_TYPE &info)
|
95 | {
|
96 | CREATE_ISOLATE_CONTEXT;
|
97 | CREATE_ESCAPABLE_SCOPE;
|
98 |
|
99 | PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
|
100 |
|
101 | Local<Array> mediaBox = NEW_ARRAY(4);
|
102 |
|
103 | mediaBox->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(0),v8::NEW_NUMBER(pageDriver->mPDFPage->GetMediaBox().LowerLeftX));
|
104 | mediaBox->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(1),v8::NEW_NUMBER(pageDriver->mPDFPage->GetMediaBox().LowerLeftY));
|
105 | mediaBox->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(2),v8::NEW_NUMBER(pageDriver->mPDFPage->GetMediaBox().UpperRightX));
|
106 | mediaBox->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(3),v8::NEW_NUMBER(pageDriver->mPDFPage->GetMediaBox().UpperRightY));
|
107 |
|
108 | SET_ACCESSOR_RETURN_VALUE(mediaBox)
|
109 | }
|
110 |
|
111 | METHOD_RETURN_TYPE PDFPageDriver::GetCropBox(Local<String> property, const PROPERTY_TYPE &info)
|
112 | {
|
113 | CREATE_ISOLATE_CONTEXT;
|
114 | CREATE_ESCAPABLE_SCOPE;
|
115 |
|
116 | PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
|
117 |
|
118 | BoolAndPDFRectangle cropBox = pageDriver->mPDFPage->GetCropBox();
|
119 |
|
120 | if(cropBox.first)
|
121 | {
|
122 | Local<Array> box = NEW_ARRAY(4);
|
123 |
|
124 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(0),v8::NEW_NUMBER(cropBox.second.LowerLeftX));
|
125 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(1),v8::NEW_NUMBER(cropBox.second.LowerLeftY));
|
126 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(2),v8::NEW_NUMBER(cropBox.second.UpperRightX));
|
127 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(3),v8::NEW_NUMBER(cropBox.second.UpperRightY));
|
128 |
|
129 | SET_ACCESSOR_RETURN_VALUE(box)
|
130 | }
|
131 | else
|
132 | {
|
133 | SET_ACCESSOR_RETURN_VALUE(UNDEFINED)
|
134 | }
|
135 | }
|
136 |
|
137 | METHOD_RETURN_TYPE PDFPageDriver::GetBleedBox(Local<String> property, const PROPERTY_TYPE &info)
|
138 | {
|
139 | CREATE_ISOLATE_CONTEXT;
|
140 | CREATE_ESCAPABLE_SCOPE;
|
141 |
|
142 | PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
|
143 |
|
144 | BoolAndPDFRectangle bleedBox = pageDriver->mPDFPage->GetBleedBox();
|
145 |
|
146 | if(bleedBox.first)
|
147 | {
|
148 | Local<Array> box = NEW_ARRAY(4);
|
149 |
|
150 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(0),v8::NEW_NUMBER(bleedBox.second.LowerLeftX));
|
151 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(1),v8::NEW_NUMBER(bleedBox.second.LowerLeftY));
|
152 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(2),v8::NEW_NUMBER(bleedBox.second.UpperRightX));
|
153 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(3),v8::NEW_NUMBER(bleedBox.second.UpperRightY));
|
154 |
|
155 | SET_ACCESSOR_RETURN_VALUE(box)
|
156 | }
|
157 | else
|
158 | {
|
159 | SET_ACCESSOR_RETURN_VALUE(UNDEFINED)
|
160 | }
|
161 | }
|
162 |
|
163 | METHOD_RETURN_TYPE PDFPageDriver::GetTrimBox(Local<String> property, const PROPERTY_TYPE &info)
|
164 | {
|
165 | CREATE_ISOLATE_CONTEXT;
|
166 | CREATE_ESCAPABLE_SCOPE;
|
167 |
|
168 | PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
|
169 |
|
170 | BoolAndPDFRectangle trimBox = pageDriver->mPDFPage->GetTrimBox();
|
171 |
|
172 | if(trimBox.first)
|
173 | {
|
174 | Local<Array> box = NEW_ARRAY(4);
|
175 |
|
176 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(0),v8::NEW_NUMBER(trimBox.second.LowerLeftX));
|
177 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(1),v8::NEW_NUMBER(trimBox.second.LowerLeftY));
|
178 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(2),v8::NEW_NUMBER(trimBox.second.UpperRightX));
|
179 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(3),v8::NEW_NUMBER(trimBox.second.UpperRightY));
|
180 |
|
181 | SET_ACCESSOR_RETURN_VALUE(box)
|
182 | }
|
183 | else
|
184 | {
|
185 | SET_ACCESSOR_RETURN_VALUE(UNDEFINED)
|
186 | }
|
187 | }
|
188 |
|
189 | METHOD_RETURN_TYPE PDFPageDriver::GetArtBox(Local<String> property, const PROPERTY_TYPE &info)
|
190 | {
|
191 | CREATE_ISOLATE_CONTEXT;
|
192 | CREATE_ESCAPABLE_SCOPE;
|
193 |
|
194 | PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
|
195 |
|
196 | BoolAndPDFRectangle artBox = pageDriver->mPDFPage->GetArtBox();
|
197 |
|
198 | if(artBox.first)
|
199 | {
|
200 | Local<Array> box = NEW_ARRAY(4);
|
201 |
|
202 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(0),v8::NEW_NUMBER(artBox.second.LowerLeftX));
|
203 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(1),v8::NEW_NUMBER(artBox.second.LowerLeftY));
|
204 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(2),v8::NEW_NUMBER(artBox.second.UpperRightX));
|
205 | box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(3),v8::NEW_NUMBER(artBox.second.UpperRightY));
|
206 |
|
207 | SET_ACCESSOR_RETURN_VALUE(box)
|
208 | }
|
209 | else
|
210 | {
|
211 | SET_ACCESSOR_RETURN_VALUE(UNDEFINED)
|
212 | }
|
213 | }
|
214 |
|
215 | void PDFPageDriver::SetMediaBox(Local<String> property, Local<Value> value, const PROPERTY_SETTER_TYPE &info)
|
216 | {
|
217 | CREATE_ISOLATE_CONTEXT;
|
218 | CREATE_ESCAPABLE_SCOPE;
|
219 |
|
220 | PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
|
221 |
|
222 | if(!value->IsArray())
|
223 | THROW_EXCEPTION("Media box is set to a value which is not a 4 numbers array");
|
224 |
|
225 | if(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, v8::NEW_STRING("length")).ToLocalChecked()->TO_UINT32Value() != 4)
|
226 | THROW_EXCEPTION("Media box is set to a value which is not a 4 numbers array");
|
227 |
|
228 | pageDriver->mPDFPage->SetMediaBox(PDFRectangle(TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 0).ToLocalChecked())->Value(),
|
229 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 1).ToLocalChecked())->Value(),
|
230 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 2).ToLocalChecked())->Value(),
|
231 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 3).ToLocalChecked())->Value()));
|
232 |
|
233 | }
|
234 |
|
235 | METHOD_RETURN_TYPE PDFPageDriver::GetRotate(Local<String> property, const PROPERTY_TYPE &info)
|
236 | {
|
237 | CREATE_ISOLATE_CONTEXT;
|
238 | CREATE_ESCAPABLE_SCOPE;
|
239 |
|
240 | PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
|
241 |
|
242 | BoolAndInt rotate = pageDriver->mPDFPage->GetRotate();
|
243 |
|
244 | if(rotate.first)
|
245 | {
|
246 | Local<Number> result = NEW_NUMBER(rotate.second);
|
247 | SET_ACCESSOR_RETURN_VALUE(result)
|
248 | }
|
249 | else
|
250 | {
|
251 | SET_ACCESSOR_RETURN_VALUE(UNDEFINED)
|
252 | }
|
253 | }
|
254 |
|
255 | void PDFPageDriver::SetRotate(Local<String> property, Local<Value> value, const PROPERTY_SETTER_TYPE &info)
|
256 | {
|
257 | CREATE_ISOLATE_CONTEXT;
|
258 | CREATE_ESCAPABLE_SCOPE;
|
259 |
|
260 | PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
|
261 |
|
262 | if(!value->IsNumber())
|
263 | THROW_EXCEPTION("Rotation is not set to a number");
|
264 |
|
265 | pageDriver->mPDFPage->SetRotate(TO_UINT32(value)->Value());
|
266 |
|
267 | }
|
268 |
|
269 |
|
270 | void PDFPageDriver::SetCropBox(Local<String> property, Local<Value> value, const PROPERTY_SETTER_TYPE &info)
|
271 | {
|
272 | CREATE_ISOLATE_CONTEXT;
|
273 | CREATE_ESCAPABLE_SCOPE;
|
274 |
|
275 | PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
|
276 |
|
277 | if(!value->IsArray())
|
278 | THROW_EXCEPTION("Crop box is set to a value which is not a 4 numbers array");
|
279 |
|
280 | if(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, v8::NEW_STRING("length")).ToLocalChecked()->TO_UINT32Value() != 4)
|
281 | THROW_EXCEPTION("Crop box is set to a value which is not a 4 numbers array");
|
282 |
|
283 | pageDriver->mPDFPage->SetCropBox(PDFRectangle(TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 0).ToLocalChecked())->Value(),
|
284 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 1).ToLocalChecked())->Value(),
|
285 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 2).ToLocalChecked())->Value(),
|
286 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 3).ToLocalChecked())->Value()));
|
287 |
|
288 | }
|
289 |
|
290 | void PDFPageDriver::SetBleedBox(Local<String> property, Local<Value> value, const PROPERTY_SETTER_TYPE &info)
|
291 | {
|
292 | CREATE_ISOLATE_CONTEXT;
|
293 | CREATE_ESCAPABLE_SCOPE;
|
294 |
|
295 | PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
|
296 |
|
297 | if(!value->IsArray())
|
298 | THROW_EXCEPTION("Bleed box is set to a value which is not a 4 numbers array");
|
299 |
|
300 | if(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, v8::NEW_STRING("length")).ToLocalChecked()->TO_UINT32Value() != 4)
|
301 | THROW_EXCEPTION("Bleed box is set to a value which is not a 4 numbers array");
|
302 |
|
303 | pageDriver->mPDFPage->SetBleedBox(PDFRectangle(TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 0).ToLocalChecked())->Value(),
|
304 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 1).ToLocalChecked())->Value(),
|
305 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 2).ToLocalChecked())->Value(),
|
306 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 3).ToLocalChecked())->Value()));
|
307 |
|
308 | }
|
309 |
|
310 | void PDFPageDriver::SetTrimBox(Local<String> property, Local<Value> value, const PROPERTY_SETTER_TYPE &info)
|
311 | {
|
312 | CREATE_ISOLATE_CONTEXT;
|
313 | CREATE_ESCAPABLE_SCOPE;
|
314 |
|
315 | PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
|
316 |
|
317 | if(!value->IsArray())
|
318 | THROW_EXCEPTION("Trim box is set to a value which is not a 4 numbers array");
|
319 |
|
320 | if(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, v8::NEW_STRING("length")).ToLocalChecked()->TO_UINT32Value() != 4)
|
321 | THROW_EXCEPTION("Trim box is set to a value which is not a 4 numbers array");
|
322 |
|
323 | pageDriver->mPDFPage->SetTrimBox(PDFRectangle(TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 0).ToLocalChecked())->Value(),
|
324 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 1).ToLocalChecked())->Value(),
|
325 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 2).ToLocalChecked())->Value(),
|
326 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 3).ToLocalChecked())->Value()));
|
327 |
|
328 | }
|
329 |
|
330 | void PDFPageDriver::SetArtBox(Local<String> property, Local<Value> value, const PROPERTY_SETTER_TYPE &info)
|
331 | {
|
332 | CREATE_ISOLATE_CONTEXT;
|
333 | CREATE_ESCAPABLE_SCOPE;
|
334 |
|
335 | PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
|
336 |
|
337 | if(!value->IsArray())
|
338 | THROW_EXCEPTION("Art box is set to a value which is not a 4 numbers array");
|
339 |
|
340 | if(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, v8::NEW_STRING("length")).ToLocalChecked()->TO_UINT32Value() != 4)
|
341 | THROW_EXCEPTION("Art box is set to a value which is not a 4 numbers array");
|
342 |
|
343 | pageDriver->mPDFPage->SetArtBox(PDFRectangle(TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 0).ToLocalChecked())->Value(),
|
344 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 1).ToLocalChecked())->Value(),
|
345 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 2).ToLocalChecked())->Value(),
|
346 | TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 3).ToLocalChecked())->Value()));
|
347 |
|
348 | }
|
349 |
|
350 | METHOD_RETURN_TYPE PDFPageDriver::GetResourcesDictionary(const ARGS_TYPE& args)
|
351 | {
|
352 | CREATE_ISOLATE_CONTEXT;
|
353 | CREATE_ESCAPABLE_SCOPE;
|
354 | PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(args.This());
|
355 |
|
356 | Local<Value> newInstance = pageDriver->holder->GetNewResourcesDictionary(args);
|
357 | ResourcesDictionaryDriver* resourceDictionaryDriver = ObjectWrap::Unwrap<ResourcesDictionaryDriver>(newInstance->TO_OBJECT());
|
358 | resourceDictionaryDriver->ResourcesDictionaryInstance = &(pageDriver->GetPage()->GetResourcesDictionary());
|
359 |
|
360 | SET_FUNCTION_RETURN_VALUE(newInstance)
|
361 | }
|
362 |
|
363 |
|