summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2017-12-04 19:11:15 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2017-12-04 19:11:15 +0000
commit220b317b7b41f801aff6c2eb19529f99b4d88196 (patch)
tree4da850b57da40b8c70409f87f865c533b185ec7e /src
parentMinor fixes to remove WIP (diff)
parentCairoRenderer: print warning if rendering failed (diff)
downloadinkscape-220b317b7b41f801aff6c2eb19529f99b4d88196.tar.gz
inkscape-220b317b7b41f801aff6c2eb19529f99b4d88196.zip
Merge branch 'master' into fixSpinButtonAndSliderInLPE
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/extension/internal/cairo-render-context.cpp66
-rw-r--r--src/extension/internal/cairo-render-context.h1
-rw-r--r--src/path-prefix.cpp74
-rw-r--r--src/path-prefix.h106
-rw-r--r--src/prefix.cpp40
-rw-r--r--src/prefix.h7
7 files changed, 164 insertions, 131 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4c56b211d..c6ef78a4f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -233,6 +233,7 @@ set(inkscape_SRC
object-set.cpp
object-snapper.cpp
path-chemistry.cpp
+ path-prefix.cpp
persp3d-reference.cpp
persp3d.cpp
perspective-line.cpp
diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp
index 4869472da..b631f8c04 100644
--- a/src/extension/internal/cairo-render-context.cpp
+++ b/src/extension/internal/cairo-render-context.cpp
@@ -128,8 +128,7 @@ CairoRenderContext::CairoRenderContext(CairoRenderer *parent) :
_renderer(parent),
_render_mode(RENDER_MODE_NORMAL),
_clip_mode(CLIP_MODE_MASK),
- _omittext_state(EMPTY),
- _omittext_missing_pages(0)
+ _omittext_state(EMPTY)
{
}
@@ -885,19 +884,16 @@ CairoRenderContext::finish(bool finish_surface)
if (_vector_based_target && finish_surface)
cairo_show_page(_cr);
- // PDF+TeX Output, see CairoRenderContext::_prepareRenderGraphic()
- while (_omittext_missing_pages > 0) {
- _omittext_missing_pages--;
- g_warning("PDF+TeX output: issuing blank PDF page at end (workaround for previous error)");
- cairo_show_page(_cr);
- }
+ cairo_status_t status = cairo_status(_cr);
+ if (status != CAIRO_STATUS_SUCCESS)
+ g_critical("error while rendering output: %s", cairo_status_to_string(status));
cairo_destroy(_cr);
_cr = NULL;
if (finish_surface)
cairo_surface_finish(_surface);
- cairo_status_t status = cairo_surface_status(_surface);
+ status = cairo_surface_status(_surface);
cairo_surface_destroy(_surface);
_surface = NULL;
@@ -1444,28 +1440,38 @@ CairoRenderContext::_prepareRenderGraphic()
{
// Only PDFLaTeX supports importing a single page of a graphics file,
// so only PDF backend gets interleaved text/graphics
- if (_is_omittext && _target == CAIRO_SURFACE_TYPE_PDF) {
+ if (_is_omittext && _target == CAIRO_SURFACE_TYPE_PDF && _render_mode != RENDER_MODE_CLIP) {
if (_omittext_state == NEW_PAGE_ON_GRAPHIC) {
- if (cairo_get_group_target(_cr) != cairo_get_target(_cr)) {
- // we are in the middle of a group, i. e., between cairo_push_group() and cairo_pop_group().
- // cairo_show_page() has no effect here!
- // To ensure that the the generated TeX source doesn't try to include non-existing pages,
- // we will later output an extra blank page.
- // This is a workaround for bug #1417470.
- g_warning("PDF+TeX output: Found text inside a clipped/masked group. This is not supported, the Z-order will be incorrect. Blank pages will be added to the PDF output to work around bug #1417470.");
- _omittext_missing_pages++;
- } else {
- // no group is active, create new page
- cairo_show_page(_cr);
- // Output missing pages (workaround for the 'if' case above).
- // With this solution, the Z-order is more wrong than necessary.
- // It would be better to print the blank pages first, and then the actual current page.
- // However, this isn't easily possible with cairo.
- while (_omittext_missing_pages > 0) {
- _omittext_missing_pages--;
- g_warning("PDF+TeX output: issuing blank PDF page (workaround for previous error)");
- cairo_show_page(_cr);
- }
+ // better set this immediately (not sure if masks applied during "popLayer" could call
+ // this function, too, triggering the same code again in error
+ _omittext_state = GRAPHIC_ON_TOP;
+
+ // As we can not emit the page in the middle of a layer (aka group) - it will not be fully painted yet! -
+ // the following basically mirrors the calls in CairoRenderer::renderItem (but in reversed order)
+ // - first traverse all saved states in reversed order (i.e. from deepest nesting to the top)
+ // and apply clipping / masking to layers on the way (this is done in popLayer)
+ // - then emit the page using cairo_show_page()
+ // - finally restore the previous state with proper transforms and appropriate layers again
+ //
+ // TODO: While this appears to be an ugly hack it seems to work
+ // Somebody with a more intimate understanding of cairo and the renderer implementation might
+ // be able to implement this in a cleaner way, though.
+ int stack_size = _state_stack.size();
+ for (int i = stack_size-1; i > 0; i--) {
+ if (_state_stack[i]->need_layer)
+ popLayer();
+ cairo_restore(_cr);
+ _state = _state_stack[i-1];
+ }
+
+ cairo_show_page(_cr);
+
+ for (int i = 1; i < stack_size; i++) {
+ cairo_save(_cr);
+ _state = _state_stack[i];
+ if (_state->need_layer)
+ pushLayer();
+ setTransform(_state->transform);
}
}
_omittext_state = GRAPHIC_ON_TOP;
diff --git a/src/extension/internal/cairo-render-context.h b/src/extension/internal/cairo-render-context.h
index a0ca2665b..f75d05ea7 100644
--- a/src/extension/internal/cairo-render-context.h
+++ b/src/extension/internal/cairo-render-context.h
@@ -207,7 +207,6 @@ protected:
CairoClipMode _clip_mode;
CairoOmitTextPageState _omittext_state;
- int _omittext_missing_pages;
cairo_pattern_t *_createPatternForPaintServer(SPPaintServer const *const paintserver,
Geom::OptRect const &pbox, float alpha);
diff --git a/src/path-prefix.cpp b/src/path-prefix.cpp
new file mode 100644
index 000000000..87b756eb4
--- /dev/null
+++ b/src/path-prefix.cpp
@@ -0,0 +1,74 @@
+/*
+ * path-prefix.cpp - Inkscape specific prefix handling
+ *
+ * Authors:
+ * Eduard Braun <eduard.braun2@gmx.de>
+ *
+ * Copyright (C) 2017 Authors
+ *
+ * This file is part of Inkscape.
+ *
+ * Inkscape is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * See the file COPYING for details.
+ *
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include <glib.h>
+#include "path-prefix.h"
+
+
+/**
+ * Determine the location of the Inkscape data directory (typically the share/ folder
+ * from where Inkscape should be loading resources) and append a relative path
+ *
+ * - by default use the compile time value of INKSCAPE_DATADIR
+ * - on Windows inkscape_datadir will be relative to the called executable by default
+ * (typically inkscape/share but also handles the case where the executable is in a /bin subfolder)
+ * - if the environment variable INKSCAPE_DATADIR is set it will override all of the above
+ */
+char *append_inkscape_datadir(const char *relative_path)
+{
+ static gchar const *inkscape_datadir;
+ if (!inkscape_datadir) {
+ gchar const *datadir_env = g_getenv("INKSCAPE_DATADIR");
+ if (datadir_env) {
+ inkscape_datadir = g_strdup(datadir_env);
+ } else {
+#ifdef _WIN32
+ gchar *module_path = g_win32_get_package_installation_directory_of_module(NULL);
+ inkscape_datadir = g_build_filename(module_path, "share", NULL);
+ g_free(module_path);
+#else
+ inkscape_datadir = INKSCAPE_DATADIR;
+#endif
+ }
+ }
+
+ if (!relative_path) {
+ relative_path = "";
+ }
+
+ return g_build_filename(inkscape_datadir, relative_path, NULL);
+}
+
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/path-prefix.h b/src/path-prefix.h
index d6514d832..b69ad3753 100644
--- a/src/path-prefix.h
+++ b/src/path-prefix.h
@@ -18,9 +18,13 @@
#endif
#include "prefix.h"
-//#ifdef __cplusplus
-//extern "C" {
-//#endif /* __cplusplus */
+
+char *append_inkscape_datadir(const char *relative_path);
+
+#ifdef _WIN32
+#undef INKSCAPE_DATADIR
+#define INKSCAPE_DATADIR append_inkscape_datadir(NULL)
+#endif
#ifdef ENABLE_BINRELOC
/* The way that we're building now is with a shared library between Inkscape
@@ -52,30 +56,30 @@
# define CREATE_PALETTESDIR BR_DATADIR( INKSCAPE_LIBPREFIX "/share/create/swatches" )
# define CREATE_PATTERNSDIR BR_DATADIR( INKSCAPE_LIBPREFIX "/share/create/patterns/vector" )
#else
-# ifdef WIN32
-# define INKSCAPE_APPICONDIR WIN32_DATADIR("pixmaps")
-# define INKSCAPE_ATTRRELDIR WIN32_DATADIR("attributes")
-# define INKSCAPE_BINDDIR WIN32_DATADIR("bind")
-# define INKSCAPE_EXAMPLESDIR WIN32_DATADIR("examples")
-# define INKSCAPE_EXTENSIONDIR WIN32_DATADIR("extensions")
-# define INKSCAPE_FILTERDIR WIN32_DATADIR("filters")
-# define INKSCAPE_FONTSDIR WIN32_DATADIR("fonts")
-# define INKSCAPE_GRADIENTSDIR WIN32_DATADIR("gradients")
-# define INKSCAPE_KEYSDIR WIN32_DATADIR("keys")
-# define INKSCAPE_PIXMAPDIR WIN32_DATADIR("icons")
-# define INKSCAPE_MARKERSDIR WIN32_DATADIR("markers")
-# define INKSCAPE_PALETTESDIR WIN32_DATADIR("palettes")
-# define INKSCAPE_PATTERNSDIR WIN32_DATADIR("patterns")
-# define INKSCAPE_SCREENSDIR WIN32_DATADIR("screens")
-# define INKSCAPE_SYMBOLSDIR WIN32_DATADIR("symbols")
-# define INKSCAPE_THEMEDIR INKSCAPE_PIXMAPDIR
-# define INKSCAPE_TUTORIALSDIR WIN32_DATADIR("tutorials")
-# define INKSCAPE_TEMPLATESDIR WIN32_DATADIR("templates")
-# define INKSCAPE_UIDIR WIN32_DATADIR("ui")
+# ifdef _WIN32
+# define INKSCAPE_APPICONDIR append_inkscape_datadir("pixmaps")
+# define INKSCAPE_ATTRRELDIR append_inkscape_datadir("attributes")
+# define INKSCAPE_BINDDIR append_inkscape_datadir("bind")
+# define INKSCAPE_EXAMPLESDIR append_inkscape_datadir("examples")
+# define INKSCAPE_EXTENSIONDIR append_inkscape_datadir("extensions")
+# define INKSCAPE_FILTERDIR append_inkscape_datadir("filters")
+# define INKSCAPE_FONTSDIR append_inkscape_datadir("fonts")
+# define INKSCAPE_GRADIENTSDIR append_inkscape_datadir("gradients")
+# define INKSCAPE_KEYSDIR append_inkscape_datadir("keys")
+# define INKSCAPE_PIXMAPDIR append_inkscape_datadir("icons")
+# define INKSCAPE_MARKERSDIR append_inkscape_datadir("markers")
+# define INKSCAPE_PALETTESDIR append_inkscape_datadir("palettes")
+# define INKSCAPE_PATTERNSDIR append_inkscape_datadir("patterns")
+# define INKSCAPE_SCREENSDIR append_inkscape_datadir("screens")
+# define INKSCAPE_SYMBOLSDIR append_inkscape_datadir("symbols")
+# define INKSCAPE_THEMEDIR append_inkscape_datadir("icons")
+# define INKSCAPE_TUTORIALSDIR append_inkscape_datadir("tutorials")
+# define INKSCAPE_TEMPLATESDIR append_inkscape_datadir("templates")
+# define INKSCAPE_UIDIR append_inkscape_datadir("ui")
//CREATE V0.1 WIN32 support
-# define CREATE_GRADIENTSDIR WIN32_DATADIR("create\\gradients\\gimp")
-# define CREATE_PALETTESDIR WIN32_DATADIR("create\\swatches")
-# define CREATE_PATTERNSDIR WIN32_DATADIR("create\\patterns\\vector")
+# define CREATE_GRADIENTSDIR append_inkscape_datadir("create\\gradients\\gimp")
+# define CREATE_PALETTESDIR append_inkscape_datadir("create\\swatches")
+# define CREATE_PATTERNSDIR append_inkscape_datadir("create\\patterns\\vector")
# elif defined ENABLE_OSX_APP_LOCATIONS
# define INKSCAPE_APPICONDIR "Contents/Resources/share/pixmaps"
# define INKSCAPE_ATTRRELDIR "Contents/Resources/share/inkscape/attributes"
@@ -101,34 +105,30 @@
# define CREATE_PALETTESDIR "/Library/Application Support/create/swatches"
# define CREATE_PATTERNSDIR "/Library/Application Support/create/patterns/vector"
# else
-# define INKSCAPE_APPICONDIR INKSCAPE_DATADIR "/pixmaps"
-# define INKSCAPE_ATTRRELDIR INKSCAPE_DATADIR "/inkscape/attributes"
-# define INKSCAPE_BINDDIR INKSCAPE_DATADIR "/inkscape/bind"
-# define INKSCAPE_EXAMPLESDIR INKSCAPE_DATADIR "/inkscape/examples"
-# define INKSCAPE_EXTENSIONDIR INKSCAPE_DATADIR "/inkscape/extensions"
-# define INKSCAPE_FILTERDIR INKSCAPE_DATADIR "/inkscape/filters"
-# define INKSCAPE_FONTSDIR INKSCAPE_DATADIR "/inkscape/fonts"
-# define INKSCAPE_GRADIENTSDIR INKSCAPE_DATADIR "/inkscape/gradients"
-# define INKSCAPE_KEYSDIR INKSCAPE_DATADIR "/inkscape/keys"
-# define INKSCAPE_PIXMAPDIR INKSCAPE_DATADIR "/inkscape/icons"
-# define INKSCAPE_MARKERSDIR INKSCAPE_DATADIR "/inkscape/markers"
-# define INKSCAPE_PALETTESDIR INKSCAPE_DATADIR "/inkscape/palettes"
-# define INKSCAPE_PATTERNSDIR INKSCAPE_DATADIR "/inkscape/patterns"
-# define INKSCAPE_SCREENSDIR INKSCAPE_DATADIR "/inkscape/screens"
-# define INKSCAPE_SYMBOLSDIR INKSCAPE_DATADIR "/inkscape/symbols"
-# define INKSCAPE_THEMEDIR INKSCAPE_DATADIR "/icons"
-# define INKSCAPE_TUTORIALSDIR INKSCAPE_DATADIR "/inkscape/tutorials"
-# define INKSCAPE_TEMPLATESDIR INKSCAPE_DATADIR "/inkscape/templates"
-# define INKSCAPE_UIDIR INKSCAPE_DATADIR "/inkscape/ui"
+# define INKSCAPE_APPICONDIR append_inkscape_datadir("pixmaps")
+# define INKSCAPE_ATTRRELDIR append_inkscape_datadir("inkscape/attributes")
+# define INKSCAPE_BINDDIR append_inkscape_datadir("inkscape/bind")
+# define INKSCAPE_EXAMPLESDIR append_inkscape_datadir("inkscape/examples")
+# define INKSCAPE_EXTENSIONDIR append_inkscape_datadir("inkscape/extensions")
+# define INKSCAPE_FILTERDIR append_inkscape_datadir("inkscape/filters")
+# define INKSCAPE_FONTSDIR append_inkscape_datadir("inkscape/fonts")
+# define INKSCAPE_GRADIENTSDIR append_inkscape_datadir("inkscape/gradients")
+# define INKSCAPE_KEYSDIR append_inkscape_datadir("inkscape/keys")
+# define INKSCAPE_PIXMAPDIR append_inkscape_datadir("inkscape/icons")
+# define INKSCAPE_MARKERSDIR append_inkscape_datadir("inkscape/markers")
+# define INKSCAPE_PALETTESDIR append_inkscape_datadir("inkscape/palettes")
+# define INKSCAPE_PATTERNSDIR append_inkscape_datadir("inkscape/patterns")
+# define INKSCAPE_SCREENSDIR append_inkscape_datadir("inkscape/screens")
+# define INKSCAPE_SYMBOLSDIR append_inkscape_datadir("inkscape/symbols")
+# define INKSCAPE_THEMEDIR append_inkscape_datadir("icons")
+# define INKSCAPE_TUTORIALSDIR append_inkscape_datadir("inkscape/tutorials")
+# define INKSCAPE_TEMPLATESDIR append_inkscape_datadir("inkscape/templates")
+# define INKSCAPE_UIDIR append_inkscape_datadir("inkscape/ui")
//CREATE V0.1 support
-# define CREATE_GRADIENTSDIR INKSCAPE_DATADIR "/create/gradients/gimp"
-# define CREATE_PALETTESDIR INKSCAPE_DATADIR "/create/swatches"
-# define CREATE_PATTERNSDIR INKSCAPE_DATADIR "/create/patterns/vector"
-# endif
+# define CREATE_GRADIENTSDIR append_inkscape_datadir("create/gradients/gimp")
+# define CREATE_PALETTESDIR append_inkscape_datadir("create/swatches")
+# define CREATE_PATTERNSDIR append_inkscape_datadir("create/patterns/vector")
+# endif
#endif
-//#ifdef __cplusplus
-//}
-//#endif /* __cplusplus */
-
#endif /* _PATH_PREFIX_H_ */
diff --git a/src/prefix.cpp b/src/prefix.cpp
index c8bf7abec..14fdd04df 100644
--- a/src/prefix.cpp
+++ b/src/prefix.cpp
@@ -416,44 +416,4 @@ br_extract_prefix (const char *path)
}
#endif /* __cplusplus */
-
-
-#ifdef __WIN32__
-/**
- * Provide a similar mechanism for Win32. Enable a macro,
- * WIN32_DATADIR, that can look up subpaths for inkscape resources
- */
-
-/**
- * Get the Windows-equivalent of INKSCAPE_DATADIR and append a relative path
- *
- * - by default INKSCAPE_DATADIR will be relative to the called executable
- * (typically inkscape/share but also handles the case where the executable is in a /bin subfolder)
- * - to override set the INKSCAPE_DATADIR environment variable
- */
-char *win32_append_datadir(const char *relative_path)
-{
- static gchar *datadir;
- if (!datadir) {
- gchar const *inkscape_datadir = g_getenv("INKSCAPE_DATADIR");
- if (inkscape_datadir) {
- datadir = g_strdup(inkscape_datadir);
- } else {
- gchar *module_path = g_win32_get_package_installation_directory_of_module(NULL);
- datadir = g_build_filename(module_path, "share", NULL);
- g_free(module_path);
- }
- }
-
- if (!relative_path) {
- relative_path = "";
- }
-
- return g_build_filename(datadir, relative_path, NULL);
-}
-#endif /* __WIN32__ */
-
-
-
-
#endif /* _PREFIX_C */
diff --git a/src/prefix.h b/src/prefix.h
index d28e896d0..bdf3b6df4 100644
--- a/src/prefix.h
+++ b/src/prefix.h
@@ -118,11 +118,4 @@ char *br_extract_prefix(const char *path);
}
#endif /* __cplusplus */
-#ifdef __WIN32__
-char *win32_append_datadir(const char *relative_path);
-#undef INKSCAPE_DATADIR
-#define INKSCAPE_DATADIR win32_append_datadir(NULL)
-#define WIN32_DATADIR(suffix) (win32_append_datadir(suffix))
-#endif
-
#endif /* _PREFIX_H_ */