Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 600636 Details for
Bug 703788
app-text/texlive-core-2019-r4 w/ app-text/poppler-0.83.0: pdftosrc.cc:81:37: error: no match for 'operator=' (operand types are 'std::unique_ptr<GlobalParams>' and 'GlobalParams*')
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
compat.patch
poppler.patch (text/plain), 30.94 KB, created by
Mikle Kolyada (RETIRED)
on 2019-12-26 15:56:27 UTC
(
hide
)
Description:
compat.patch
Filename:
MIME Type:
Creator:
Mikle Kolyada (RETIRED)
Created:
2019-12-26 15:56:27 UTC
Size:
30.94 KB
patch
obsolete
>From 9f4f9d3f643bbf75afc7b29e9634f57529d64301 Mon Sep 17 00:00:00 2001 >From: Mikle Kolyada <zlogene@gentoo.org> >Date: Wed, 25 Dec 2019 23:43:59 +0300 >Subject: [PATCH] Add poppler-0.83.0 compat > >Signed-off-by: Mikle Kolyada <zlogene@gentoo.org> >--- > pdftoepdf.cc | 313 ++++++++++++++++++++++++++------------------------- > pdftosrc.cc | 70 +++++------- > 2 files changed, 188 insertions(+), 195 deletions(-) > >diff --git a/pdftoepdf.cc b/pdftoepdf.cc >index 4db0c90..6204548 100644 >--- a/texk/web2c/pdftexdir/pdftoepdf.cc >+++ b/texk/web2c/pdftexdir/pdftoepdf.cc >@@ -1,5 +1,5 @@ > /* >-Copyright 1996-2016 Han The Thanh, <thanh@pdftex.org> >+Copyright 1996-2017 Han The Thanh, <thanh@pdftex.org> > > This file is part of pdfTeX. > >@@ -17,6 +17,15 @@ You should have received a copy of the GNU General Public License along > with this program. If not, see <http://www.gnu.org/licenses/>. > */ > >+/* >+This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at >+https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk >+by Arch Linux. A little modifications are made to avoid a crash for >+some kind of pdf images, such as figure_missing.pdf in gnuplot. >+The poppler should be 0.83.0 or newer versions. >+POPPLER_VERSION should be defined. >+*/ >+ > /* Do this early in order to avoid a conflict between > MINGW32 <rpcndr.h> defining 'boolean' as 'unsigned char' and > <kpathsea/types.h> defining Pascal's boolean as 'int'. >@@ -39,10 +48,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. > #include <goo/gfile.h> > #define GString GooString > #else >-#include <aconf.h> >-#include <GString.h> >-#include <gmem.h> >-#include <gfile.h> >+#error POPPLER_VERSION should be defined. > #endif > #include <assert.h> > >@@ -84,31 +90,6 @@ extern integer zround(double); > #define MASK_SUPPRESS_PTEX_PAGENUMBER 0x04 > #define MASK_SUPPRESS_PTEX_INFODICT 0x08 > >-// PdfObject encapsulates the xpdf Object type, >-// and properly frees its resources on destruction. >-// Use obj-> to access members of the Object, >-// and &obj to get a pointer to the object. >-// It is no longer necessary to call Object::free explicitely. >- >-class PdfObject { >- public: >- PdfObject() { // nothing >- } ~PdfObject() { >- iObject.free(); >- } >- Object *operator->() { >- return &iObject; >- } >- Object *operator&() { >- return &iObject; >- } >- private: // no copying or assigning >- PdfObject(const PdfObject &); >- void operator=(const PdfObject &); >- public: >- Object iObject; >-}; >- > // When copying the Resources of the selected page, all objects are copied > // recusively top-down. Indirect objects however are not fetched during > // copying, but get a new object number from pdfTeX and then will be >@@ -139,7 +120,7 @@ struct UsedEncoding { > > static InObj *inObjList; > static UsedEncoding *encodingList; >-static GBool isInit = gFalse; >+static bool isInit = false; > > // -------------------------------------------------------------------- > // Maintain list of open embedded PDF files >@@ -212,18 +193,6 @@ static void delete_document(PdfDocument * pdf_doc) > delete pdf_doc; > } > >-// Replacement for >-// Object *initDict(Dict *dict1){ initObj(objDict); dict = dict1; return this; } >- >-static void initDictFromDict(PdfObject & obj, Dict * dict) >-{ >- obj->initDict(xref); >- for (int i = 0, l = dict->getLength(); i < l; i++) { >- Object obj1; >- obj->dictAdd(copyString(dict->getKey(i)), dict->getValNF(i, &obj1)); >- } >-} >- > // -------------------------------------------------------------------- > > static int addEncoding(GfxFont * gfont) >@@ -320,10 +289,10 @@ static void copyName(char *s) > > static void copyDictEntry(Object * obj, int i) > { >- PdfObject obj1; >- copyName(obj->dictGetKey(i)); >+ Object obj1; >+ copyName((char *)obj->dictGetKey(i)); > pdf_puts(" "); >- obj->dictGetValNF(i, &obj1); >+ obj1 = obj->dictGetValNF(i).copy(); > copyObject(&obj1); > pdf_puts("\n"); > } >@@ -348,7 +317,7 @@ static void copyFontDict(Object * obj, InObj * r) > pdf_puts("<<\n"); > assert(r->type == objFont); // FontDescriptor is in fd_tree > for (i = 0, l = obj->dictGetLength(); i < l; ++i) { >- key = obj->dictGetKey(i); >+ key = (char *)obj->dictGetKey(i); > if (strncmp("FontDescriptor", key, strlen("FontDescriptor")) == 0 > || strncmp("BaseFont", key, strlen("BaseFont")) == 0 > || strncmp("Encoding", key, strlen("Encoding")) == 0) >@@ -376,17 +345,17 @@ static void copyStream(Stream * str) > static void copyProcSet(Object * obj) > { > int i, l; >- PdfObject procset; >+ Object procset; > if (!obj->isArray()) > pdftex_fail("PDF inclusion: invalid ProcSet array type <%s>", > obj->getTypeName()); > pdf_puts("/ProcSet [ "); > for (i = 0, l = obj->arrayGetLength(); i < l; ++i) { >- obj->arrayGetNF(i, &procset); >- if (!procset->isName()) >+ procset = obj->arrayGetNF(i).copy(); >+ if (!procset.isName()) > pdftex_fail("PDF inclusion: invalid ProcSet entry type <%s>", >- procset->getTypeName()); >- copyName(procset->getName()); >+ procset.getTypeName()); >+ copyName((char *)procset.getName()); > pdf_puts(" "); > } > pdf_puts("]\n"); >@@ -394,10 +363,29 @@ static void copyProcSet(Object * obj) > > #define REPLACE_TYPE1C true > >+static bool embeddableFont(Object * fontdesc) >+{ >+ Object fontfile, ffsubtype; >+ >+ if (!fontdesc->isDict()) >+ return false; >+ fontfile = fontdesc->dictLookup("FontFile"); >+ if (fontfile.isStream()) >+ return true; >+ if (REPLACE_TYPE1C) { >+ fontfile = fontdesc->dictLookup("FontFile3"); >+ if (!fontfile.isStream()) >+ return false; >+ ffsubtype = fontfile.streamGetDict()->lookup("Subtype"); >+ return ffsubtype.isName() && !strcmp(ffsubtype.getName(), "Type1C"); >+ } >+ return false; >+} >+ > static void copyFont(char *tag, Object * fontRef) > { >- PdfObject fontdict, subtype, basefont, fontdescRef, fontdesc, charset, >- fontfile, ffsubtype, stemV; >+ Object fontdict, subtype, basefont, fontdescRef, fontdesc, charset, >+ stemV; > GfxFont *gfont; > fd_entry *fd; > fm_entry *fontmap; >@@ -413,33 +401,39 @@ static void copyFont(char *tag, Object * fontRef) > } > // Only handle included Type1 (and Type1C) fonts; anything else will be copied. > // Type1C fonts are replaced by Type1 fonts, if REPLACE_TYPE1C is true. >- if (!fixedinclusioncopyfont && fontRef->fetch(xref, &fontdict)->isDict() >- && fontdict->dictLookup("Subtype", &subtype)->isName() >- && !strcmp(subtype->getName(), "Type1") >- && fontdict->dictLookup("BaseFont", &basefont)->isName() >- && fontdict->dictLookupNF("FontDescriptor", &fontdescRef)->isRef() >- && fontdescRef->fetch(xref, &fontdesc)->isDict() >- && (fontdesc->dictLookup("FontFile", &fontfile)->isStream() >- || (REPLACE_TYPE1C >- && fontdesc->dictLookup("FontFile3", &fontfile)->isStream() >- && fontfile->streamGetDict()->lookup("Subtype", >- &ffsubtype)->isName() >- && !strcmp(ffsubtype->getName(), "Type1C"))) >- && (fontmap = lookup_fontmap(basefont->getName())) != NULL) { >+ fontdict = fontRef->fetch(xref); >+ fontdesc = Object(objNull); >+ if (fontdict.isDict()) { >+ subtype = fontdict.dictLookup("Subtype"); >+ basefont = fontdict.dictLookup("BaseFont"); >+ fontdescRef = fontdict.dictLookupNF("FontDescriptor").copy(); >+ if (fontdescRef.isRef()) { >+ fontdesc = fontdescRef.fetch(xref); >+ } >+ } >+ if (!fixedinclusioncopyfont && fontdict.isDict() >+ && subtype.isName() >+ && !strcmp(subtype.getName(), "Type1") >+ && basefont.isName() >+ && fontdescRef.isRef() >+ && fontdesc.isDict() >+ && embeddableFont(&fontdesc) >+ && (fontmap = lookup_fontmap((char *)basefont.getName())) != NULL) { > // round /StemV value, since the PDF input is a float > // (see Font Descriptors in PDF reference), but we only store an > // integer, since we don't want to change the struct. >- fontdesc->dictLookup("StemV", &stemV); >- fd = epdf_create_fontdescriptor(fontmap, zround(stemV->getNum())); >- if (fontdesc->dictLookup("CharSet", &charset) && >- charset->isString() && is_subsetable(fontmap)) >- epdf_mark_glyphs(fd, charset->getString()->getCString()); >+ stemV = fontdesc.dictLookup("StemV"); >+ fd = epdf_create_fontdescriptor(fontmap, zround(stemV.getNum())); >+ charset = fontdesc.dictLookup("CharSet"); >+ if (!charset.isNull() && >+ charset.isString() && is_subsetable(fontmap)) >+ epdf_mark_glyphs(fd, (char *)charset.getString()->c_str()); > else > embed_whole_font(fd); >- addFontDesc(fontdescRef->getRef(), fd); >+ addFontDesc(fontdescRef.getRef(), fd); > copyName(tag); > gfont = GfxFont::makeFont(xref, tag, fontRef->getRef(), >- fontdict->getDict()); >+ fontdict.getDict()); > pdf_printf(" %d 0 R ", addFont(fontRef->getRef(), fd, > addEncoding(gfont))); > } else { >@@ -451,24 +445,24 @@ static void copyFont(char *tag, Object * fontRef) > > static void copyFontResources(Object * obj) > { >- PdfObject fontRef; >+ Object fontRef; > int i, l; > if (!obj->isDict()) > pdftex_fail("PDF inclusion: invalid font resources dict type <%s>", > obj->getTypeName()); > pdf_puts("/Font << "); > for (i = 0, l = obj->dictGetLength(); i < l; ++i) { >- obj->dictGetValNF(i, &fontRef); >- if (fontRef->isRef()) >- copyFont(obj->dictGetKey(i), &fontRef); >- else if (fontRef->isDict()) { // some programs generate pdf with embedded font object >- copyName(obj->dictGetKey(i)); >+ fontRef = obj->dictGetValNF(i).copy(); >+ if (fontRef.isRef()) >+ copyFont((char *)obj->dictGetKey(i), &fontRef); >+ else if (fontRef.isDict()) { // some programs generate pdf with embedded font object >+ copyName((char *)obj->dictGetKey(i)); > pdf_puts(" "); > copyObject(&fontRef); > } > else > pdftex_fail("PDF inclusion: invalid font in reference type <%s>", >- fontRef->getTypeName()); >+ fontRef.getTypeName()); > } > pdf_puts(">>\n"); > } >@@ -557,7 +551,7 @@ static char *convertNumToPDF(double n) > > static void copyObject(Object * obj) > { >- PdfObject obj1; >+ Object obj1; > int i, l, c; > Ref ref; > char *p; >@@ -571,8 +565,8 @@ static void copyObject(Object * obj) > } else if (obj->isNum()) { > pdf_printf("%s", convertNumToPDF(obj->getNum())); > } else if (obj->isString()) { >- s = obj->getString(); >- p = s->getCString(); >+ s = (GooString *)obj->getString(); >+ p = (char *)s->c_str(); > l = s->getLength(); > if (strlen(p) == (unsigned int) l) { > pdf_puts("("); >@@ -595,14 +589,14 @@ static void copyObject(Object * obj) > pdf_puts(">"); > } > } else if (obj->isName()) { >- copyName(obj->getName()); >+ copyName((char *)obj->getName()); > } else if (obj->isNull()) { > pdf_puts("null"); > } else if (obj->isArray()) { > pdf_puts("["); > for (i = 0, l = obj->arrayGetLength(); i < l; ++i) { >- obj->arrayGetNF(i, &obj1); >- if (!obj1->isName()) >+ obj1 = obj->arrayGetNF(i).copy(); >+ if (!obj1.isName()) > pdf_puts(" "); > copyObject(&obj1); > } >@@ -612,9 +606,8 @@ static void copyObject(Object * obj) > copyDict(obj); > pdf_puts(">>"); > } else if (obj->isStream()) { >- initDictFromDict(obj1, obj->streamGetDict()); > pdf_puts("<<\n"); >- copyDict(&obj1); >+ copyDict(obj->getStream()->getDictObject()); > pdf_puts(">>\n"); > pdf_puts("stream\n"); > copyStream(obj->getStream()->getUndecodedStream()); >@@ -638,9 +631,8 @@ static void writeRefs() > InObj *r; > for (r = inObjList; r != 0; r = r->next) { > if (!r->written) { >- Object obj1; > r->written = 1; >- xref->fetch(r->ref.num, r->ref.gen, &obj1); >+ Object obj1 = xref->fetch(r->ref.num, r->ref.gen); > if (r->type == objFont) { > assert(!obj1.isStream()); > pdfbeginobj(r->num, 2); // \pdfobjcompresslevel = 2 is for this >@@ -656,7 +648,6 @@ static void writeRefs() > pdf_puts("\n"); > pdfendobj(); > } >- obj1.free(); > } > } > } >@@ -673,7 +664,7 @@ static void writeEncodings() > ("PDF inclusion: CID fonts are not supported" > " (try to disable font replacement to fix this)"); > } >- if ((s = ((Gfx8BitFont *) r->font)->getCharName(i)) != 0) >+ if ((s = (char *)((Gfx8BitFont *) r->font)->getCharName(i)) != 0) > glyphNames[i] = s; > else > glyphNames[i] = notdef; >@@ -685,14 +676,14 @@ static void writeEncodings() > #ifdef POPPLER_VERSION > r->font->decRefCnt(); > #else >- delete r->font; >+#error POPPLER_VERSION should be defined. > #endif > delete r; > } > } > > // get the pagebox according to the pagebox_spec >-static PDFRectangle *get_pagebox(Page * page, int pagebox_spec) >+static const PDFRectangle *get_pagebox(Page * page, int pagebox_spec) > { > if (pagebox_spec == pdfboxspecmedia) > return page->getMediaBox(); >@@ -719,22 +710,22 @@ static PDFRectangle *get_pagebox(Page * page, int pagebox_spec) > > int > read_pdf_info(char *image_name, char *page_name, int page_num, >- int pagebox_spec, int minor_pdf_version_wanted, >+ int pagebox_spec, int major_pdf_version_wanted, int minor_pdf_version_wanted, > int pdf_inclusion_errorlevel) > { > PdfDocument *pdf_doc; > Page *page; >- PDFRectangle *pagebox; >+ const PDFRectangle *pagebox; > #ifdef POPPLER_VERSION > int pdf_major_version_found, pdf_minor_version_found; > #else >- float pdf_version_found, pdf_version_wanted; >+#error POPPLER_VERSION should be defined. > #endif > // initialize > if (!isInit) { >- globalParams = new GlobalParams(); >- globalParams->setErrQuiet(gFalse); >- isInit = gTrue; >+ globalParams = std::make_unique<GlobalParams>(); >+ globalParams->setErrQuiet(false); >+ isInit = true; > } > // open PDF file > pdf_doc = find_add_document(image_name); >@@ -747,32 +738,20 @@ read_pdf_info(char *image_name, char *page_name, int page_num, > #ifdef POPPLER_VERSION > pdf_major_version_found = pdf_doc->doc->getPDFMajorVersion(); > pdf_minor_version_found = pdf_doc->doc->getPDFMinorVersion(); >- if ((pdf_major_version_found > 1) >+ if ((pdf_major_version_found > major_pdf_version_wanted) > || (pdf_minor_version_found > minor_pdf_version_wanted)) { > const char *msg = >- "PDF inclusion: found PDF version <%d.%d>, but at most version <1.%d> allowed"; >+ "PDF inclusion: found PDF version <%d.%d>, but at most version <%d.%d> allowed"; > if (pdf_inclusion_errorlevel > 0) { >- pdftex_fail(msg, pdf_major_version_found, pdf_minor_version_found, minor_pdf_version_wanted); >+ pdftex_fail(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted); > } else if (pdf_inclusion_errorlevel < 0) { > ; /* do nothing */ > } else { /* = 0, give warning */ >- pdftex_warn(msg, pdf_major_version_found, pdf_minor_version_found, minor_pdf_version_wanted); >+ pdftex_warn(msg, pdf_major_version_found, pdf_minor_version_found, major_pdf_version_wanted, minor_pdf_version_wanted); > } > } > #else >- pdf_version_found = pdf_doc->doc->getPDFVersion(); >- pdf_version_wanted = 1 + (minor_pdf_version_wanted * 0.1); >- if (pdf_version_found > pdf_version_wanted + 0.01) { >- char msg[] = >- "PDF inclusion: found PDF version <%.1f>, but at most version <%.1f> allowed"; >- if (pdf_inclusion_errorlevel > 0) { >- pdftex_fail(msg, pdf_version_found, pdf_version_wanted); >- } else if (pdf_inclusion_errorlevel < 0) { >- ; /* do nothing */ >- } else { /* = 0, give warning */ >- pdftex_warn(msg, pdf_version_found, pdf_version_wanted); >- } >- } >+#error POPPLER_VERSION should be defined. > #endif > epdf_num_pages = pdf_doc->doc->getCatalog()->getNumPages(); > if (page_name) { >@@ -782,7 +761,7 @@ read_pdf_info(char *image_name, char *page_name, int page_num, > if (link == 0 || !link->isOk()) > pdftex_fail("PDF inclusion: invalid destination <%s>", page_name); > Ref ref = link->getPageRef(); >- page_num = pdf_doc->doc->getCatalog()->findPage(ref.num, ref.gen); >+ page_num = pdf_doc->doc->getCatalog()->findPage(ref); > if (page_num == 0) > pdftex_fail("PDF inclusion: destination is not a page <%s>", > page_name); >@@ -839,8 +818,8 @@ void write_epdf(void) > Page *page; > Ref *pageRef; > Dict *pageDict; >- PdfObject contents, obj1, obj2, pageObj, dictObj; >- PdfObject groupDict; >+ Object contents, obj1, obj2, pageObj, dictObj; >+ Object groupDict; > bool writeSepGroup = false; > Object info; > char *key; >@@ -867,10 +846,10 @@ void write_epdf(void) > encodingList = 0; > page = pdf_doc->doc->getCatalog()->getPage(epdf_selected_page); > pageRef = pdf_doc->doc->getCatalog()->getPageRef(epdf_selected_page); >- xref->fetch(pageRef->num, pageRef->gen, &pageObj); >- pageDict = pageObj->getDict(); >+ pageObj = xref->fetch(pageRef->num, pageRef->gen); >+ pageDict = pageObj.getDict(); > rotate = page->getRotate(); >- PDFRectangle *pagebox; >+ const PDFRectangle *pagebox; > // write the Page header > pdf_puts("/Type /XObject\n"); > pdf_puts("/Subtype /Form\n"); >@@ -886,7 +865,7 @@ void write_epdf(void) > pdf_printf("/%s.PageNumber %i\n", pdfkeyprefix, (int) epdf_selected_page); > } > if ((suppress_ptex_info & MASK_SUPPRESS_PTEX_INFODICT) == 0) { >- pdf_doc->doc->getDocInfoNF(&info); >+ info = pdf_doc->doc->getDocInfoNF().copy(); > if (info.isRef()) { > // the info dict must be indirect (PDF Ref p. 61) > pdf_printf("/%s.InfoDict ", pdfkeyprefix); >@@ -942,14 +921,14 @@ void write_epdf(void) > pdf_puts(stripzeros(s)); > > // Metadata validity check (as a stream it must be indirect) >- pageDict->lookupNF("Metadata", &dictObj); >- if (!dictObj->isNull() && !dictObj->isRef()) >+ dictObj = pageDict->lookupNF("Metadata").copy(); >+ if (!dictObj.isNull() && !dictObj.isRef()) > pdftex_warn("PDF inclusion: /Metadata must be indirect object"); > > // copy selected items in Page dictionary except Resources & Group > for (i = 0; pageDictKeys[i] != NULL; i++) { >- pageDict->lookupNF(pageDictKeys[i], &dictObj); >- if (!dictObj->isNull()) { >+ dictObj = pageDict->lookupNF(pageDictKeys[i]).copy(); >+ if (!dictObj.isNull()) { > pdf_newline(); > pdf_printf("/%s ", pageDictKeys[i]); > copyObject(&dictObj); // preserves indirection >@@ -957,8 +936,8 @@ void write_epdf(void) > } > > // handle page group >- pageDict->lookupNF("Group", &dictObj); >- if (!dictObj->isNull()) { >+ dictObj = pageDict->lookupNF("Group").copy(); >+ if (!dictObj.isNull()) { > if (pdfpagegroupval == 0) { > // another pdf with page group was included earlier on the > // same page; copy the Group entry as is. See manual for >@@ -972,11 +951,36 @@ void write_epdf(void) > copyObject(&dictObj); > } else { > // write Group dict as a separate object, since the Page dict also refers to it >- pageDict->lookup("Group", &dictObj); >- if (!dictObj->isDict()) >+ dictObj = pageDict->lookup("Group"); >+ if (!dictObj.isDict()) > pdftex_fail("PDF inclusion: /Group dict missing"); > writeSepGroup = true; >- initDictFromDict(groupDict, page->getGroup()); >+/* >+This part is only a single line >+ groupDict = Object(page->getGroup()); >+in the original patch. In this case, however, pdftex crashes at >+"delete pdf_doc->doc" in "delete_document()" for inclusion of some >+kind of pdf images, for example, figure_missing.pdf in gnuplot. >+A change >+ groupDict = Object(page->getGroup()).copy(); >+does not improve the situation. >+The changes below seem to work fine. >+*/ >+// begin modification >+ groupDict = pageDict->lookup("Group"); >+ const Dict& dic1 = page->getGroup(); >+ const Dict& dic2 = groupDict.getDict(); >+ // replace dic2 in groupDict with dic1 >+ l = dic2.getLength(); >+ for (i = 0; i < l; i++) { >+ groupDict.dictRemove(dic2.getKey(i)); >+ } >+ l = dic1.getLength(); >+ for (i = 0; i < l; i++) { >+ groupDict.dictAdd((const char *)copyString(dic1.getKey(i)), >+ dic1.getValNF(i).copy()); >+ } >+// end modification > pdf_printf("/Group %ld 0 R\n", (long)pdfpagegroupval); > } > } >@@ -989,28 +993,28 @@ void write_epdf(void) > pdftex_warn > ("PDF inclusion: /Resources missing. 'This practice is not recommended' (PDF Ref)"); > } else { >- initDictFromDict(obj1, page->getResourceDict()); >+ Object *obj1 = page->getResourceDictObject(); > if (!obj1->isDict()) > pdftex_fail("PDF inclusion: invalid resources dict type <%s>", > obj1->getTypeName()); > pdf_newline(); > pdf_puts("/Resources <<\n"); > for (i = 0, l = obj1->dictGetLength(); i < l; ++i) { >- obj1->dictGetVal(i, &obj2); >- key = obj1->dictGetKey(i); >+ obj2 = obj1->dictGetVal(i); >+ key = (char *)obj1->dictGetKey(i); > if (strcmp("Font", key) == 0) > copyFontResources(&obj2); > else if (strcmp("ProcSet", key) == 0) > copyProcSet(&obj2); > else >- copyOtherResources(&obj2, key); >+ copyOtherResources(&obj2, (char *)key); > } > pdf_puts(">>\n"); > } > > // write the page contents >- page->getContents(&contents); >- if (contents->isStream()) { >+ contents = page->getContents(); >+ if (contents.isStream()) { > > // Variant A: get stream and recompress under control > // of \pdfcompresslevel >@@ -1021,36 +1025,35 @@ void write_epdf(void) > > // Variant B: copy stream without recompressing > // >- contents->streamGetDict()->lookup("F", &obj1); >- if (!obj1->isNull()) { >+ obj1 = contents.streamGetDict()->lookup("F"); >+ if (!obj1.isNull()) { > pdftex_fail("PDF inclusion: Unsupported external stream"); > } >- contents->streamGetDict()->lookup("Length", &obj1); >- assert(!obj1->isNull()); >+ obj1 = contents.streamGetDict()->lookup("Length"); >+ assert(!obj1.isNull()); > pdf_puts("/Length "); > copyObject(&obj1); > pdf_puts("\n"); >- contents->streamGetDict()->lookup("Filter", &obj1); >- if (!obj1->isNull()) { >+ obj1 = contents.streamGetDict()->lookup("Filter"); >+ if (!obj1.isNull()) { > pdf_puts("/Filter "); > copyObject(&obj1); > pdf_puts("\n"); >- contents->streamGetDict()->lookup("DecodeParms", &obj1); >- if (!obj1->isNull()) { >+ obj1 = contents.streamGetDict()->lookup("DecodeParms"); >+ if (!obj1.isNull()) { > pdf_puts("/DecodeParms "); > copyObject(&obj1); > pdf_puts("\n"); > } > } > pdf_puts(">>\nstream\n"); >- copyStream(contents->getStream()->getUndecodedStream()); >+ copyStream(contents.getStream()->getUndecodedStream()); > pdfendstream(); >- } else if (contents->isArray()) { >+ } else if (contents.isArray()) { > pdfbeginstream(); >- for (i = 0, l = contents->arrayGetLength(); i < l; ++i) { >- Object contentsobj; >- copyStream((contents->arrayGet(i, &contentsobj))->getStream()); >- contentsobj.free(); >+ for (i = 0, l = contents.arrayGetLength(); i < l; ++i) { >+ Object contentsobj = contents.arrayGet(i); >+ copyStream(contentsobj.getStream()); > if (i < l - 1) > pdf_newline(); // add a newline after each stream except the last > } >@@ -1104,7 +1107,5 @@ void epdf_check_mem() > n = p->next; > delete_document(p); > } >- // see above for globalParams >- delete globalParams; > } > } >diff --git a/pdftosrc.cc b/pdftosrc.cc >index 67be229..950e14f 100644 >--- a/texk/web2c/pdftexdir/pdftosrc.cc >+++ b/texk/web2c/pdftexdir/pdftosrc.cc >@@ -16,6 +16,14 @@ GNU General Public License for more details. > You should have received a copy of the GNU General Public License along > with this program. If not, see <http://www.gnu.org/licenses/>. > */ >+ >+/* >+This is based on the patch texlive-poppler-0.59.patch <2017-09-19> at >+https://git.archlinux.org/svntogit/packages.git/plain/texlive-bin/trunk >+by Arch Linux. The poppler should be 0.83.0 or newer versions. >+POPPLER_VERSION should be defined. >+*/ >+ > #include <w2c/config.h> > > #include <stdlib.h> >@@ -32,10 +40,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. > #include <goo/gmem.h> > #include <goo/gfile.h> > #else >-#include <aconf.h> >-#include <GString.h> >-#include <gmem.h> >-#include <gfile.h> >+#error POPPLER_VERSION should be defined. > #endif > #include <assert.h> > >@@ -74,7 +79,7 @@ int main(int argc, char *argv[]) > exit(1); > } > fileName = new GString(argv[1]); >- globalParams = new GlobalParams(); >+ globalParams = std::make_unique<GlobalParams>(); > doc = new PDFDoc(fileName); > if (!doc->isOk()) { > fprintf(stderr, "Invalid PDF file\n"); >@@ -86,36 +91,34 @@ int main(int argc, char *argv[]) > objgen = atoi(argv[3]); > } > xref = doc->getXRef(); >- catalogDict.initNull(); >- xref->getCatalog(&catalogDict); >+ catalogDict = xref->getCatalog(); > if (!catalogDict.isDict("Catalog")) { > fprintf(stderr, "No Catalog found\n"); > exit(1); > } >- srcStream.initNull(); >+ srcStream = Object(objNull); > if (objnum == 0) { >- catalogDict.dictLookup("SourceObject", &srcStream); >- static char const_SourceFile[] = "SourceFile"; >- if (!srcStream.isStream(const_SourceFile)) { >+ srcStream = catalogDict.dictLookup("SourceObject"); >+ static const char *const_SourceFile = "SourceFile"; >+ if (!srcStream.isDict(const_SourceFile)) { > fprintf(stderr, "No SourceObject found\n"); > exit(1); > } >- srcName.initNull(); >- srcStream.getStream()->getDict()->lookup("SourceName", &srcName); >+ srcName = srcStream.getStream()->getDict()->lookup("SourceName"); > if (!srcName.isString()) { > fprintf(stderr, "No SourceName found\n"); > exit(1); > } >- outname = srcName.getString()->getCString(); >+ outname = (char *)srcName.getString()->c_str(); > // We cannot free srcName, as objname shares its string. > // srcName.free(); > } else if (objnum > 0) { >- xref->fetch(objnum, objgen, &srcStream); >+ srcStream = xref->fetch(objnum, objgen); > if (!srcStream.isStream()) { > fprintf(stderr, "Not a Stream object\n"); > exit(1); > } >- sprintf(buf, "%s", fileName->getCString()); >+ sprintf(buf, "%s", fileName->c_str()); > if ((p = strrchr(buf, '.')) == 0) > p = strchr(buf, 0); > if (objgen == 0) >@@ -125,7 +128,7 @@ int main(int argc, char *argv[]) > outname = buf; > } else { // objnum < 0 means we are extracting the XRef table > extract_xref_table = true; >- sprintf(buf, "%s", fileName->getCString()); >+ sprintf(buf, "%s", fileName->c_str()); > if ((p = strrchr(buf, '.')) == 0) > p = strchr(buf, 0); > sprintf(p, ".xref"); >@@ -158,36 +161,28 @@ int main(int argc, char *argv[]) > Object objStr, obj1, obj2; > int nObjects, first, n; > int localOffset = 0; >- Guint firstOffset; >+ unsigned int firstOffset; > >- assert(xref->fetch(e->offset, 0, &objStr)->isStream()); >- nObjects = objStr.streamGetDict()->lookup("N", &obj1)->getInt(); >- obj1.free(); >- first = objStr.streamGetDict()->lookup("First", &obj1)->getInt(); >- obj1.free(); >+ objStr = xref->fetch(e->offset, 0); >+ assert(objStr.isStream()); >+ obj1 = objStr.streamGetDict()->lookup("N"); >+ nObjects = obj1.getInt(); >+ obj1 = objStr.streamGetDict()->lookup("First"); >+ first = obj1.getInt(); > firstOffset = objStr.getStream()->getBaseStream()->getStart() + first; > > // parse the header: object numbers and offsets > objStr.streamReset(); >- obj1.initNull(); >- str = new EmbedStream(objStr.getStream(), &obj1, gTrue, first); >- lexer = new Lexer(xref, str); >- parser = new Parser(xref, lexer, gFalse); >+ str = new EmbedStream(objStr.getStream(), Object(objNull), true, first); >+ parser = new Parser(xref, str, false); > for (n = 0; n < nObjects; ++n) { >- parser->getObj(&obj1); >- parser->getObj(&obj2); >+ obj1 = parser->getObj(); >+ obj2 = parser->getObj(); > if (n == e->gen) > localOffset = obj2.getInt(); >- obj1.free(); >- obj2.free(); > } >-#if defined(POPPLER_VERSION) || defined(XPDF304) > while (str->getChar() != EOF) ; >-#else /* xpdf 4.00 */ >- lexer->skipToEOF(); >-#endif > delete parser; >- objStr.free(); > > fprintf(outfile, "%.10lu 00000 n\n", > (long unsigned)(firstOffset + localOffset)); >@@ -198,7 +193,6 @@ int main(int argc, char *argv[]) > s->reset(); > while ((c = s->getChar()) != EOF) > fputc(c, outfile); >- srcStream.free(); > } > if (objnum == 0) > fprintf(stderr, "Source file extracted to %s\n", outname); >@@ -207,7 +201,5 @@ int main(int argc, char *argv[]) > else > fprintf(stderr, "Cross-reference table extracted to %s\n", outname); > fclose(outfile); >- catalogDict.free(); > delete doc; >- delete globalParams; > } >-- >2.24.1
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 703788
:
600606
|
600636