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