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