⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 psoutputdev.cc

📁 这是一个做pdf阅读器的源代码文件,是大家学习阅读器资料的很好参考
💻 CC
📖 第 1 页 / 共 5 页
字号:
  underlayCbkData = NULL;  overlayCbk = NULL;  overlayCbkData = NULL;  fontIDs = NULL;  fontFileIDs = NULL;  fontFileNames = NULL;  font8Info = NULL;  font16Enc = NULL;  imgIDs = NULL;  formIDs = NULL;  xobjStack = NULL;  embFontList = NULL;  customColors = NULL;  haveTextClip = gFalse;  t3String = NULL;  // open file or pipe  if (!strcmp(fileName, "-")) {    fileTypeA = psStdout;    f = stdout;  } else if (fileName[0] == '|') {    fileTypeA = psPipe;#ifdef HAVE_POPEN#ifndef WIN32    signal(SIGPIPE, (SignalFunc)SIG_IGN);#endif    if (!(f = popen(fileName + 1, "w"))) {      error(-1, "Couldn't run print command '%s'", fileName);      ok = gFalse;      return;    }#else    error(-1, "Print commands are not supported ('%s')", fileName);    ok = gFalse;    return;#endif  } else {    fileTypeA = psFile;    if (!(f = fopen(fileName, "w"))) {      error(-1, "Couldn't open PostScript file '%s'", fileName);      ok = gFalse;      return;    }  }  init(outputToFile, f, fileTypeA,       xrefA, catalog, firstPage, lastPage, modeA,       imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA);}PSOutputDev::PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA,			 XRef *xrefA, Catalog *catalog,			 int firstPage, int lastPage, PSOutMode modeA,			 int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,			 GBool manualCtrlA) {  underlayCbk = NULL;  underlayCbkData = NULL;  overlayCbk = NULL;  overlayCbkData = NULL;  fontIDs = NULL;  fontFileIDs = NULL;  fontFileNames = NULL;  font8Info = NULL;  font16Enc = NULL;  imgIDs = NULL;  formIDs = NULL;  xobjStack = NULL;  embFontList = NULL;  customColors = NULL;  haveTextClip = gFalse;  t3String = NULL;  init(outputFuncA, outputStreamA, psGeneric,       xrefA, catalog, firstPage, lastPage, modeA,       imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA);}void PSOutputDev::init(PSOutputFunc outputFuncA, void *outputStreamA,		       PSFileType fileTypeA, XRef *xrefA, Catalog *catalog,		       int firstPage, int lastPage, PSOutMode modeA,		       int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,		       GBool manualCtrlA) {  Page *page;  PDFRectangle *box;  // initialize  ok = gTrue;  outputFunc = outputFuncA;  outputStream = outputStreamA;  fileType = fileTypeA;  xref = xrefA;  level = globalParams->getPSLevel();  mode = modeA;  paperWidth = globalParams->getPSPaperWidth();  paperHeight = globalParams->getPSPaperHeight();  imgLLX = imgLLXA;  imgLLY = imgLLYA;  imgURX = imgURXA;  imgURY = imgURYA;  if (imgLLX == 0 && imgURX == 0 && imgLLY == 0 && imgURY == 0) {    globalParams->getPSImageableArea(&imgLLX, &imgLLY, &imgURX, &imgURY);  }  if (paperWidth < 0 || paperHeight < 0) {    // this check is needed in case the document has zero pages    if (firstPage > 0 && firstPage <= catalog->getNumPages()) {      page = catalog->getPage(firstPage);      paperWidth = (int)ceil(page->getMediaWidth());      paperHeight = (int)ceil(page->getMediaHeight());    } else {      paperWidth = 1;      paperHeight = 1;    }    imgLLX = imgLLY = 0;    imgURX = paperWidth;    imgURY = paperHeight;  }  preload = globalParams->getPSPreload();  manualCtrl = manualCtrlA;  if (mode == psModeForm) {    lastPage = firstPage;  }  processColors = 0;  inType3Char = gFalse;#if OPI_SUPPORT  // initialize OPI nesting levels  opi13Nest = 0;  opi20Nest = 0;#endif  tx0 = ty0 = -1;  xScale0 = yScale0 = 0;  rotate0 = -1;  clipLLX0 = clipLLY0 = 0;  clipURX0 = clipURY0 = -1;  // initialize fontIDs, fontFileIDs, and fontFileNames lists  fontIDSize = 64;  fontIDLen = 0;  fontIDs = (Ref *)gmallocn(fontIDSize, sizeof(Ref));  fontFileIDSize = 64;  fontFileIDLen = 0;  fontFileIDs = (Ref *)gmallocn(fontFileIDSize, sizeof(Ref));  fontFileNameSize = 64;  fontFileNameLen = 0;  fontFileNames = (GString **)gmallocn(fontFileNameSize, sizeof(GString *));  nextTrueTypeNum = 0;  font8InfoLen = 0;  font8InfoSize = 0;  font16EncLen = 0;  font16EncSize = 0;  imgIDLen = 0;  imgIDSize = 0;  formIDLen = 0;  formIDSize = 0;  xobjStack = new GList();  numSaves = 0;  numTilingPatterns = 0;  nextFunc = 0;  // initialize embedded font resource comment list  embFontList = new GString();  if (!manualCtrl) {    // this check is needed in case the document has zero pages    if (firstPage > 0 && firstPage <= catalog->getNumPages()) {      writeHeader(firstPage, lastPage,		  catalog->getPage(firstPage)->getMediaBox(),		  catalog->getPage(firstPage)->getCropBox(),		  catalog->getPage(firstPage)->getRotate());    } else {      box = new PDFRectangle(0, 0, 1, 1);      writeHeader(firstPage, lastPage, box, box, 0);      delete box;    }    if (mode != psModeForm) {      writePS("%%BeginProlog\n");    }    writeXpdfProcset();    if (mode != psModeForm) {      writePS("%%EndProlog\n");      writePS("%%BeginSetup\n");    }    writeDocSetup(catalog, firstPage, lastPage);    if (mode != psModeForm) {      writePS("%%EndSetup\n");    }  }  // initialize sequential page number  seqPage = 1;}PSOutputDev::~PSOutputDev() {  PSOutCustomColor *cc;  int i;  if (ok) {    if (!manualCtrl) {      writePS("%%Trailer\n");      writeTrailer();      if (mode != psModeForm) {	writePS("%%EOF\n");      }    }    if (fileType == psFile) {#ifdef MACOS      ICS_MapRefNumAndAssign((short)((FILE *)outputStream)->handle);#endif      fclose((FILE *)outputStream);    }#ifdef HAVE_POPEN    else if (fileType == psPipe) {      pclose((FILE *)outputStream);#ifndef WIN32      signal(SIGPIPE, (SignalFunc)SIG_DFL);#endif    }#endif  }  if (embFontList) {    delete embFontList;  }  if (fontIDs) {    gfree(fontIDs);  }  if (fontFileIDs) {    gfree(fontFileIDs);  }  if (fontFileNames) {    for (i = 0; i < fontFileNameLen; ++i) {      delete fontFileNames[i];    }    gfree(fontFileNames);  }  if (font8Info) {    for (i = 0; i < font8InfoLen; ++i) {      gfree(font8Info[i].codeToGID);    }    gfree(font8Info);  }  if (font16Enc) {    for (i = 0; i < font16EncLen; ++i) {      delete font16Enc[i].enc;    }    gfree(font16Enc);  }  gfree(imgIDs);  gfree(formIDs);  if (xobjStack) {    delete xobjStack;  }  while (customColors) {    cc = customColors;    customColors = cc->next;    delete cc;  }}void PSOutputDev::writeHeader(int firstPage, int lastPage,			      PDFRectangle *mediaBox, PDFRectangle *cropBox,			      int pageRotate) {  Object info, obj1;  double x1, y1, x2, y2;  switch (mode) {  case psModePS:    writePS("%!PS-Adobe-3.0\n");    break;  case psModeEPS:    writePS("%!PS-Adobe-3.0 EPSF-3.0\n");    break;  case psModeForm:    writePS("%!PS-Adobe-3.0 Resource-Form\n");    break;  }  writePSFmt("% Produced by xpdf/pdftops {0:s}\n", xpdfVersion);  xref->getDocInfo(&info);  if (info.isDict() && info.dictLookup("Creator", &obj1)->isString()) {    writePS("%%Creator: ");    writePSTextLine(obj1.getString());  }  obj1.free();  if (info.isDict() && info.dictLookup("Title", &obj1)->isString()) {    writePS("%%Title: ");    writePSTextLine(obj1.getString());  }  obj1.free();  info.free();  writePSFmt("%%LanguageLevel: {0:d}\n",	     (level == psLevel1 || level == psLevel1Sep) ? 1 :	     (level == psLevel2 || level == psLevel2Sep) ? 2 : 3);  if (level == psLevel1Sep || level == psLevel2Sep || level == psLevel3Sep) {    writePS("%%DocumentProcessColors: (atend)\n");    writePS("%%DocumentCustomColors: (atend)\n");  }  writePS("%%DocumentSuppliedResources: (atend)\n");  switch (mode) {  case psModePS:    writePSFmt("%%DocumentMedia: plain {0:d} {1:d} 0 () ()\n",	       paperWidth, paperHeight);    writePSFmt("%%BoundingBox: 0 0 {0:d} {1:d}\n", paperWidth, paperHeight);    writePSFmt("%%Pages: {0:d}\n", lastPage - firstPage + 1);    writePS("%%EndComments\n");    writePS("%%BeginDefaults\n");    writePS("%%PageMedia: plain\n");    writePS("%%EndDefaults\n");    break;  case psModeEPS:    epsX1 = cropBox->x1;    epsY1 = cropBox->y1;    epsX2 = cropBox->x2;    epsY2 = cropBox->y2;    if (pageRotate == 0 || pageRotate == 180) {      x1 = epsX1;      y1 = epsY1;      x2 = epsX2;      y2 = epsY2;    } else { // pageRotate == 90 || pageRotate == 270      x1 = 0;      y1 = 0;      x2 = epsY2 - epsY1;      y2 = epsX2 - epsX1;    }    writePSFmt("%%BoundingBox: {0:d} {1:d} {2:d} {3:d}\n",	       (int)floor(x1), (int)floor(y1), (int)ceil(x2), (int)ceil(y2));    if (floor(x1) != ceil(x1) || floor(y1) != ceil(y1) ||	floor(x2) != ceil(x2) || floor(y2) != ceil(y2)) {      writePSFmt("%%HiResBoundingBox: {0:.4g} {1:.4g} {2:.4g} {3:.4g}\n",		 x1, y1, x2, y2);    }    writePS("%%EndComments\n");    break;  case psModeForm:    writePS("%%EndComments\n");    writePS("32 dict dup begin\n");    writePSFmt("/BBox [{0:d} {1:d} {2:d} {3:d}] def\n",	       (int)floor(mediaBox->x1), (int)floor(mediaBox->y1),	       (int)ceil(mediaBox->x2), (int)ceil(mediaBox->y2));    writePS("/FormType 1 def\n");    writePS("/Matrix [1 0 0 1 0 0] def\n");    break;  }}void PSOutputDev::writeXpdfProcset() {  GBool lev1, lev2, lev3, sep, nonSep;  char **p;  char *q;  writePSFmt("%%BeginResource: procset xpdf {0:s} 0\n", xpdfVersion);  writePSFmt("%%Copyright: {0:s}\n", xpdfCopyright);  lev1 = lev2 = lev3 = sep = nonSep = gTrue;  for (p = prolog; *p; ++p) {    if ((*p)[0] == '~') {      lev1 = lev2 = lev3 = sep = nonSep = gFalse;      for (q = *p + 1; *q; ++q) {	switch (*q) {	case '1': lev1 = gTrue; break;	case '2': lev2 = gTrue; break;	case '3': lev3 = gTrue; break;	case 's': sep = gTrue; break;	case 'n': nonSep = gTrue; break;	}      }    } else if ((level == psLevel1 && lev1 && nonSep) ||	       (level == psLevel1Sep && lev1 && sep) ||	       (level == psLevel2 && lev2 && nonSep) ||	       (level == psLevel2Sep && lev2 && sep) ||	       (level == psLevel3 && lev3 && nonSep) ||	       (level == psLevel3Sep && lev3 && sep)) {      writePSFmt("{0:s}\n", *p);    }  }  writePS("%%EndResource\n");  if (level >= psLevel3) {    for (p = cmapProlog; *p; ++p) {      writePSFmt("{0:s}\n", *p);    }  }}void PSOutputDev::writeDocSetup(Catalog *catalog,				int firstPage, int lastPage) {  Page *page;  Dict *resDict;  Annots *annots;  Object obj1, obj2;  int pg, i;  if (mode == psModeForm) {    // swap the form and xpdf dicts    writePS("xpdf end begin dup begin\n");  } else {    writePS("xpdf begin\n");  }  for (pg = firstPage; pg <= lastPage; ++pg) {    page = catalog->getPage(pg);    if ((resDict = page->getResourceDict())) {      setupResources(resDict);    }    annots = new Annots(xref, catalog, page->getAnnots(&obj1));    obj1.free();    for (i = 0; i < annots->getNumAnnots(); ++i) {      if (annots->getAnnot(i)->getAppearance(&obj1)->isStream()) {	obj1.streamGetDict()->lookup("Resources", &obj2);	if (obj2.isDict()) {	  setupResources(obj2.getDict());	}	obj2.free();      }      obj1.free();    }    delete annots;  }  if (mode != psModeForm) {    if (mode != psModeEPS && !manualCtrl) {      writePSFmt("{0:d} {1:d} {2:s} pdfSetup\n",		 paperWidth, paperHeight,		 globalParams->getPSDuplex() ? "true" : "false");    }#if OPI_SUPPORT    if (globalParams->getPSOPI()) {      writePS("/opiMatrix matrix currentmatrix def\n");    }#endif  }}void PSOutputDev::writePageTrailer() {  if (mode != psModeForm) {    writePS("pdfEndPage\n");  }}void PSOutputDev::writeTrailer() {  PSOutCustomColor *cc;  if (mode == psModeForm) {    writePS("/Foo exch /Form defineresource pop\n");  } else {    writePS("end\n");    writePS("%%DocumentSuppliedResources:\n");    writePS(embFontList->getCString());    if (level == psLevel1Sep || level == psLevel2Sep ||	level == psLevel3Sep) {      writePS("%%DocumentProcessColors:");      if (processColors & psProcessCyan) {	writePS(" Cyan");	 }      if (processColors & psProcessMagenta) {	writePS(" Magenta");      }      if (processColors & psProcessYellow) {	writePS(" Yellow");      }      if (processColors & psProcessBlack) {	writePS(" Black");      }      writePS("\n");      writePS("%%DocumentCustomColors:");      for (cc = customColors; cc; cc = cc->next) {	writePSFmt(" ({0:s})", cc->name->getCString());      }      writePS("\n");      writePS("%%CMYKCustomColor:\n");      for (cc = customColors; cc; cc = cc->next) {	writePSFmt("%%+ {0:.4g} {1:.4g} {2:.4g} {3:.4g} ({4:t})\n",		   cc->c, cc->m, cc->y, cc->k, cc->name);      }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -