diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2017-11-03 00:10:02 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2017-11-03 00:10:02 +0000 |
| commit | d2df0412f728dd5bb54537dfdfe7c35b34d40e0e (patch) | |
| tree | e2703384779e83312c456399999997fcc289c5cf /src/extension/internal | |
| parent | Merge branch 'master' into powerpencil (diff) | |
| parent | change assignment to equality (diff) | |
| download | inkscape-d2df0412f728dd5bb54537dfdfe7c35b34d40e0e.tar.gz inkscape-d2df0412f728dd5bb54537dfdfe7c35b34d40e0e.zip | |
Merge branch 'master' into powerpencil
Diffstat (limited to 'src/extension/internal')
| -rw-r--r-- | src/extension/internal/bitmap/imagemagick.cpp | 32 | ||||
| -rw-r--r-- | src/extension/internal/cairo-render-context.cpp | 14 | ||||
| -rw-r--r-- | src/extension/internal/cairo-render-context.h | 2 | ||||
| -rw-r--r-- | src/extension/internal/cairo-renderer.cpp | 11 | ||||
| -rw-r--r-- | src/extension/internal/gdkpixbuf-input.cpp | 18 | ||||
| -rw-r--r-- | src/extension/internal/makefile.in | 17 | ||||
| -rw-r--r-- | src/extension/internal/pdfinput/pdf-input.cpp | 6 | ||||
| -rw-r--r-- | src/extension/internal/pdfinput/pdf-parser.cpp | 521 | ||||
| -rw-r--r-- | src/extension/internal/svg.cpp | 83 |
9 files changed, 586 insertions, 118 deletions
diff --git a/src/extension/internal/bitmap/imagemagick.cpp b/src/extension/internal/bitmap/imagemagick.cpp index cc5b3d1bc..352271e26 100644 --- a/src/extension/internal/bitmap/imagemagick.cpp +++ b/src/extension/internal/bitmap/imagemagick.cpp @@ -39,7 +39,7 @@ namespace Bitmap { class ImageMagickDocCache: public Inkscape::Extension::Implementation::ImplementationDocumentCache { friend class ImageMagick; private: - void readImage(char const *xlink, Magick::Image *image); + void readImage(char const *xlink, char const *id, Magick::Image *image); protected: Inkscape::XML::Node** _nodes; @@ -85,11 +85,12 @@ ImageMagickDocCache::ImageMagickDocCache(Inkscape::UI::View::View * view) : { _nodes[_imageCount] = node; char const *xlink = node->attribute("xlink:href"); + char const *id = node->attribute("id"); _originals[_imageCount] = xlink; _caches[_imageCount] = (char*)""; _cacheLengths[_imageCount] = 0; _images[_imageCount] = new Magick::Image(); - readImage(xlink, _images[_imageCount]); + readImage(xlink, id, _images[_imageCount]); _imageItems[_imageCount] = item; _imageCount++; } @@ -113,26 +114,33 @@ ImageMagickDocCache::~ImageMagickDocCache ( ) { } void -ImageMagickDocCache::readImage(const char *xlink, Magick::Image *image) +ImageMagickDocCache::readImage(const char *xlink, const char *id, Magick::Image *image) { // Find if the xlink:href is base64 data, i.e. if the image is embedded - char *search = (char *) g_strndup(xlink, 30); + gchar *search = g_strndup(xlink, 30); if (strstr(search, "base64") != (char*)NULL) { // 7 = strlen("base64") + strlen(",") const char* pureBase64 = strstr(xlink, "base64") + 7; Magick::Blob blob; blob.base64(pureBase64); - image->read(blob); - } - else { - const gchar *path = xlink; - if (strncmp (xlink,"file:", 5) == 0) { - path = g_filename_from_uri(xlink, NULL, NULL); + try { + image->read(blob); + } catch (Magick::Exception &error_) { + g_warning("ImageMagick could not read '%s'\nDetails: %s", id, error_.what()); + } + } else { + gchar *path; + if (strncmp (xlink,"file:", 5) == 0) { + path = g_filename_from_uri(xlink, NULL, NULL); + } else { + path = g_strdup(xlink); } - try { image->read(path); - } catch (...) {} + } catch (Magick::Exception &error_) { + g_warning("ImageMagick could not read '%s' from '%s'\nDetails: %s", id, path, error_.what()); + } + g_free(path); } g_free(search); } diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index c513744a8..3edb58a13 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -163,10 +163,10 @@ CairoRenderState* CairoRenderContext::getCurrentState(void) const CairoRenderState* CairoRenderContext::getParentState(void) const { // if this is the root node just return it - if (g_slist_length(_state_stack) == 1) { + if (_state_stack.size() == 1) { return _state; } else { - return static_cast<CairoRenderState *>(g_slist_nth_data(_state_stack, 1)); + return _state_stack[_state_stack.size()-2]; } } @@ -975,7 +975,7 @@ void CairoRenderContext::pushState(void) CairoRenderState *new_state = _createState(); // copy current state's transform new_state->transform = _state->transform; - _state_stack = g_slist_prepend(_state_stack, new_state); + _state_stack.push_back(new_state); _state = new_state; } @@ -985,11 +985,11 @@ void CairoRenderContext::popState(void) cairo_restore(_cr); - g_free(_state_stack->data); - _state_stack = g_slist_remove_link(_state_stack, _state_stack); - _state = static_cast<CairoRenderState*>(_state_stack->data); + g_free(_state_stack.back()); + _state_stack.pop_back(); - g_assert( g_slist_length(_state_stack) > 0 ); + g_assert( !_state_stack.empty()); + _state = _state_stack.back(); } static bool pattern_hasItemChildren(SPPattern *pat) diff --git a/src/extension/internal/cairo-render-context.h b/src/extension/internal/cairo-render-context.h index 9b976fd6d..be5169a74 100644 --- a/src/extension/internal/cairo-render-context.h +++ b/src/extension/internal/cairo-render-context.h @@ -198,7 +198,7 @@ protected: unsigned int _clip_rule : 8; unsigned int _clip_winding_failed : 1; - GSList *_state_stack; + std::vector<CairoRenderState *> _state_stack; CairoRenderState *_state; // the current state CairoRenderer *_renderer; diff --git a/src/extension/internal/cairo-renderer.cpp b/src/extension/internal/cairo-renderer.cpp index a2b8fb22f..116364739 100644 --- a/src/extension/internal/cairo-renderer.cpp +++ b/src/extension/internal/cairo-renderer.cpp @@ -27,7 +27,6 @@ #include <signal.h> #include <errno.h> -#include <boost/scoped_ptr.hpp> #include "libnrtype/Layout-TNG.h" #include <2geom/transforms.h> @@ -121,13 +120,12 @@ CairoRenderer::createContext(void) CairoRenderContext *new_context = new CairoRenderContext(this); g_assert( new_context != NULL ); - new_context->_state_stack = NULL; new_context->_state = NULL; // create initial render state CairoRenderState *state = new_context->_createState(); state->transform = Geom::identity(); - new_context->_state_stack = g_slist_prepend(new_context->_state_stack, state); + new_context->_state_stack.push_back(state); new_context->_state = state; return new_context; @@ -517,20 +515,17 @@ static void sp_asbitmap_render(SPItem *item, CairoRenderContext *ctx) // Do the export SPDocument *document = item->document; - GSList *items = NULL; - items = g_slist_append(items, item); - boost::scoped_ptr<Inkscape::Pixbuf> pb( + std::unique_ptr<Inkscape::Pixbuf> pb( sp_generate_internal_bitmap(document, NULL, bbox->min()[Geom::X], bbox->min()[Geom::Y], bbox->max()[Geom::X], bbox->max()[Geom::Y], - width, height, res, res, (guint32) 0xffffff00, items )); + width, height, res, res, (guint32) 0xffffff00, item )); if (pb) { //TEST(gdk_pixbuf_save( pb, "bitmap.png", "png", NULL, NULL )); ctx->renderImage(pb.get(), t, item->style); } - g_slist_free (items); } diff --git a/src/extension/internal/gdkpixbuf-input.cpp b/src/extension/internal/gdkpixbuf-input.cpp index e0dc90981..26e6531dd 100644 --- a/src/extension/internal/gdkpixbuf-input.cpp +++ b/src/extension/internal/gdkpixbuf-input.cpp @@ -1,6 +1,7 @@ #include <gdk-pixbuf/gdk-pixbuf.h> +#include <gdkmm/pixbuf.h> +#include <gdkmm/pixbufformat.h> -#include <boost/scoped_ptr.hpp> #include <glib/gprintf.h> #include <glibmm/i18n.h> #include "dir-util.h" @@ -63,7 +64,7 @@ GdkpixbufInput::open(Inkscape::Extension::Input *mod, char const *uri) bool embed = ( link.compare( "embed" ) == 0 ); SPDocument *doc = NULL; - boost::scoped_ptr<Inkscape::Pixbuf> pb(Inkscape::Pixbuf::create_from_file(uri)); + std::unique_ptr<Inkscape::Pixbuf> pb(Inkscape::Pixbuf::create_from_file(uri)); // TODO: the pixbuf is created again from the base64-encoded attribute in SPImage. // Find a way to create the pixbuf only once. @@ -163,14 +164,9 @@ GdkpixbufInput::open(Inkscape::Extension::Input *mod, char const *uri) void GdkpixbufInput::init(void) { - GSList * formatlist, * formatlisthead; - - /* \todo I'm not sure if I need to free this list */ - for (formatlist = formatlisthead = gdk_pixbuf_get_formats(); - formatlist != NULL; - formatlist = g_slist_next(formatlist)) { - - GdkPixbufFormat *pixformat = (GdkPixbufFormat *)formatlist->data; + static std::vector< Gdk::PixbufFormat > formatlist = Gdk::Pixbuf::get_formats(); + for (auto i: formatlist) { + GdkPixbufFormat *pixformat = i.gobj(); gchar *name = gdk_pixbuf_format_get_name(pixformat); gchar *description = gdk_pixbuf_format_get_description(pixformat); @@ -240,8 +236,6 @@ GdkpixbufInput::init(void) g_strfreev(mimetypes); g_strfreev(extensions); } - - g_slist_free(formatlisthead); } } } } /* namespace Inkscape, Extension, Implementation */ diff --git a/src/extension/internal/makefile.in b/src/extension/internal/makefile.in deleted file mode 100644 index 466309a8f..000000000 --- a/src/extension/internal/makefile.in +++ /dev/null @@ -1,17 +0,0 @@ -# Convenience stub makefile to call the real Makefile. - -@SET_MAKE@ - -OBJEXT = @OBJEXT@ - -# Explicit so that it's the default rule. -all: - cd ../.. && $(MAKE) extension/internal/all - -clean %.a %.$(OBJEXT): - cd ../.. && $(MAKE) extension/internal/$@ - -.PHONY: all clean - -.SUFFIXES: -.SUFFIXES: .a .$(OBJEXT) diff --git a/src/extension/internal/pdfinput/pdf-input.cpp b/src/extension/internal/pdfinput/pdf-input.cpp index 844d16c17..6e0ee75aa 100644 --- a/src/extension/internal/pdfinput/pdf-input.cpp +++ b/src/extension/internal/pdfinput/pdf-input.cpp @@ -846,14 +846,20 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) { } // Parse the document structure +#if defined(POPPLER_NEW_OBJECT_API) + Object obj = page->getContents(); +#else Object obj; page->getContents(&obj); +#endif if (!obj.isNull()) { pdf_parser->parse(&obj); } // Cleanup +#if !defined(POPPLER_NEW_OBJECT_API) obj.free(); +#endif delete pdf_parser; delete builder; g_free(docname); diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp index 5ede59bf3..604b7f807 100644 --- a/src/extension/internal/pdfinput/pdf-parser.cpp +++ b/src/extension/internal/pdfinput/pdf-parser.cpp @@ -414,13 +414,21 @@ void PdfParser::parse(Object *obj, GBool topLevel) { if (obj->isArray()) { for (int i = 0; i < obj->arrayGetLength(); ++i) { +#if defined(POPPLER_NEW_OBJECT_API) + obj2 = obj->arrayGet(i); +#else obj->arrayGet(i, &obj2); +#endif if (!obj2.isStream()) { error(errInternal, -1, "Weird page contents"); +#if !defined(POPPLER_NEW_OBJECT_API) obj2.free(); +#endif return; } +#if !defined(POPPLER_NEW_OBJECT_API) obj2.free(); +#endif } } else if (!obj->isStream()) { error(errInternal, -1, "Weird page contents"); @@ -439,7 +447,11 @@ void PdfParser::go(GBool /*topLevel*/) // scan a sequence of objects int numArgs = 0; +#if defined(POPPLER_NEW_OBJECT_API) + obj = parser->getObj(); +#else parser->getObj(&obj); +#endif while (!obj.isEOF()) { // got a command - execute it @@ -457,14 +469,20 @@ void PdfParser::go(GBool /*topLevel*/) // Run the operation execOp(&obj, args, numArgs); +#if !defined(POPPLER_NEW_OBJECT_API) obj.free(); for (int i = 0; i < numArgs; ++i) args[i].free(); +#endif numArgs = 0; // got an argument - save it } else if (numArgs < maxArgs) { +#if defined(POPPLER_NEW_OBJECT_API) + args[numArgs++] = std::move(obj); +#else args[numArgs++] = obj; +#endif // too many arguments - something is wrong } else { @@ -475,13 +493,21 @@ void PdfParser::go(GBool /*topLevel*/) printf("\n"); fflush(stdout); } +#if !defined(POPPLER_NEW_OBJECT_API) obj.free(); +#endif } // grab the next object +#if defined(POPPLER_NEW_OBJECT_API) + obj = parser->getObj(); +#else parser->getObj(&obj); +#endif } +#if !defined(POPPLER_NEW_OBJECT_API) obj.free(); +#endif // args at end with no command if (numArgs > 0) { @@ -495,8 +521,10 @@ void PdfParser::go(GBool /*topLevel*/) printf("\n"); fflush(stdout); } +#if !defined(POPPLER_NEW_OBJECT_API) for (int i = 0; i < numArgs; ++i) args[i].free(); +#endif } } @@ -692,9 +720,13 @@ void PdfParser::opSetDash(Object args[], int /*numArgs*/) if (length != 0) { dash = (double *)gmallocn(length, sizeof(double)); for (int i = 0; i < length; ++i) { +#if defined(POPPLER_NEW_OBJECT_API) + dash[i] = a->get(i).getNum(); +#else Object obj; dash[i] = a->get(i, &obj)->getNum(); obj.free(); +#endif } } state->setLineDash(dash, length, args[1].getNum()); @@ -744,12 +776,18 @@ void PdfParser::opSetExtGState(Object args[], int /*numArgs*/) GBool haveBackdropColor = gFalse; GBool alpha = gFalse; +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj1 = res->lookupGState(args[0].getName())).isNull()) { +#else if (!res->lookupGState(args[0].getName(), &obj1)) { +#endif return; } if (!obj1.isDict()) { error(errSyntaxError, getPos(), "ExtGState '{0:s}' is wrong type"), args[0].getName(); +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif return; } if (printCommands) { @@ -759,7 +797,11 @@ void PdfParser::opSetExtGState(Object args[], int /*numArgs*/) } // transparency support: blend mode, fill/stroke opacity +#if defined(POPPLER_NEW_OBJECT_API) + if (!((obj2 = obj1.dictLookup(const_cast<char*>("BM"))).isNull())) { +#else if (!obj1.dictLookup(const_cast<char*>("BM"), &obj2)->isNull()) { +#endif GfxBlendMode mode = gfxBlendNormal; if (state->parseBlendMode(&obj2, &mode)) { state->setBlendMode(mode); @@ -767,40 +809,71 @@ void PdfParser::opSetExtGState(Object args[], int /*numArgs*/) error(errSyntaxError, getPos(), "Invalid blend mode in ExtGState"); } } +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj2 = obj1.dictLookup(const_cast<char*>("ca"))).isNum()) { +#else obj2.free(); if (obj1.dictLookup(const_cast<char*>("ca"), &obj2)->isNum()) { +#endif state->setFillOpacity(obj2.getNum()); } +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj2 = obj1.dictLookup(const_cast<char*>("CA"))).isNum()) { +#else obj2.free(); if (obj1.dictLookup(const_cast<char*>("CA"), &obj2)->isNum()) { +#endif state->setStrokeOpacity(obj2.getNum()); } +#if !defined(POPPLER_NEW_OBJECT_API) obj2.free(); +#endif // fill/stroke overprint GBool haveFillOP = gFalse; +#if defined(POPPLER_NEW_OBJECT_API) + if ((haveFillOP = (obj2 = obj1.dictLookup(const_cast<char*>("op"))).isBool())) { +#else if ((haveFillOP = (obj1.dictLookup(const_cast<char*>("op"), &obj2)->isBool()))) { +#endif state->setFillOverprint(obj2.getBool()); } +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj2 = obj1.dictLookup(const_cast<char*>("OP"))).isBool()) { +#else obj2.free(); if (obj1.dictLookup(const_cast<char*>("OP"), &obj2)->isBool()) { +#endif state->setStrokeOverprint(obj2.getBool()); if (!haveFillOP) { state->setFillOverprint(obj2.getBool()); } } +#if !defined(POPPLER_NEW_OBJECT_API) obj2.free(); +#endif // stroke adjust +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj2 = obj1.dictLookup(const_cast<char*>("SA"))).isBool()) { +#else if (obj1.dictLookup(const_cast<char*>("SA"), &obj2)->isBool()) { +#endif state->setStrokeAdjust(obj2.getBool()); } +#if !defined(POPPLER_NEW_OBJECT_API) obj2.free(); +#endif // transfer function +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj2 = obj1.dictLookup(const_cast<char*>("TR2"))).isNull()) { + obj2 = obj1.dictLookup(const_cast<char*>("TR")); +#else if (obj1.dictLookup(const_cast<char*>("TR2"), &obj2)->isNull()) { obj2.free(); obj1.dictLookup(const_cast<char*>("TR"), &obj2); +#endif } if (obj2.isName(const_cast<char*>("Default")) || obj2.isName(const_cast<char*>("Identity"))) { @@ -809,9 +882,15 @@ void PdfParser::opSetExtGState(Object args[], int /*numArgs*/) } else if (obj2.isArray() && obj2.arrayGetLength() == 4) { int pos = 4; for (int i = 0; i < 4; ++i) { +#if defined(POPPLER_NEW_OBJECT_API) + obj3 = obj2.arrayGet(i); +#else obj2.arrayGet(i, &obj3); +#endif funcs[i] = Function::parse(&obj3); +#if !defined(POPPLER_NEW_OBJECT_API) obj3.free(); +#endif if (!funcs[i]) { pos = i; break; @@ -828,21 +907,37 @@ void PdfParser::opSetExtGState(Object args[], int /*numArgs*/) } else if (!obj2.isNull()) { error(errSyntaxError, getPos(), "Invalid transfer function in ExtGState"); } +#if !defined(POPPLER_NEW_OBJECT_API) obj2.free(); +#endif // soft mask +#if defined(POPPLER_NEW_OBJECT_API) + if (!((obj2 = obj1.dictLookup(const_cast<char*>("SMask"))).isNull())) { +#else if (!obj1.dictLookup(const_cast<char*>("SMask"), &obj2)->isNull()) { +#endif if (obj2.isName(const_cast<char*>("None"))) { builder->clearSoftMask(state); } else if (obj2.isDict()) { +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj3 = obj2.dictLookup(const_cast<char*>("S"))).isName(const_cast<char*>("Alpha"))) { +#else if (obj2.dictLookup(const_cast<char*>("S"), &obj3)->isName(const_cast<char*>("Alpha"))) { +#endif alpha = gTrue; } else { // "Luminosity" alpha = gFalse; } +#if !defined(POPPLER_NEW_OBJECT_API) obj3.free(); +#endif funcs[0] = NULL; +#if defined(POPPLER_NEW_OBJECT_API) + if (!((obj3 = obj2.dictLookup(const_cast<char*>("TR"))).isNull())) { +#else if (!obj2.dictLookup(const_cast<char*>("TR"), &obj3)->isNull()) { +#endif funcs[0] = Function::parse(&obj3); if (funcs[0]->getInputSize() != 1 || funcs[0]->getOutputSize() != 1) { @@ -851,26 +946,45 @@ void PdfParser::opSetExtGState(Object args[], int /*numArgs*/) funcs[0] = NULL; } } +#if defined(POPPLER_NEW_OBJECT_API) + if ((haveBackdropColor = (obj3 = obj2.dictLookup(const_cast<char*>("BC"))).isArray())) { +#else obj3.free(); if ((haveBackdropColor = obj2.dictLookup(const_cast<char*>("BC"), &obj3)->isArray())) { +#endif for (int i = 0; i < gfxColorMaxComps; ++i) { backdropColor.c[i] = 0; } for (int i = 0; i < obj3.arrayGetLength() && i < gfxColorMaxComps; ++i) { +#if defined(POPPLER_NEW_OBJECT_API) + obj4 = obj3.arrayGet(i); +#else obj3.arrayGet(i, &obj4); +#endif if (obj4.isNum()) { backdropColor.c[i] = dblToCol(obj4.getNum()); } +#if !defined(POPPLER_NEW_OBJECT_API) obj4.free(); +#endif } } +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj3 = obj2.dictLookup(const_cast<char*>("G"))).isStream()) { + if ((obj4 = obj3.streamGetDict()->lookup(const_cast<char*>("Group"))).isDict()) { +#else obj3.free(); if (obj2.dictLookup(const_cast<char*>("G"), &obj3)->isStream()) { if (obj3.streamGetDict()->lookup(const_cast<char*>("Group"), &obj4)->isDict()) { +#endif GfxColorSpace *blendingColorSpace = 0; GBool isolated = gFalse; GBool knockout = gFalse; +#if defined(POPPLER_NEW_OBJECT_API) + if (!((obj5 = obj4.dictLookup(const_cast<char*>("CS"))).isNull())) { +#else if (!obj4.dictLookup(const_cast<char*>("CS"), &obj5)->isNull()) { +#endif #if defined(POPPLER_EVEN_NEWER_NEW_COLOR_SPACE_API) blendingColorSpace = GfxColorSpace::parse(NULL, &obj5, NULL, NULL); #elif defined(POPPLER_EVEN_NEWER_COLOR_SPACE_API) @@ -879,15 +993,25 @@ void PdfParser::opSetExtGState(Object args[], int /*numArgs*/) blendingColorSpace = GfxColorSpace::parse(&obj5, NULL); #endif } +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj5 = obj4.dictLookup(const_cast<char*>("I"))).isBool()) { +#else obj5.free(); if (obj4.dictLookup(const_cast<char*>("I"), &obj5)->isBool()) { +#endif isolated = obj5.getBool(); } +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj5 = obj4.dictLookup(const_cast<char*>("K"))).isBool()) { +#else obj5.free(); if (obj4.dictLookup(const_cast<char*>("K"), &obj5)->isBool()) { +#endif knockout = obj5.getBool(); } +#if !defined(POPPLER_NEW_OBJECT_API) obj5.free(); +#endif if (!haveBackdropColor) { if (blendingColorSpace) { blendingColorSpace->getDefaultColor(&backdropColor); @@ -906,18 +1030,24 @@ void PdfParser::opSetExtGState(Object args[], int /*numArgs*/) } else { error(errSyntaxError, getPos(), "Invalid soft mask in ExtGState - missing group"); } +#if !defined(POPPLER_NEW_OBJECT_API) obj4.free(); +#endif } else { error(errSyntaxError, getPos(), "Invalid soft mask in ExtGState - missing group"); } +#if !defined(POPPLER_NEW_OBJECT_API) obj3.free(); +#endif } else if (!obj2.isNull()) { error(errSyntaxError, getPos(), "Invalid soft mask in ExtGState"); } } +#if !defined(POPPLER_NEW_OBJECT_API) obj2.free(); obj1.free(); +#endif } void PdfParser::doSoftMask(Object *str, GBool alpha, @@ -938,43 +1068,79 @@ void PdfParser::doSoftMask(Object *str, GBool alpha, dict = str->streamGetDict(); // check form type +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("FormType")); +#else dict->lookup(const_cast<char*>("FormType"), &obj1); +#endif if (!(obj1.isNull() || (obj1.isInt() && obj1.getInt() == 1))) { error(errSyntaxError, getPos(), "Unknown form type"); } +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif // get bounding box +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("BBox")); +#else dict->lookup(const_cast<char*>("BBox"), &obj1); +#endif if (!obj1.isArray()) { +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif error(errSyntaxError, getPos(), "Bad form bounding box"); return; } for (i = 0; i < 4; ++i) { +#if defined(POPPLER_NEW_OBJECT_API) + obj2 = obj1.arrayGet(i); +#else obj1.arrayGet(i, &obj2); +#endif bbox[i] = obj2.getNum(); +#if defined(POPPLER_NEW_OBJECT_API) + } +#else obj2.free(); } obj1.free(); +#endif // get matrix +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("Matrix")); +#else dict->lookup(const_cast<char*>("Matrix"), &obj1); +#endif if (obj1.isArray()) { for (i = 0; i < 6; ++i) { +#if defined(POPPLER_NEW_OBJECT_API) + obj2 = obj1.arrayGet(i); +#else obj1.arrayGet(i, &obj2); +#endif m[i] = obj2.getNum(); +#if !defined(POPPLER_NEW_OBJECT_API) obj2.free(); +#endif } } else { m[0] = 1; m[1] = 0; m[2] = 0; m[3] = 1; m[4] = 0; m[5] = 0; } +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif // get resources +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("Resources")); +#else dict->lookup(const_cast<char*>("Resources"), &obj1); +#endif resDict = obj1.isDict() ? obj1.getDict() : (Dict *)NULL; // draw it @@ -987,7 +1153,9 @@ void PdfParser::doSoftMask(Object *str, GBool alpha, if (blendingColorSpace) { delete blendingColorSpace; } +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif } void PdfParser::opSetRenderingIntent(Object /*args*/[], int /*numArgs*/) @@ -1084,7 +1252,11 @@ void PdfParser::opSetFillColorSpace(Object args[], int /*numArgs*/) Object obj; state->setFillPattern(NULL); +#if defined(POPPLER_NEW_OBJECT_API) + obj = res->lookupColorSpace(args[0].getName()); +#else res->lookupColorSpace(args[0].getName(), &obj); +#endif GfxColorSpace *colorSpace = 0; #if defined(POPPLER_EVEN_NEWER_NEW_COLOR_SPACE_API) @@ -1106,7 +1278,9 @@ void PdfParser::opSetFillColorSpace(Object args[], int /*numArgs*/) colorSpace = GfxColorSpace::parse(&obj, NULL); } #endif +#if !defined(POPPLER_NEW_OBJECT_API) obj.free(); +#endif if (colorSpace) { GfxColor color; state->setFillColorSpace(colorSpace); @@ -1125,7 +1299,11 @@ void PdfParser::opSetStrokeColorSpace(Object args[], int /*numArgs*/) GfxColorSpace *colorSpace = 0; state->setStrokePattern(NULL); +#if defined(POPPLER_NEW_OBJECT_API) + obj = res->lookupColorSpace(args[0].getName()); +#else res->lookupColorSpace(args[0].getName(), &obj); +#endif #if defined(POPPLER_EVEN_NEWER_NEW_COLOR_SPACE_API) if (obj.isNull()) { colorSpace = GfxColorSpace::parse(NULL, &args[0], NULL, NULL); @@ -1145,7 +1323,9 @@ void PdfParser::opSetStrokeColorSpace(Object args[], int /*numArgs*/) colorSpace = GfxColorSpace::parse(&obj, NULL); } #endif +#if !defined(POPPLER_NEW_OBJECT_API) obj.free(); +#endif if (colorSpace) { GfxColor color; state->setStrokeColorSpace(colorSpace); @@ -2375,7 +2555,11 @@ void PdfParser::opShowSpaceText(Object args[], int /*numArgs*/) wMode = state->getFont()->getWMode(); a = args[0].getArray(); for (int i = 0; i < a->getLength(); ++i) { +#if defined(POPPLER_NEW_OBJECT_API) + obj = a->get(i); +#else a->get(i, &obj); +#endif if (obj.isNum()) { // this uses the absolute value of the font size to match // Acrobat's behavior @@ -2392,7 +2576,9 @@ void PdfParser::opShowSpaceText(Object args[], int /*numArgs*/) } else { error(errSyntaxError, getPos(), "Element of show/space array must be number or string"); } +#if !defined(POPPLER_NEW_OBJECT_API) obj.free(); +#endif } } @@ -2465,7 +2651,11 @@ void PdfParser::doShowText(GooString *s) { //out->updateCTM(state, 1, 0, 0, 1, 0, 0); if (0){ /*!out->beginType3Char(state, curX + riseX, curY + riseY, tdx, tdy, code, u, uLen)) {*/ +#if defined(POPPLER_NEW_OBJECT_API) + charProc = ((Gfx8BitFont *)font)->getCharProc(code); +#else ((Gfx8BitFont *)font)->getCharProc(code, &charProc); +#endif if ((resDict = ((Gfx8BitFont *)font)->getResources())) { pushResources(resDict); } @@ -2478,7 +2668,9 @@ void PdfParser::doShowText(GooString *s) { if (resDict) { popResources(); } +#if !defined(POPPLER_NEW_OBJECT_API) charProc.free(); +#endif } restoreState(); // GfxState::restore() does *not* restore the current position, @@ -2541,23 +2733,43 @@ void PdfParser::opXObject(Object args[], int /*numArgs*/) Object obj1, obj2, obj3, refObj; char *name = args[0].getName(); +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj1 = res->lookupXObject(name)).isNull()) { +#else if (!res->lookupXObject(name, &obj1)) { +#endif return; } if (!obj1.isStream()) { error(errSyntaxError, getPos(), "XObject '{0:s}' is wrong type", name); +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif return; } +#if defined(POPPLER_NEW_OBJECT_API) + obj2 = obj1.streamGetDict()->lookup(const_cast<char*>("Subtype")); +#else obj1.streamGetDict()->lookup(const_cast<char*>("Subtype"), &obj2); +#endif if (obj2.isName(const_cast<char*>("Image"))) { +#if defined(POPPLER_NEW_OBJECT_API) + refObj = res->lookupXObjectNF(name); +#else res->lookupXObjectNF(name, &refObj); +#endif doImage(&refObj, obj1.getStream(), gFalse); +#if !defined(POPPLER_NEW_OBJECT_API) refObj.free(); +#endif } else if (obj2.isName(const_cast<char*>("Form"))) { doForm(&obj1); } else if (obj2.isName(const_cast<char*>("PS"))) { +#if defined(POPPLER_NEW_OBJECT_API) + obj3 = obj1.streamGetDict()->lookup(const_cast<char*>("Level1")); +#else obj1.streamGetDict()->lookup(const_cast<char*>("Level1"), &obj3); +#endif /* out->psXObject(obj1.getStream(), obj3.isStream() ? obj3.getStream() : (Stream *)NULL);*/ } else if (obj2.isName()) { @@ -2565,8 +2777,10 @@ void PdfParser::opXObject(Object args[], int /*numArgs*/) } else { error(errSyntaxError, getPos(), "XObject subtype is missing or wrong type"); } +#if !defined(POPPLER_NEW_OBJECT_API) obj2.free(); obj1.free(); +#endif } void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) @@ -2593,10 +2807,18 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) dict = str->getDict(); // get size +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("Width")); +#else dict->lookup(const_cast<char*>("Width"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("W")); +#else obj1.free(); dict->lookup(const_cast<char*>("W"), &obj1); +#endif } if (obj1.isInt()){ width = obj1.getInt(); @@ -2607,11 +2829,19 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) else { goto err2; } +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("Height")); +#else obj1.free(); dict->lookup(const_cast<char*>("Height"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("H")); +#else obj1.free(); dict->lookup(const_cast<char*>("H"), &obj1); +#endif } if (obj1.isInt()) { height = obj1.getInt(); @@ -2622,26 +2852,46 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) else { goto err2; } +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif // image interpolation +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup("Interpolate"); +#else dict->lookup("Interpolate", &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup("I"); +#else obj1.free(); dict->lookup("I", &obj1); +#endif } if (obj1.isBool()) interpolate = obj1.getBool(); else interpolate = gFalse; +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif maskInterpolate = gFalse; // image or mask? +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("ImageMask")); +#else dict->lookup(const_cast<char*>("ImageMask"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("IM")); +#else obj1.free(); dict->lookup(const_cast<char*>("IM"), &obj1); +#endif } mask = gFalse; if (obj1.isBool()) { @@ -2650,14 +2900,24 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) else if (!obj1.isNull()) { goto err2; } +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif // bit depth if (bits == 0) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("BitsPerComponent")); +#else dict->lookup(const_cast<char*>("BitsPerComponent"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("BPC")); +#else obj1.free(); dict->lookup(const_cast<char*>("BPC"), &obj1); +#endif } if (obj1.isInt()) { bits = obj1.getInt(); @@ -2666,7 +2926,9 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) } else { goto err2; } +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif } // display a mask @@ -2676,21 +2938,37 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) goto err1; } invert = gFalse; +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("Decode")); +#else dict->lookup(const_cast<char*>("Decode"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("D")); +#else obj1.free(); dict->lookup(const_cast<char*>("D"), &obj1); +#endif } if (obj1.isArray()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj2 = obj1.arrayGet(0); +#else obj1.arrayGet(0, &obj2); +#endif if (obj2.isInt() && obj2.getInt() == 1) { invert = gTrue; } +#if !defined(POPPLER_NEW_OBJECT_API) obj2.free(); +#endif } else if (!obj1.isNull()) { goto err2; } +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif // draw it builder->addImageMask(state, str, width, height, invert, interpolate); @@ -2698,18 +2976,36 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) } else { // get color space and color map GfxColorSpace *colorSpace; +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("ColorSpace")); +#else dict->lookup(const_cast<char*>("ColorSpace"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("CS")); +#else obj1.free(); dict->lookup(const_cast<char*>("CS"), &obj1); +#endif } if (obj1.isName()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj2 = res->lookupColorSpace(obj1.getName()); +#else res->lookupColorSpace(obj1.getName(), &obj2); +#endif if (!obj2.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = std::move(obj2); +#else obj1.free(); obj1 = obj2; +#endif } else { +#if !defined(POPPLER_NEW_OBJECT_API) obj2.free(); +#endif } } if (!obj1.isNull()) { @@ -2729,17 +3025,29 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) } else { colorSpace = NULL; } +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif if (!colorSpace) { goto err1; } +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("Decode")); +#else dict->lookup(const_cast<char*>("Decode"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("D")); +#else obj1.free(); dict->lookup(const_cast<char*>("D"), &obj1); +#endif } GfxImageColorMap *colorMap = new GfxImageColorMap(bits, &obj1, colorSpace); +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif if (!colorMap->isOk()) { delete colorMap; goto err1; @@ -2753,8 +3061,13 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) int maskHeight = 0; maskInvert = gFalse; GfxImageColorMap *maskColorMap = NULL; +#if defined(POPPLER_NEW_OBJECT_API) + maskObj = dict->lookup(const_cast<char*>("Mask")); + smaskObj = dict->lookup(const_cast<char*>("SMask")); +#else dict->lookup(const_cast<char*>("Mask"), &maskObj); dict->lookup(const_cast<char*>("SMask"), &smaskObj); +#endif Dict* maskDict; if (smaskObj.isStream()) { // soft mask @@ -2763,58 +3076,108 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) } maskStr = smaskObj.getStream(); maskDict = smaskObj.streamGetDict(); +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("Width")); +#else maskDict->lookup(const_cast<char*>("Width"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("W")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("W"), &obj1); +#endif } if (!obj1.isInt()) { goto err2; } maskWidth = obj1.getInt(); +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("Height")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("Height"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("H")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("H"), &obj1); +#endif } if (!obj1.isInt()) { goto err2; } maskHeight = obj1.getInt(); +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("BitsPerComponent")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("BitsPerComponent"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("BPC")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("BPC"), &obj1); +#endif } if (!obj1.isInt()) { goto err2; } int maskBits = obj1.getInt(); +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("Interpolate")); +#else obj1.free(); maskDict->lookup("Interpolate", &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("I")); +#else obj1.free(); maskDict->lookup("I", &obj1); +#endif } if (obj1.isBool()) maskInterpolate = obj1.getBool(); else maskInterpolate = gFalse; +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("ColorSpace")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("ColorSpace"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("CS")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("CS"), &obj1); +#endif } if (obj1.isName()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj2 = res->lookupColorSpace(obj1.getName()); +#else res->lookupColorSpace(obj1.getName(), &obj2); +#endif if (!obj2.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = std::move(obj2); +#else obj1.free(); obj1 = obj2; +#endif } else { +#if !defined(POPPLER_NEW_OBJECT_API) obj2.free(); +#endif } } #if defined(POPPLER_EVEN_NEWER_NEW_COLOR_SPACE_API) @@ -2824,17 +3187,29 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) #else GfxColorSpace *maskColorSpace = GfxColorSpace::parse(&obj1, NULL); #endif +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif if (!maskColorSpace || maskColorSpace->getMode() != csDeviceGray) { goto err1; } +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("Decode")); +#else maskDict->lookup(const_cast<char*>("Decode"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("D")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("D"), &obj1); +#endif } maskColorMap = new GfxImageColorMap(maskBits, &obj1, maskColorSpace); +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif if (!maskColorMap->isOk()) { delete maskColorMap; goto err1; @@ -2845,9 +3220,15 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) // color key mask int i; for (i = 0; i < maskObj.arrayGetLength() && i < 2*gfxColorMaxComps; ++i) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskObj.arrayGet(i); +#else maskObj.arrayGet(i, &obj1); +#endif maskColors[i] = obj1.getInt(); +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif } haveColorKeyMask = gTrue; } else if (maskObj.isStream()) { @@ -2857,61 +3238,111 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) } maskStr = maskObj.getStream(); maskDict = maskObj.streamGetDict(); +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("Width")); +#else maskDict->lookup(const_cast<char*>("Width"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("W")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("W"), &obj1); +#endif } if (!obj1.isInt()) { goto err2; } maskWidth = obj1.getInt(); +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("Height")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("Height"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("H")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("H"), &obj1); +#endif } if (!obj1.isInt()) { goto err2; } maskHeight = obj1.getInt(); +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("ImageMask")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("ImageMask"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("IM")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("IM"), &obj1); +#endif } if (!obj1.isBool() || !obj1.getBool()) { goto err2; } +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup("Interpolate"); +#else obj1.free(); maskDict->lookup("Interpolate", &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup("I"); +#else obj1.free(); maskDict->lookup("I", &obj1); +#endif } if (obj1.isBool()) maskInterpolate = obj1.getBool(); else maskInterpolate = gFalse; +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif maskInvert = gFalse; +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("Decode")); +#else maskDict->lookup(const_cast<char*>("Decode"), &obj1); +#endif if (obj1.isNull()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = maskDict->lookup(const_cast<char*>("D")); +#else obj1.free(); maskDict->lookup(const_cast<char*>("D"), &obj1); +#endif } if (obj1.isArray()) { +#if defined(POPPLER_NEW_OBJECT_API) + obj2 = obj1.arrayGet(0); +#else obj1.arrayGet(0, &obj2); +#endif if (obj2.isInt() && obj2.getInt() == 1) { maskInvert = gTrue; } +#if !defined(POPPLER_NEW_OBJECT_API) obj2.free(); +#endif } else if (!obj1.isNull()) { goto err2; } +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif haveExplicitMask = gTrue; } @@ -2929,14 +3360,18 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) } delete colorMap; +#if !defined(POPPLER_NEW_OBJECT_API) maskObj.free(); smaskObj.free(); +#endif } return; err2: +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif err1: error(errSyntaxError, getPos(), "Bad image parameters"); } @@ -2961,52 +3396,97 @@ void PdfParser::doForm(Object *str) { dict = str->streamGetDict(); // check form type +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = dict->lookup(const_cast<char*>("FormType")); +#else dict->lookup(const_cast<char*>("FormType"), &obj1); +#endif if (!(obj1.isNull() || (obj1.isInt() && obj1.getInt() == 1))) { error(errSyntaxError, getPos(), "Unknown form type"); } +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif // get bounding box +#if defined(POPPLER_NEW_OBJECT_API) + bboxObj = dict->lookup(const_cast<char*>("BBox")); +#else dict->lookup(const_cast<char*>("BBox"), &bboxObj); +#endif if (!bboxObj.isArray()) { +#if !defined(POPPLER_NEW_OBJECT_API) bboxObj.free(); +#endif error(errSyntaxError, getPos(), "Bad form bounding box"); return; } for (i = 0; i < 4; ++i) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = bboxObj.arrayGet(i); +#else bboxObj.arrayGet(i, &obj1); +#endif bbox[i] = obj1.getNum(); +#if defined(POPPLER_NEW_OBJECT_API) + } +#else obj1.free(); } bboxObj.free(); +#endif // get matrix +#if defined(POPPLER_NEW_OBJECT_API) + matrixObj = dict->lookup(const_cast<char*>("Matrix")); +#else dict->lookup(const_cast<char*>("Matrix"), &matrixObj); +#endif if (matrixObj.isArray()) { for (i = 0; i < 6; ++i) { +#if defined(POPPLER_NEW_OBJECT_API) + obj1 = matrixObj.arrayGet(i); +#else matrixObj.arrayGet(i, &obj1); +#endif m[i] = obj1.getNum(); +#if !defined(POPPLER_NEW_OBJECT_API) obj1.free(); +#endif } } else { m[0] = 1; m[1] = 0; m[2] = 0; m[3] = 1; m[4] = 0; m[5] = 0; } +#if !defined(POPPLER_NEW_OBJECT_API) matrixObj.free(); +#endif // get resources +#if defined(POPPLER_NEW_OBJECT_API) + resObj = dict->lookup(const_cast<char*>("Resources")); +#else dict->lookup(const_cast<char*>("Resources"), &resObj); +#endif resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL; // check for a transparency group transpGroup = isolated = knockout = gFalse; blendingColorSpace = NULL; +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj1 = dict->lookup(const_cast<char*>("Group"))).isDict()) { + if ((obj2 = obj1.dictLookup(const_cast<char*>("S"))).isName(const_cast<char*>("Transparency"))) { +#else if (dict->lookup(const_cast<char*>("Group"), &obj1)->isDict()) { if (obj1.dictLookup(const_cast<char*>("S"), &obj2)->isName(const_cast<char*>("Transparency"))) { +#endif transpGroup = gTrue; +#if defined(POPPLER_NEW_OBJECT_API) + if (!((obj3 = obj1.dictLookup(const_cast<char*>("CS"))).isNull())) { +#else if (!obj1.dictLookup(const_cast<char*>("CS"), &obj3)->isNull()) { +#endif #if defined(POPPLER_EVEN_NEWER_NEW_COLOR_SPACE_API) blendingColorSpace = GfxColorSpace::parse(NULL, &obj3, NULL, NULL); #elif defined(POPPLER_EVEN_NEWER_COLOR_SPACE_API) @@ -3015,19 +3495,32 @@ void PdfParser::doForm(Object *str) { blendingColorSpace = GfxColorSpace::parse(&obj3, NULL); #endif } +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj3 = obj1.dictLookup(const_cast<char*>("I"))).isBool()) { +#else obj3.free(); if (obj1.dictLookup(const_cast<char*>("I"), &obj3)->isBool()) { +#endif isolated = obj3.getBool(); } +#if defined(POPPLER_NEW_OBJECT_API) + if ((obj3 = obj1.dictLookup(const_cast<char*>("K"))).isBool()) { +#else obj3.free(); if (obj1.dictLookup(const_cast<char*>("K"), &obj3)->isBool()) { +#endif knockout = obj3.getBool(); } +#if defined(POPPLER_NEW_OBJECT_API) + } + } +#else obj3.free(); } obj2.free(); } obj1.free(); +#endif // draw it ++formDepth; @@ -3038,7 +3531,9 @@ void PdfParser::doForm(Object *str) { if (blendingColorSpace) { delete blendingColorSpace; } +#if !defined(POPPLER_NEW_OBJECT_API) resObj.free(); +#endif } void PdfParser::doForm1(Object *str, Dict *resDict, double *matrix, double *bbox, @@ -3166,35 +3661,61 @@ Stream *PdfParser::buildImageStream() { Stream *str; // build dictionary +#if defined(POPPLER_NEW_OBJECT_API) + dict = Object(new Dict(xref)); + obj = parser->getObj(); +#else dict.initDict(xref); parser->getObj(&obj); +#endif while (!obj.isCmd(const_cast<char*>("ID")) && !obj.isEOF()) { if (!obj.isName()) { error(errSyntaxError, getPos(), "Inline image dictionary key must be a name object"); +#if !defined(POPPLER_NEW_OBJECT_API) obj.free(); +#endif } else { key = copyString(obj.getName()); +#if defined(POPPLER_NEW_OBJECT_API) + obj = parser->getObj(); +#else obj.free(); parser->getObj(&obj); +#endif if (obj.isEOF() || obj.isError()) { gfree(key); break; } +#if defined(POPPLER_NEW_OBJECT_API) + dict.dictAdd(key, std::move(obj)); + } + obj = parser->getObj(); +#else dict.dictAdd(key, &obj); } parser->getObj(&obj); +#endif } if (obj.isEOF()) { error(errSyntaxError, getPos(), "End of file in inline image"); +#if !defined(POPPLER_NEW_OBJECT_API) obj.free(); dict.free(); +#endif return NULL; } +#if !defined(POPPLER_NEW_OBJECT_API) obj.free(); +#endif // make stream +#if defined(POPPLER_NEW_OBJECT_API) + str = new EmbedStream(parser->getStream(), dict.copy(), gFalse, 0); + str = str->addFilters(dict.getDict()); +#else str = new EmbedStream(parser->getStream(), &dict, gFalse, 0); str = str->addFilters(&dict); +#endif return str; } diff --git a/src/extension/internal/svg.cpp b/src/extension/internal/svg.cpp index 9cde90519..b05a7c19b 100644 --- a/src/extension/internal/svg.cpp +++ b/src/extension/internal/svg.cpp @@ -17,21 +17,20 @@ #ifdef HAVE_CONFIG_H # include <config.h> #endif + +#include <vector> +#include <giomm/file.h> + #include "sp-object.h" #include "svg.h" #include "file.h" #include "extension/system.h" #include "extension/output.h" -#include <vector> #include "xml/attribute-record.h" #include "xml/simple-document.h" #include "sp-root.h" #include "document.h" -#ifdef WITH_GNOME_VFS -# include <libgnomevfs/gnome-vfs.h> -#endif - namespace Inkscape { namespace Extension { namespace Internal { @@ -157,80 +156,42 @@ Svg::init(void) "</output>\n" "</inkscape-extension>", new Svg()); -#ifdef WITH_GNOME_VFS - gnome_vfs_init(); -#endif - - return; } -#ifdef WITH_GNOME_VFS -#define BUF_SIZE 8192 - -static gchar * -_load_uri (const gchar *uri) -{ - GnomeVFSHandle *handle = NULL; - GnomeVFSFileSize bytes_read; - - gsize bytesRead = 0; - gsize bytesWritten = 0; - GError* error = NULL; - gchar* uri_local = g_filename_from_utf8( uri, -1, &bytesRead, &bytesWritten, &error); - - if ( uri_local == NULL ) { - g_warning( "Error converting filename to locale encoding."); - } - - GnomeVFSResult result = gnome_vfs_open (&handle, uri_local, GNOME_VFS_OPEN_READ); - - if (result != GNOME_VFS_OK) { - g_warning("%s", gnome_vfs_result_to_string(result)); - } - - std::vector<gchar> doc; - while (result == GNOME_VFS_OK) { - gchar buffer[BUF_SIZE]; - result = gnome_vfs_read (handle, buffer, BUF_SIZE, &bytes_read); - doc.insert(doc.end(), buffer, buffer+bytes_read); - } - - return g_strndup(&doc[0], doc.size()); -} -#endif - - /** \return A new document just for you! \brief This function takes in a filename of a SVG document and turns it into a SPDocument. \param mod Module to use - \param uri The path to the file (UTF-8) + \param uri The path or URI to the file (UTF-8) This function is really simple, it just calls sp_document_new... */ SPDocument * Svg::open (Inkscape::Extension::Input */*mod*/, const gchar *uri) { -#ifdef WITH_GNOME_VFS - if (!gnome_vfs_initialized() || gnome_vfs_uri_is_local(gnome_vfs_uri_new(uri))) { - // Use built-in loader instead of VFS for this - return SPDocument::createNewDoc(uri, TRUE); - } - gchar * buffer = _load_uri(uri); - if (buffer == NULL) { - g_warning("Error: Could not open file '%s' with VFS\n", uri); - return NULL; + auto file = Gio::File::create_for_uri(uri); + const auto path = file->get_path(); + + if (!file->get_uri_scheme().empty()) { + if (path.empty()) { + try { + char *contents; + gsize length; + file->load_contents(contents, length); + return SPDocument::createNewDocFromMem(contents, length, 1); + } catch (Gio::Error &e) { + g_warning("Could not load contents of non-local URI %s\n", uri); + return NULL; + } + } else { + uri = path.c_str(); + } } - SPDocument * doc = SPDocument::createNewDocFromMem(buffer, strlen(buffer), 1); - g_free(buffer); - return doc; -#else return SPDocument::createNewDoc(uri, TRUE); -#endif } /** |
