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