• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1diff --git a/filter/pdftoraster.cxx b/filter/pdftoraster.cxx
2index e8af184f..166baca0 100755
3--- a/filter/pdftoraster.cxx
4+++ b/filter/pdftoraster.cxx
5@@ -49,12 +49,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
6 #include <cupsfilters/colormanager.h>
7 #include <strings.h>
8 #include <math.h>
9-#include <poppler/cpp/poppler-document.h>
10-#include <poppler/cpp/poppler-page.h>
11-#include <poppler/cpp/poppler-global.h>
12-#include <poppler/cpp/poppler-image.h>
13-#include <poppler/cpp/poppler-page-renderer.h>
14-#include <poppler/cpp/poppler-rectangle.h>
15+#include <vector>
16+#include "pdfservice_inner.h"
17 #ifdef USE_LCMS1
18 #include <lcms.h>
19 #define cmsColorSpaceSignature icColorSpaceSignature
20@@ -120,6 +116,8 @@ namespace {
21   bool swap_margin_x = false;
22   bool swap_margin_y = false;
23   bool allocLineBuf = false;
24+  bool cupsManualCopies = true;
25+  static int g_pdfSdkCount = 0;
26   ConvertLineFunc convertLineOdd;
27   ConvertLineFunc convertLineEven;
28   ConvertCSpaceFunc convertCSpace;
29@@ -374,6 +372,12 @@ static void parseOpts(int argc, char **argv)
30 	renderingIntent = INTENT_ABSOLUTE_COLORIMETRIC;
31       }
32     }
33+    attr = ppdFindAttr(ppd, "cupsManualCopies", NULL);
34+    if (attr != NULL && attr->value != NULL) {
35+      if (strcasecmp(attr->value, "true") != 0) {
36+        cupsManualCopies = false;
37+      }
38+    }
39     if (header.Duplex) {
40       /* analyze options relevant to Duplex */
41       const char *backside = "";
42@@ -1551,7 +1555,7 @@ static unsigned char *removeAlpha(unsigned char *src, unsigned char *dst, unsign
43   return temp;
44 }
45
46-static void writePageImage(cups_raster_t *raster, poppler::document *doc,
47+static void writePageImage(cups_raster_t *raster, PDFInner::PDFDocument* doc,
48   int pageNo)
49 {
50   ConvertLineFunc convertLine;
51@@ -1559,36 +1563,35 @@ static void writePageImage(cups_raster_t *raster, poppler::document *doc,
52   unsigned char *dp;
53   unsigned int rowsize;
54
55-  poppler::page *current_page =doc->create_page(pageNo-1);
56-  poppler::page_renderer pr;
57-  pr.set_render_hint(poppler::page_renderer::antialiasing, true);
58-  pr.set_render_hint(poppler::page_renderer::text_antialiasing, true);
59-
60   unsigned char *colordata,*newdata,*graydata,*onebitdata;
61   unsigned int pixel_count;
62-  poppler::image im;
63+  std::vector<unsigned char>* buffer;
64+  unsigned char* newBuffer;
65   //render the page according to the colourspace and generate the requried data
66   switch (header.cupsColorSpace) {
67    case CUPS_CSPACE_W://gray
68    case CUPS_CSPACE_K://black
69    case CUPS_CSPACE_SW://sgray
70     if(header.cupsBitsPerColor==1){ //special case for 1-bit colorspaces
71-      im = pr.render_page(current_page,header.HWResolution[0],header.HWResolution[1],bitmapoffset[0],bitmapoffset[1],bytesPerLine*8,header.cupsHeight);
72-    newdata = (unsigned char *)malloc(sizeof(char)*3*im.width()*im.height());
73-    newdata = removeAlpha((unsigned char *)im.const_data(),newdata,im.width(),im.height());
74-    graydata=(unsigned char *)malloc(sizeof(char)*im.width()*im.height());
75-    cupsImageRGBToWhite(newdata,graydata,im.width()*im.height());
76-    onebitdata=(unsigned char *)malloc(sizeof(char)*bytesPerLine*im.height());
77-    onebitpixel(graydata,onebitdata,im.width(),im.height());
78+    buffer = doc->GetPageBitMapBuffer(pageNo-1, bitmapoffset[0], bitmapoffset[1], bytesPerLine*8, header.cupsHeight,
79+        3, header.cupsWidth, header.cupsHeight, 0, 0, 0xFFFFFFFF);
80+    newBuffer = &((*buffer)[0]);
81+    newdata = (unsigned char *)malloc(sizeof(char)*3*header.cupsWidth*header.cupsHeight);
82+    newdata = removeAlpha(newBuffer, newdata, header.cupsWidth, header.cupsHeight);
83+    graydata=(unsigned char *)malloc(sizeof(char)*header.cupsWidth*header.cupsHeight);
84+    cupsImageRGBToWhite(newdata,graydata,header.cupsWidth*header.cupsHeight);
85+    onebitdata=(unsigned char *)malloc(sizeof(char)*bytesPerLine*header.cupsHeight);
86+    onebitpixel(graydata,onebitdata,header.cupsWidth, header.cupsHeight);
87     colordata=onebitdata;
88     rowsize=bytesPerLine;
89-    }
90-    else{
91-      im = pr.render_page(current_page,header.HWResolution[0],header.HWResolution[1],bitmapoffset[0],bitmapoffset[1],header.cupsWidth,header.cupsHeight);
92-      newdata = (unsigned char *)malloc(sizeof(char)*3*im.width()*im.height());
93-      newdata = removeAlpha((unsigned char *)im.const_data(),newdata,im.width(),im.height());
94-      pixel_count=im.width()*im.height();
95-      graydata=(unsigned char *)malloc(sizeof(char)*im.width()*im.height());
96+    } else {
97+      buffer = doc->GetPageBitMapBuffer(pageNo-1, bitmapoffset[0], bitmapoffset[1], header.cupsWidth, header.cupsHeight,
98+          3, header.cupsWidth, header.cupsHeight, 0, 0, 0xFFFFFFFF);
99+      newBuffer = &((*buffer)[0]);
100+      newdata = (unsigned char *)malloc(sizeof(char)*3*header.cupsWidth*header.cupsHeight);
101+      newdata = removeAlpha(newBuffer, newdata, header.cupsWidth, header.cupsHeight);
102+      pixel_count=header.cupsWidth * header.cupsHeight;
103+      graydata=(unsigned char *)malloc(sizeof(char)*header.cupsWidth*header.cupsHeight);
104       cupsImageRGBToWhite(newdata,graydata,pixel_count);
105       colordata=graydata;
106       rowsize=header.cupsWidth;
107@@ -1602,10 +1605,12 @@ static void writePageImage(cups_raster_t *raster, poppler::document *doc,
108    case CUPS_CSPACE_CMY:
109    case CUPS_CSPACE_RGBW:
110    default:
111-   im = pr.render_page(current_page,header.HWResolution[0],header.HWResolution[1],bitmapoffset[0],bitmapoffset[1],header.cupsWidth,header.cupsHeight);
112-   newdata = (unsigned char *)malloc(sizeof(char)*3*im.width()*im.height());
113-   newdata = removeAlpha((unsigned char *)im.const_data(),newdata,im.width(),im.height());
114-   pixel_count=im.width()*im.height();
115+   buffer = doc->GetPageBitMapBuffer(pageNo-1, bitmapoffset[0], bitmapoffset[1], header.cupsWidth, header.cupsHeight,
116+       3, header.cupsWidth, header.cupsHeight, 0, 0, 0xFFFFFFFF);
117+   newBuffer = &((*buffer)[0]);
118+   newdata = (unsigned char *)malloc(sizeof(char)*3*header.cupsWidth*header.cupsHeight);
119+   newdata = removeAlpha(newBuffer, newdata, header.cupsWidth, header.cupsHeight);
120+   pixel_count=header.cupsWidth * header.cupsHeight;
121    rowsize=header.cupsWidth*3;
122    colordata=newdata;
123      break;
124@@ -1645,11 +1650,18 @@ static void writePageImage(cups_raster_t *raster, poppler::document *doc,
125       }
126     }
127   }
128-  free(colordata);
129+  if (colordata == newdata) {
130+     if (colordata) free(colordata);
131+  } else {
132+     if (colordata) free(colordata);
133+     if (newdata) free(newdata);
134+  }
135+  if (buffer) delete(buffer);
136+  newBuffer = NULL;
137   if (allocLineBuf) delete[] lineBuf;
138 }
139
140-static void outPage(poppler::document *doc, int pageNo,
141+static void outPage(PDFInner::PDFDocument* doc, int pageNo,
142   cups_raster_t *raster)
143 {
144   int rotate = 0;
145@@ -1661,28 +1673,21 @@ static void outPage(poppler::document *doc, int pageNo,
146   int imageable_area_fit = 0;
147   int i;
148
149-  poppler::page *current_page =doc->create_page(pageNo-1);
150-  poppler::page_box_enum box = poppler::page_box_enum::media_box;
151-  poppler::rectf mediaBox = current_page->page_rect(box);
152-  poppler::page::orientation_enum orient = current_page->orientation();
153-  switch (orient) {
154-    case poppler::page::landscape: rotate=90;
155-     break;
156-    case poppler::page::upside_down: rotate=180;
157-     break;
158-    case poppler::page::seascape: rotate=270;
159-     break;
160-     default:rotate=0;
161-  }
162+  float left = 0;
163+  float bottom = 0;
164+  float right = 0;
165+  float top = 0;
166+  doc->GetMediaBox(pageNo-1, &left, &bottom, &right, &top);
167+  rotate = doc->GetPageRotation(pageNo-1);
168   fprintf(stderr, "DEBUG: mediaBox = [ %f %f %f %f ]; rotate = %d\n",
169-	  mediaBox.left(), mediaBox.top(), mediaBox.right(), mediaBox.bottom(), rotate);
170-  l = mediaBox.width();
171+	  left, top, right, bottom, rotate);
172+  l = right - left;
173   if (l < 0) l = -l;
174   if (rotate == 90 || rotate == 270)
175     header.PageSize[1] = (unsigned)l;
176   else
177     header.PageSize[0] = (unsigned)l;
178-  l = mediaBox.height();
179+  l = bottom - top;
180   if (l < 0) l = -l;
181   if (rotate == 90 || rotate == 270)
182     header.PageSize[0] = (unsigned)l;
183@@ -1831,8 +1836,8 @@ static void outPage(poppler::document *doc, int pageNo,
184   }
185
186   if (imageable_area_fit == 0) {
187-    bitmapoffset[0] = margins[0] / 72.0 * header.HWResolution[0];
188-    bitmapoffset[1] = margins[3] / 72.0 * header.HWResolution[1];
189+    bitmapoffset[0] = margins[0];
190+    bitmapoffset[1] = margins[3];
191   } else {
192     bitmapoffset[0] = 0;
193     bitmapoffset[1] = 0;
194@@ -1972,11 +1977,12 @@ static void setPopplerColorProfile()
195 }
196
197 int main(int argc, char *argv[]) {
198-  poppler::document *doc;
199+  g_pdfSdkCount++;
200+  PDFInner::PDFSdk sdk = PDFInner::PDFSdk::GetSdkInstance();
201+  PDFInner::PDFDocument* doc = sdk.GetDocInstance();
202   int i;
203   int npages=0;
204   cups_raster_t *raster;
205-
206   cmsSetLogErrorHandler(lcmsErrorHandler);
207   parseOpts(argc, argv);
208
209@@ -2002,7 +2008,13 @@ int main(int argc, char *argv[]) {
210       }
211     }
212     close(fd);
213-    doc=poppler::document::load_from_file(name,"","");
214+    if (doc != nullptr) {
215+        size_t len = mbstowcs(NULL, name, 0) + 1;
216+        wchar_t *wName = new wchar_t[len];
217+        mbstowcs(wName, name, len);
218+        doc->LoadDocument(wName, "");
219+        delete[] wName;
220+    }
221     /* remove name */
222     unlink(name);
223   } else {
224@@ -2015,14 +2027,27 @@ int main(int argc, char *argv[]) {
225     }
226     parsePDFTOPDFComment(fp);
227     fclose(fp);
228-    doc=poppler::document::load_from_file(argv[6],"","");
229+    if (doc != nullptr) {
230+        size_t len = strlen(argv[6]) + 1;
231+        wchar_t *wstr = new wchar_t[len];
232+        mbstowcs(wstr, argv[6], len);
233+        doc->LoadDocument(wstr, "");
234+        delete[] wstr;
235+    }
236   }
237
238   if(doc != NULL)
239-    npages = doc->pages();
240-
241+    npages = doc->GetPageCount();
242+  fprintf(stderr, "ERROR: npages: %d\n", npages);
243   /* fix NumCopies, Collate ccording to PDFTOPDFComments */
244-  header.NumCopies = deviceCopies;
245+  if (cupsManualCopies) {
246+    fprintf(stderr, "ERROR: Using cups to handle the number of printed copies\n");
247+    header.NumCopies = atoi(argv[4]);
248+  } else {
249+    fprintf(stderr, "ERROR: The printer handles the number of printed copies\n");
250+    header.NumCopies = 1;
251+  }
252+  fprintf(stderr, "ERROR: NumCopies: %d\n", header.NumCopies);
253   header.Collate = deviceCollate ? CUPS_TRUE : CUPS_FALSE;
254   /* fixed other values that pdftopdf handles */
255   header.MirrorPrint = CUPS_FALSE;
256@@ -2127,7 +2152,13 @@ int main(int argc, char *argv[]) {
257
258   cupsRasterClose(raster);
259
260-  delete doc;
261+  if (doc != nullptr) {
262+    sdk.ReleaseDocInstance(doc);
263+  }
264+  g_pdfSdkCount--;
265+  if (g_pdfSdkCount == 0) {
266+    sdk.Release();
267+  }
268   if (ppd != NULL) {
269     ppdClose(ppd);
270   }
271@@ -2143,30 +2174,3 @@ int main(int argc, char *argv[]) {
272
273   return exitCode;
274 }
275-
276-/* replace memory allocation methods for memory check */
277-/* For compatibility with g++ >= 4.7 compilers _GLIBCXX_THROW
278- *  should be used as a guard, otherwise use traditional definition */
279-#ifndef _GLIBCXX_THROW
280-#define _GLIBCXX_THROW throw
281-#endif
282-
283-void * operator new(size_t size) _GLIBCXX_THROW (std::bad_alloc)
284-{
285-  return malloc(size);
286-}
287-
288-void operator delete(void *p) throw ()
289-{
290-  free(p);
291-}
292-
293-void * operator new[](size_t size) _GLIBCXX_THROW (std::bad_alloc)
294-{
295-  return malloc(size);
296-}
297-
298-void operator delete[](void *p) throw ()
299-{
300-  free(p);
301-}
302