From 3b4e451ace16cc3a4c62d2dfdc50587d4a8acf8c Mon Sep 17 00:00:00 2001 From: Tomasz Boczkowski Date: Mon, 26 May 2014 21:02:55 +0200 Subject: SPPattern c++-sification: replaced guint by bool and enum (bzr r13341.6.16) --- src/extension/internal/cairo-render-context.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/extension') diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index c09b8e9c8..2ace19ae5 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -1015,7 +1015,7 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver TRACE(("%f x %f pattern\n", width, height)); - if (pbox && pattern_patternUnits(pat) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) { + if (pbox && pattern_patternUnits(pat) == SPPattern::UNITS_OBJECTBOUNDINGBOX) { //Geom::Affine bbox2user (pbox->x1 - pbox->x0, 0.0, 0.0, pbox->y1 - pbox->y0, pbox->x0, pbox->y0); bbox_width_scaler = pbox->width(); bbox_height_scaler = pbox->height(); @@ -1048,7 +1048,7 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver pcs2dev[3] = h / view_box.height(); pcs2dev[4] = x - view_box.left() * pcs2dev[0]; pcs2dev[5] = y - view_box.top() * pcs2dev[3]; - } else if (pbox && pattern_patternContentUnits(pat) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) { + } else if (pbox && pattern_patternContentUnits(pat) == SPPattern::UNITS_OBJECTBOUNDINGBOX) { pcs2dev[0] = pbox->width(); pcs2dev[3] = pbox->height(); } -- cgit v1.2.3 From 22db6068f172d060429f17a489bdce59e5836c69 Mon Sep 17 00:00:00 2001 From: Tomasz Boczkowski Date: Tue, 27 May 2014 21:57:33 +0200 Subject: SPPattern c++-sification: replacing pattern_ functions by methods pt1 (bzr r13341.6.19) --- src/extension/internal/cairo-render-context.cpp | 16 ++++++++-------- src/extension/internal/emf-print.cpp | 8 ++++---- src/extension/internal/wmf-print.cpp | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) (limited to 'src/extension') diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index 2ace19ae5..aac2c517a 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -1006,16 +1006,16 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver ps2user = Geom::identity(); pcs2dev = Geom::identity(); - double x = pattern_x(pat); - double y = pattern_y(pat); - double width = pattern_width(pat); - double height = pattern_height(pat); + double x = pat->get_x(); + double y = pat->get_y(); + double width = pat->get_width(); + double height = pat->get_height(); double bbox_width_scaler; double bbox_height_scaler; TRACE(("%f x %f pattern\n", width, height)); - if (pbox && pattern_patternUnits(pat) == SPPattern::UNITS_OBJECTBOUNDINGBOX) { + if (pbox && pat->get_pattern_units() == SPPattern::UNITS_OBJECTBOUNDINGBOX) { //Geom::Affine bbox2user (pbox->x1 - pbox->x0, 0.0, 0.0, pbox->y1 - pbox->y0, pbox->x0, pbox->y0); bbox_width_scaler = pbox->width(); bbox_height_scaler = pbox->height(); @@ -1029,13 +1029,13 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver } // apply pattern transformation - Geom::Affine pattern_transform(pattern_patternTransform(pat)); + Geom::Affine pattern_transform(pat->get_transform()); ps2user *= pattern_transform; Geom::Point ori (ps2user[4], ps2user[5]); // create pattern contents coordinate system if (pat->viewBox_set) { - Geom::Rect view_box = *pattern_viewBox(pat); + Geom::Rect view_box = *pat->get_viewbox(); double x, y, w, h; x = 0; @@ -1048,7 +1048,7 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver pcs2dev[3] = h / view_box.height(); pcs2dev[4] = x - view_box.left() * pcs2dev[0]; pcs2dev[5] = y - view_box.top() * pcs2dev[3]; - } else if (pbox && pattern_patternContentUnits(pat) == SPPattern::UNITS_OBJECTBOUNDINGBOX) { + } else if (pbox && pat->get_pattern_content_units() == SPPattern::UNITS_OBJECTBOUNDINGBOX) { pcs2dev[0] = pbox->width(); pcs2dev[3] = pbox->height(); } diff --git a/src/extension/internal/emf-print.cpp b/src/extension/internal/emf-print.cpp index 9c68e40a4..2953efd7d 100644 --- a/src/extension/internal/emf-print.cpp +++ b/src/extension/internal/emf-print.cpp @@ -381,8 +381,8 @@ int PrintEmf::create_brush(SPStyle const *style, PU_COLORREF fcolor) } else if (SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style))) { // must be paint-server SPPaintServer *paintserver = style->fill.value.href->getObject(); SPPattern *pat = SP_PATTERN(paintserver); - double dwidth = pattern_width(pat); - double dheight = pattern_height(pat); + double dwidth = pat->get_width(); + double dheight = pat->get_height(); width = dwidth; height = dheight; brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor); @@ -567,8 +567,8 @@ int PrintEmf::create_pen(SPStyle const *style, const Geom::Affine &transform) if (SP_IS_PATTERN(SP_STYLE_STROKE_SERVER(style))) { // must be paint-server SPPaintServer *paintserver = style->stroke.value.href->getObject(); SPPattern *pat = SP_PATTERN(paintserver); - double dwidth = pattern_width(pat); - double dheight = pattern_height(pat); + double dwidth = pat->get_width(); + double dheight = pat->get_height(); width = dwidth; height = dheight; brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor); diff --git a/src/extension/internal/wmf-print.cpp b/src/extension/internal/wmf-print.cpp index 55ad5da5f..8f3115693 100644 --- a/src/extension/internal/wmf-print.cpp +++ b/src/extension/internal/wmf-print.cpp @@ -378,8 +378,8 @@ int PrintWmf::create_brush(SPStyle const *style, U_COLORREF *fcolor) } else if (SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style))) { // must be paint-server SPPaintServer *paintserver = style->fill.value.href->getObject(); SPPattern *pat = SP_PATTERN(paintserver); - double dwidth = pattern_width(pat); - double dheight = pattern_height(pat); + double dwidth = pat->get_width(); + double dheight = pat->get_height(); width = dwidth; height = dheight; brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor); -- cgit v1.2.3 From 17055d029cc8732d1b2636b9e98338c8e7056558 Mon Sep 17 00:00:00 2001 From: Tomasz Boczkowski Date: Fri, 30 May 2014 15:55:34 +0200 Subject: SPColorNotebok c++-sification - available pages list (bzr r13341.6.28) --- src/extension/param/parameter.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/extension') diff --git a/src/extension/param/parameter.cpp b/src/extension/param/parameter.cpp index 202b8110f..b18525215 100644 --- a/src/extension/param/parameter.cpp +++ b/src/extension/param/parameter.cpp @@ -15,6 +15,10 @@ # include "config.h" #endif +#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H +#include +#endif + #ifdef linux // does the dollar sign need escaping when passed as string parameter? # define ESCAPE_DOLLAR_COMMANDLINE #endif -- cgit v1.2.3 From bb5dacfc027558432b9a46f61329d7bd02731571 Mon Sep 17 00:00:00 2001 From: Tomasz Boczkowski Date: Sun, 1 Jun 2014 13:03:36 +0200 Subject: Using SelectedColor in extenstion/param/color (bzr r13341.6.45) --- src/extension/param/color.cpp | 51 ++++++++++++++++++------------------------- src/extension/param/color.h | 9 ++++++-- 2 files changed, 28 insertions(+), 32 deletions(-) (limited to 'src/extension') diff --git a/src/extension/param/color.cpp b/src/extension/param/color.cpp index 0a2598c56..0eca52f8e 100644 --- a/src/extension/param/color.cpp +++ b/src/extension/param/color.cpp @@ -36,9 +36,6 @@ namespace Inkscape { namespace Extension { -void sp_color_param_changed(SPColorSelector *csel, GObject *cp); - - ParamColor::~ParamColor(void) { @@ -46,17 +43,19 @@ ParamColor::~ParamColor(void) guint32 ParamColor::set( guint32 in, SPDocument * /*doc*/, Inkscape::XML::Node * /*node*/ ) { - _value = in; + _color_changed.block(true); + _color.setValue(in); + _color_changed.block(false); gchar * prefname = this->pref_name(); std::string value; string(value); - + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); prefs->setString(extension_pref_root + prefname, value); g_free(prefname); - return _value; + return in; } ParamColor::ParamColor (const gchar * name, const gchar * guitext, const gchar * desc, const Parameter::_scope_t scope, bool gui_hidden, const gchar * gui_tip, Inkscape::Extension::Extension * ext, Inkscape::XML::Node * xml) : @@ -75,13 +74,15 @@ ParamColor::ParamColor (const gchar * name, const gchar * guitext, const gchar * if (!paramval.empty()) defaulthex = paramval.data(); - _value = atoi(defaulthex); + _color.setValue(atoi(defaulthex)); + _color_changed = _color.signal_changed.connect(sigc::mem_fun(this, &ParamColor::_onColorChanged)); + } void ParamColor::string(std::string &string) const { char str[16]; - sprintf(str, "%i", _value); + sprintf(str, "%i", _color.value()); string += str; } @@ -90,35 +91,25 @@ Gtk::Widget *ParamColor::get_widget( SPDocument * /*doc*/, Inkscape::XML::Node * if (_gui_hidden) return NULL; _changeSignal = new sigc::signal(*changeSignal); - Gtk::HBox * hbox = Gtk::manage(new Gtk::HBox(false, 4)); - SPColorSelector* spColorSelector = (SPColorSelector*)sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK); - ColorSelector* colorSelector = spColorSelector->base; - if (_value < 1) { - _value = 0xFF000000; + if (_color.value() < 1) { + _color_changed.block(true); + _color.setValue(0xFF000000); + _color_changed.block(false); } - SPColor *color = new SPColor( _value ); - float alpha = (_value & 0xff) / 255.0F; - colorSelector->setColorAlpha(*color, alpha); - hbox->pack_start (*Glib::wrap(&spColorSelector->vbox), true, true, 0); - g_signal_connect(G_OBJECT(spColorSelector), "changed", G_CALLBACK(sp_color_param_changed), (void*)this); - - gtk_widget_show(GTK_WIDGET(spColorSelector)); + Gtk::HBox *hbox = Gtk::manage(new Gtk::HBox(false, 4)); + Gtk::Widget *selector = Gtk::manage(ColorNotebook::create(_color)); + hbox->pack_start (*selector, true, true, 0); + selector->show(); hbox->show(); - - return dynamic_cast(hbox); + return hbox; } -void sp_color_param_changed(SPColorSelector *csel, GObject *obj) +void ParamColor::_onColorChanged() { - const SPColor color = csel->base->getColor(); - float alpha = csel->base->getAlpha(); - - ParamColor* ptr = reinterpret_cast(obj); - ptr->set(color.toRGBA32( alpha ), NULL, NULL); - - ptr->_changeSignal->emit(); + if (_changeSignal) + _changeSignal->emit(); } }; /* namespace Extension */ diff --git a/src/extension/param/color.h b/src/extension/param/color.h index 9894965a9..ed2e57ceb 100644 --- a/src/extension/param/color.h +++ b/src/extension/param/color.h @@ -9,6 +9,7 @@ */ #include "parameter.h" +#include "ui/selected-color.h" class SPDocument; @@ -25,14 +26,17 @@ namespace Extension { class ParamColor : public Parameter { private: - guint32 _value; + void _onColorChanged(); + + Inkscape::UI::SelectedColor _color; + sigc::connection _color_changed; public: ParamColor(const gchar * name, const gchar * guitext, const gchar * desc, const Parameter::_scope_t scope, bool gui_hidden, const gchar * gui_tip, Inkscape::Extension::Extension * ext, Inkscape::XML::Node * xml); virtual ~ParamColor(void); /** Returns \c _value, with a \i const to protect it. */ - guint32 get( SPDocument const * /*doc*/, Inkscape::XML::Node const * /*node*/ ) const { return _value; } + guint32 get( SPDocument const * /*doc*/, Inkscape::XML::Node const * /*node*/ ) const { return _color.value(); } guint32 set (guint32 in, SPDocument * doc, Inkscape::XML::Node * node); @@ -44,6 +48,7 @@ public: virtual void string (std::string &string) const; sigc::signal * _changeSignal; + }; // class ParamColor } // namespace Extension -- cgit v1.2.3 From 8df6d8e46c8b7e9a96529ee38af62a0f8ea9c831 Mon Sep 17 00:00:00 2001 From: Tomasz Boczkowski Date: Sun, 1 Jun 2014 13:26:17 +0200 Subject: disconnecting in ParamColor destructor (bzr r13341.6.47) --- src/extension/param/color.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/extension') diff --git a/src/extension/param/color.cpp b/src/extension/param/color.cpp index 0eca52f8e..5b2a4ad0c 100644 --- a/src/extension/param/color.cpp +++ b/src/extension/param/color.cpp @@ -38,7 +38,7 @@ namespace Extension { ParamColor::~ParamColor(void) { - + _color_changed.disconnect(); } guint32 ParamColor::set( guint32 in, SPDocument * /*doc*/, Inkscape::XML::Node * /*node*/ ) -- cgit v1.2.3 From 66275a3a9f7666fe68355c1d8c452395b706db30 Mon Sep 17 00:00:00 2001 From: Tomasz Boczkowski Date: Sun, 1 Jun 2014 17:29:01 +0200 Subject: moved ColorNotebook to ui/widget (bzr r13341.6.51) --- src/extension/param/color.cpp | 2 +- src/extension/param/parameter.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) (limited to 'src/extension') diff --git a/src/extension/param/color.cpp b/src/extension/param/color.cpp index 5b2a4ad0c..6748c8f5f 100644 --- a/src/extension/param/color.cpp +++ b/src/extension/param/color.cpp @@ -29,7 +29,7 @@ #include #include "widgets/sp-color-selector.h" -#include "widgets/sp-color-notebook.h" +#include "ui/widget/color-notebook.h" #include "preferences.h" diff --git a/src/extension/param/parameter.cpp b/src/extension/param/parameter.cpp index b18525215..8c99ee55d 100644 --- a/src/extension/param/parameter.cpp +++ b/src/extension/param/parameter.cpp @@ -30,8 +30,7 @@ #include "document-private.h" #include "sp-object.h" #include -#include "widgets/sp-color-selector.h" -#include "widgets/sp-color-notebook.h" +#include "ui/widget/color-notebook.h" #include "parameter.h" #include "bool.h" -- cgit v1.2.3 From 761b8956cc9cb923a7e7c5a95eacfaf7ba36d475 Mon Sep 17 00:00:00 2001 From: Tomasz Boczkowski Date: Sun, 1 Jun 2014 19:00:26 +0200 Subject: ColorNotebook is Gtk::Widget and uses ColorSelector (bzr r13341.6.52) --- src/extension/param/color.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/extension') diff --git a/src/extension/param/color.cpp b/src/extension/param/color.cpp index 6748c8f5f..ef3887a12 100644 --- a/src/extension/param/color.cpp +++ b/src/extension/param/color.cpp @@ -32,7 +32,6 @@ #include "ui/widget/color-notebook.h" #include "preferences.h" - namespace Inkscape { namespace Extension { @@ -88,6 +87,8 @@ void ParamColor::string(std::string &string) const Gtk::Widget *ParamColor::get_widget( SPDocument * /*doc*/, Inkscape::XML::Node * /*node*/, sigc::signal * changeSignal ) { + using Inkscape::UI::Widget::ColorNotebook; + if (_gui_hidden) return NULL; _changeSignal = new sigc::signal(*changeSignal); @@ -99,7 +100,7 @@ Gtk::Widget *ParamColor::get_widget( SPDocument * /*doc*/, Inkscape::XML::Node * } Gtk::HBox *hbox = Gtk::manage(new Gtk::HBox(false, 4)); - Gtk::Widget *selector = Gtk::manage(ColorNotebook::create(_color)); + Gtk::Widget *selector = Gtk::manage(new ColorNotebook(_color)); hbox->pack_start (*selector, true, true, 0); selector->show(); hbox->show(); -- cgit v1.2.3 From 6ebb6cfcf28dfd36a22ce4fe11324971c34ee70c Mon Sep 17 00:00:00 2001 From: Tomasz Boczkowski Date: Sat, 2 May 2015 14:54:37 +0200 Subject: gtk3 compile fix (bzr r14059.1.13) --- src/extension/param/color.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/extension') diff --git a/src/extension/param/color.cpp b/src/extension/param/color.cpp index e3410fba8..e68dbf8bf 100644 --- a/src/extension/param/color.cpp +++ b/src/extension/param/color.cpp @@ -24,7 +24,6 @@ #include "color.h" #include -#include "widgets/sp-color-selector.h" #include "ui/widget/color-notebook.h" #include "preferences.h" -- cgit v1.2.3 From f107d4347aefa08df9738e23cf078da73277711e Mon Sep 17 00:00:00 2001 From: Tomasz Boczkowski Date: Sun, 3 May 2015 11:01:16 +0200 Subject: Introduced fixes after merge proposal review (bzr r14059.1.16) --- src/extension/internal/cairo-render-context.cpp | 1 - src/extension/param/color.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) (limited to 'src/extension') diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index 7162ca658..abfdd9f1c 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -1018,7 +1018,6 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver TRACE(("%f x %f pattern\n", width, height)); if (pbox && pat->get_pattern_units() == SPPattern::UNITS_OBJECTBOUNDINGBOX) { - //Geom::Affine bbox2user (pbox->x1 - pbox->x0, 0.0, 0.0, pbox->y1 - pbox->y0, pbox->x0, pbox->y0); bbox_width_scaler = pbox->width(); bbox_height_scaler = pbox->height(); ps2user[4] = x * bbox_width_scaler + pbox->left(); diff --git a/src/extension/param/color.cpp b/src/extension/param/color.cpp index e68dbf8bf..3162e8a40 100644 --- a/src/extension/param/color.cpp +++ b/src/extension/param/color.cpp @@ -78,7 +78,7 @@ ParamColor::ParamColor (const gchar * name, const gchar * guitext, const gchar * void ParamColor::string(std::string &string) const { char str[16]; - sprintf(str, "%i", _color.value()); + snprintf(str, 16, "%i", _color.value()); string += str; } -- cgit v1.2.3 From 705243e1266aec7527ae76065213ca7536ed7c41 Mon Sep 17 00:00:00 2001 From: Tomasz Boczkowski Date: Sun, 3 May 2015 12:37:06 +0200 Subject: renamed SPPattern methods to match coding style (bzr r14059.1.20) --- src/extension/internal/cairo-render-context.cpp | 16 ++++++++-------- src/extension/internal/emf-print.cpp | 8 ++++---- src/extension/internal/wmf-print.cpp | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) (limited to 'src/extension') diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index abfdd9f1c..b5859c283 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -1008,16 +1008,16 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver ps2user = Geom::identity(); pcs2dev = Geom::identity(); - double x = pat->get_x(); - double y = pat->get_y(); - double width = pat->get_width(); - double height = pat->get_height(); + double x = pat->x(); + double y = pat->y(); + double width = pat->width(); + double height = pat->height(); double bbox_width_scaler; double bbox_height_scaler; TRACE(("%f x %f pattern\n", width, height)); - if (pbox && pat->get_pattern_units() == SPPattern::UNITS_OBJECTBOUNDINGBOX) { + if (pbox && pat->patternUnits() == SPPattern::UNITS_OBJECTBOUNDINGBOX) { bbox_width_scaler = pbox->width(); bbox_height_scaler = pbox->height(); ps2user[4] = x * bbox_width_scaler + pbox->left(); @@ -1030,13 +1030,13 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver } // apply pattern transformation - Geom::Affine pattern_transform(pat->get_transform()); + Geom::Affine pattern_transform(pat->getTransform()); ps2user *= pattern_transform; Geom::Point ori (ps2user[4], ps2user[5]); // create pattern contents coordinate system if (pat->viewBox_set) { - Geom::Rect view_box = *pat->get_viewbox(); + Geom::Rect view_box = *pat->viewbox(); double x, y, w, h; x = 0; @@ -1049,7 +1049,7 @@ CairoRenderContext::_createPatternPainter(SPPaintServer const *const paintserver pcs2dev[3] = h / view_box.height(); pcs2dev[4] = x - view_box.left() * pcs2dev[0]; pcs2dev[5] = y - view_box.top() * pcs2dev[3]; - } else if (pbox && pat->get_pattern_content_units() == SPPattern::UNITS_OBJECTBOUNDINGBOX) { + } else if (pbox && pat->patternContentUnits() == SPPattern::UNITS_OBJECTBOUNDINGBOX) { pcs2dev[0] = pbox->width(); pcs2dev[3] = pbox->height(); } diff --git a/src/extension/internal/emf-print.cpp b/src/extension/internal/emf-print.cpp index 48591fab2..40d0955e3 100644 --- a/src/extension/internal/emf-print.cpp +++ b/src/extension/internal/emf-print.cpp @@ -388,8 +388,8 @@ int PrintEmf::create_brush(SPStyle const *style, PU_COLORREF fcolor) } else if (SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style))) { // must be paint-server SPPaintServer *paintserver = style->fill.value.href->getObject(); SPPattern *pat = SP_PATTERN(paintserver); - double dwidth = pat->get_width(); - double dheight = pat->get_height(); + double dwidth = pat->width(); + double dheight = pat->height(); width = dwidth; height = dheight; brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor); @@ -573,8 +573,8 @@ int PrintEmf::create_pen(SPStyle const *style, const Geom::Affine &transform) if (SP_IS_PATTERN(SP_STYLE_STROKE_SERVER(style))) { // must be paint-server SPPaintServer *paintserver = style->stroke.value.href->getObject(); SPPattern *pat = SP_PATTERN(paintserver); - double dwidth = pat->get_width(); - double dheight = pat->get_height(); + double dwidth = pat->width(); + double dheight = pat->height(); width = dwidth; height = dheight; brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor); diff --git a/src/extension/internal/wmf-print.cpp b/src/extension/internal/wmf-print.cpp index 4894b6740..768909173 100644 --- a/src/extension/internal/wmf-print.cpp +++ b/src/extension/internal/wmf-print.cpp @@ -380,8 +380,8 @@ int PrintWmf::create_brush(SPStyle const *style, U_COLORREF *fcolor) } else if (SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style))) { // must be paint-server SPPaintServer *paintserver = style->fill.value.href->getObject(); SPPattern *pat = SP_PATTERN(paintserver); - double dwidth = pat->get_width(); - double dheight = pat->get_height(); + double dwidth = pat->width(); + double dheight = pat->height(); width = dwidth; height = dheight; brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor); -- cgit v1.2.3 From 7d5213c328e56fcb23169dd6b1633853ab04bf88 Mon Sep 17 00:00:00 2001 From: Yuri Chornoivan <> Date: Mon, 11 May 2015 18:07:41 +0200 Subject: Translations. Fix typo in the Color blindness filter and Ukrainian translation update. Fixed bugs: - https://launchpad.net/bugs/1407331 (bzr r14145) --- src/extension/internal/filter/color.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/extension') diff --git a/src/extension/internal/filter/color.h b/src/extension/internal/filter/color.h index c3c26bf8b..b9c76615c 100644 --- a/src/extension/internal/filter/color.h +++ b/src/extension/internal/filter/color.h @@ -258,7 +258,7 @@ public: "\n" "<_item value=\"0.618 0.32 0.062 0 0 0.163 0.775 0.062 0 0 0.163 0.32 0.516 0 0 0 0 0 1 0 \">" N_("Rod monochromacy (atypical achromatopsia)") "\n" "<_item value=\"0.299 0.587 0.114 0 0 0.299 0.587 0.114 0 0 0.299 0.587 0.114 0 0 0 0 0 1 0 \">" N_("Cone monochromacy (typical achromatopsia)") "\n" - "<_item value=\"0.8 0.2 0 0 0 0.2583 0.74167 0 0 0 0 0.14167 0.85833 0 0 0 0 0 1 0 \">" N_("Geen weak (deuteranomaly)") "\n" + "<_item value=\"0.8 0.2 0 0 0 0.2583 0.74167 0 0 0 0 0.14167 0.85833 0 0 0 0 0 1 0 \">" N_("Green weak (deuteranomaly)") "\n" "<_item value=\"0.625 0.375 0 0 0 0.7 0.3 0 0 0 0 0.3 0.7 0 0 0 0 0 1 0 \">" N_("Green blind (deuteranopia)") "\n" "<_item value=\"0.8166 0.1833 0 0 0 0.333 0.666 0 0 0 0 0.125 0.875 0 0 0 0 0 1 0 \">" N_("Red weak (protanomaly)") "\n" "<_item value=\"0.566 0.43333 0 0 0 0.55833 0.4416 0 0 0 0 0.24167 0.75833 0 0 0 0 0 1 0 \">" N_("Red blind (protanopia)") "\n" -- cgit v1.2.3 From e091cbbea4228bf243b1c040e774ad884683da8f Mon Sep 17 00:00:00 2001 From: mathog <> Date: Thu, 21 May 2015 11:40:38 -0700 Subject: patch for bug 1457612 (bzr r14168) --- src/extension/internal/text_reassemble.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/extension') diff --git a/src/extension/internal/text_reassemble.c b/src/extension/internal/text_reassemble.c index d3aafef12..fa983b83d 100644 --- a/src/extension/internal/text_reassemble.c +++ b/src/extension/internal/text_reassemble.c @@ -67,8 +67,8 @@ Optional compiler switches for development: File: text_reassemble.c -Version: 0.0.16 -Date: 25-FEB-2015 +Version: 0.0.17 +Date: 21-MAY-2015 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu Copyright: 2015 David Mathog and California Institute of Technology (Caltech) @@ -2204,10 +2204,10 @@ void TR_layout_2_svg(TR_INFO *tri){ sprintf(obuf,"text-decoration:"); /* multiple text decoration styles may be set */ utmp = tsp->decoration & TXTDECOR_TMASK; - if(utmp & TXTDECOR_UNDER ){ strcat(obuf,"underline"); } - if(utmp & TXTDECOR_OVER ){ strcat(obuf,"overline"); } - if(utmp & TXTDECOR_BLINK ){ strcat(obuf,"blink"); } - if(utmp & TXTDECOR_STRIKE){ strcat(obuf,"line-through");} + if(utmp & TXTDECOR_UNDER ){ strcat(obuf," underline"); } + if(utmp & TXTDECOR_OVER ){ strcat(obuf," overline"); } + if(utmp & TXTDECOR_BLINK ){ strcat(obuf," blink"); } + if(utmp & TXTDECOR_STRIKE){ strcat(obuf," line-through");} if(*obuf){ /* only a single text decoration line type may be set */ switch(tsp->decoration & TXTDECOR_LMASK){ -- cgit v1.2.3 From 252d594b8f4e0f8b340a62a242795f0583c57a25 Mon Sep 17 00:00:00 2001 From: mathog <> Date: Thu, 21 May 2015 16:06:06 -0700 Subject: minor tweaks to libUEMF and related code (bzr r14169) --- src/extension/internal/wmf-inout.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/extension') diff --git a/src/extension/internal/wmf-inout.cpp b/src/extension/internal/wmf-inout.cpp index f76fa16b4..d17180d91 100644 --- a/src/extension/internal/wmf-inout.cpp +++ b/src/extension/internal/wmf-inout.cpp @@ -449,7 +449,8 @@ uint32_t Wmf::add_dib_image(PWMF_CALLBACK_DATA d, const char *dib, uint32_t iUsa char *rgba_px = NULL; // RGBA pixels const char *px = NULL; // DIB pixels const U_RGBQUAD *ct = NULL; // DIB color table - int32_t width, height, colortype, numCt, invert; // if needed these values will be set by wget_DIB_params + uint32_t numCt; + int32_t width, height, colortype, invert; // if needed these values will be set by wget_DIB_params if(iUsage == U_DIB_RGB_COLORS){ // next call returns pointers and values, but allocates no memory dibparams = wget_DIB_params(dib, &px, &ct, &numCt, &width, &height, &colortype, &invert); @@ -1318,7 +1319,8 @@ void Wmf::common_dib_to_image(PWMF_CALLBACK_DATA d, const char *dib, char *sub_px = NULL; // RGBA pixels, subarray const char *px = NULL; // DIB pixels const U_RGBQUAD *ct = NULL; // color table - int32_t width, height, colortype, numCt, invert; // if needed these values will be set in wget_DIB_params + uint32_t numCt; + int32_t width, height, colortype, invert; // if needed these values will be set in wget_DIB_params if(iUsage == U_DIB_RGB_COLORS){ // next call returns pointers and values, but allocates no memory dibparams = wget_DIB_params(dib, &px, &ct, &numCt, &width, &height, &colortype, &invert); -- cgit v1.2.3 From 2f2b64bd4a267775e948957c8c815d8efb644c93 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Sun, 24 May 2015 11:51:12 +0200 Subject: Reorganized PDF import dialog, disabling unused options as appropriate. (bzr r14170) --- src/extension/internal/pdfinput/pdf-input.cpp | 144 ++++++++++++++------------ src/extension/internal/pdfinput/pdf-input.h | 13 ++- 2 files changed, 90 insertions(+), 67 deletions(-) (limited to 'src/extension') diff --git a/src/extension/internal/pdfinput/pdf-input.cpp b/src/extension/internal/pdfinput/pdf-input.cpp index 148d2dcba..0fa5dc3df 100644 --- a/src/extension/internal/pdfinput/pdf-input.cpp +++ b/src/extension/internal/pdfinput/pdf-input.cpp @@ -125,8 +125,13 @@ PdfImportDialog::PdfImportDialog(PDFDoc *doc, const gchar */*uri*/) _labelPrecisionWarning = Gtk::manage(new class Gtk::Label(_("Note: setting the precision too high may result in a large SVG file and slow performance."))); #ifdef HAVE_POPPLER_CAIRO - _importviaPopplerCheck = Gtk::manage(new class Gtk::CheckButton(_("import via Poppler"))); + Gtk::RadioButton::Group group; + _importViaPoppler = Gtk::manage(new class Gtk::RadioButton(group,_("Poppler/Cairo import"))); + _labelViaPoppler = Gtk::manage(new class Gtk::Label(_("Import via external library. Text consists of groups containing cloned glyphs where each glyph is a path. Images are stored internally. Meshes cause entire document to be rendered as a raster image."))); + _importViaInternal = Gtk::manage(new class Gtk::RadioButton(group,_("Internal import"))); + _labelViaInternal = Gtk::manage(new class Gtk::Label(_("Import via internal (Poppler derived) library. Text is stored as text but white space is missing. Meshes are converted to tiles, the number depends on the precision set below."))); #endif + #if WITH_GTKMM_3_0 _fallbackPrecisionSlider_adj = Gtk::Adjustment::create(2, 1, 256, 1, 10, 10); _fallbackPrecisionSlider = Gtk::manage(new class Gtk::Scale(_fallbackPrecisionSlider_adj)); @@ -139,13 +144,15 @@ PdfImportDialog::PdfImportDialog(PDFDoc *doc, const gchar */*uri*/) hbox6 = Gtk::manage(new class Gtk::HBox(false, 4)); // Text options - _labelText = Gtk::manage(new class Gtk::Label(_("Text handling:"))); - _textHandlingCombo = Gtk::manage(new class Gtk::ComboBoxText()); - _textHandlingCombo->append(_("Import text as text")); - _textHandlingCombo->set_active_text(_("Import text as text")); + // _labelText = Gtk::manage(new class Gtk::Label(_("Text handling:"))); + // _textHandlingCombo = Gtk::manage(new class Gtk::ComboBoxText()); + // _textHandlingCombo->append(_("Import text as text")); + // _textHandlingCombo->set_active_text(_("Import text as text")); + // hbox5 = Gtk::manage(new class Gtk::HBox(false, 4)); + + // Font option _localFontsCheck = Gtk::manage(new class Gtk::CheckButton(_("Replace PDF fonts by closest-named installed fonts"))); - hbox5 = Gtk::manage(new class Gtk::HBox(false, 4)); _embedImagesCheck = Gtk::manage(new class Gtk::CheckButton(_("Embed images"))); vbox3 = Gtk::manage(new class Gtk::VBox(false, 4)); _importSettingsFrame = Gtk::manage(new class Inkscape::UI::Widget::Frame(_("Import settings"))); @@ -202,12 +209,19 @@ PdfImportDialog::PdfImportDialog(PDFDoc *doc, const gchar */*uri*/) _labelPrecisionWarning->set_line_wrap(true); _labelPrecisionWarning->set_use_markup(true); _labelPrecisionWarning->set_selectable(false); + #ifdef HAVE_POPPLER_CAIRO - _importviaPopplerCheck->set_can_focus(); - _importviaPopplerCheck->set_relief(Gtk::RELIEF_NORMAL); - _importviaPopplerCheck->set_mode(true); - _importviaPopplerCheck->set_active(false); + _importViaPoppler->set_can_focus(); + _importViaPoppler->set_relief(Gtk::RELIEF_NORMAL); + _importViaPoppler->set_mode(true); + _importViaPoppler->set_active(false); + _importViaInternal->set_can_focus(); + _importViaInternal->set_relief(Gtk::RELIEF_NORMAL); + _importViaInternal->set_mode(true); + _labelViaPoppler->set_line_wrap(true); + _labelViaInternal->set_line_wrap(true); #endif + _fallbackPrecisionSlider->set_size_request(180,-1); _fallbackPrecisionSlider->set_can_focus(); _fallbackPrecisionSlider->set_inverted(false); @@ -223,14 +237,14 @@ PdfImportDialog::PdfImportDialog(PDFDoc *doc, const gchar */*uri*/) _labelPrecisionComment->set_selectable(false); hbox6->pack_start(*_fallbackPrecisionSlider, Gtk::PACK_SHRINK, 4); hbox6->pack_start(*_labelPrecisionComment, Gtk::PACK_SHRINK, 0); - _labelText->set_alignment(0.5,0.5); - _labelText->set_padding(4,0); - _labelText->set_justify(Gtk::JUSTIFY_LEFT); - _labelText->set_line_wrap(false); - _labelText->set_use_markup(false); - _labelText->set_selectable(false); - hbox5->pack_start(*_labelText, Gtk::PACK_SHRINK, 0); - hbox5->pack_start(*_textHandlingCombo, Gtk::PACK_SHRINK, 0); + // _labelText->set_alignment(0.5,0.5); + // _labelText->set_padding(4,0); + // _labelText->set_justify(Gtk::JUSTIFY_LEFT); + // _labelText->set_line_wrap(false); + // _labelText->set_use_markup(false); + // _labelText->set_selectable(false); + // hbox5->pack_start(*_labelText, Gtk::PACK_SHRINK, 0); + // hbox5->pack_start(*_textHandlingCombo, Gtk::PACK_SHRINK, 0); _localFontsCheck->set_can_focus(); _localFontsCheck->set_relief(Gtk::RELIEF_NORMAL); _localFontsCheck->set_mode(true); @@ -240,14 +254,17 @@ PdfImportDialog::PdfImportDialog(PDFDoc *doc, const gchar */*uri*/) _embedImagesCheck->set_mode(true); _embedImagesCheck->set_active(true); #ifdef HAVE_POPPLER_CAIRO - vbox3->pack_start(*_importviaPopplerCheck, Gtk::PACK_SHRINK, 0); + vbox3->pack_start(*_importViaPoppler, Gtk::PACK_SHRINK, 0); + vbox3->pack_start(*_labelViaPoppler, Gtk::PACK_SHRINK, 0); + vbox3->pack_start(*_importViaInternal, Gtk::PACK_SHRINK, 0); + vbox3->pack_start(*_labelViaInternal, Gtk::PACK_SHRINK, 0); #endif + vbox3->pack_start(*_localFontsCheck, Gtk::PACK_SHRINK, 0); + vbox3->pack_start(*_embedImagesCheck, Gtk::PACK_SHRINK, 0); vbox3->pack_start(*_labelPrecision, Gtk::PACK_SHRINK, 0); vbox3->pack_start(*hbox6, Gtk::PACK_SHRINK, 0); vbox3->pack_start(*_labelPrecisionWarning, Gtk::PACK_SHRINK, 0); - vbox3->pack_start(*hbox5, Gtk::PACK_SHRINK, 4); - vbox3->pack_start(*_localFontsCheck, Gtk::PACK_SHRINK, 0); - vbox3->pack_start(*_embedImagesCheck, Gtk::PACK_SHRINK, 0); + // vbox3->pack_start(*hbox5, Gtk::PACK_SHRINK, 4); _importSettingsFrame->add(*vbox3); _importSettingsFrame->set_border_width(4); vbox1->pack_start(*_pageSettingsFrame, Gtk::PACK_EXPAND_PADDING, 0); @@ -273,36 +290,9 @@ PdfImportDialog::PdfImportDialog(PDFDoc *doc, const gchar */*uri*/) this->property_destroy_with_parent().set_value(false); this->add_action_widget(*cancelbutton, -6); this->add_action_widget(*okbutton, -5); - cancelbutton->show(); - okbutton->show(); - _labelSelect->show(); - _pageNumberSpin->show(); - _labelTotalPages->show(); - hbox2->show(); - _cropCheck->show(); - _cropTypeCombo->show(); - hbox3->show(); - vbox2->show(); - _pageSettingsFrame->show(); - _labelPrecision->show(); - _labelPrecisionWarning->show(); -#ifdef HAVE_POPPLER_CAIRO - _importviaPopplerCheck->show(); -#endif - _fallbackPrecisionSlider->show(); - _labelPrecisionComment->show(); - hbox6->show(); - _labelText->show(); - _textHandlingCombo->show(); - hbox5->show(); - _localFontsCheck->show(); - _embedImagesCheck->show(); - vbox3->show(); - _importSettingsFrame->show(); - vbox1->show(); - _previewArea->show(); - hbox1->show(); + this->show_all(); + // Connect signals #if WITH_GTKMM_3_0 _previewArea->signal_draw().connect(sigc::mem_fun(*this, &PdfImportDialog::_onDraw)); @@ -313,6 +303,9 @@ PdfImportDialog::PdfImportDialog(PDFDoc *doc, const gchar */*uri*/) _pageNumberSpin_adj->signal_value_changed().connect(sigc::mem_fun(*this, &PdfImportDialog::_onPageNumberChanged)); _cropCheck->signal_toggled().connect(sigc::mem_fun(*this, &PdfImportDialog::_onToggleCropping)); _fallbackPrecisionSlider_adj->signal_value_changed().connect(sigc::mem_fun(*this, &PdfImportDialog::_onPrecisionChanged)); +#ifdef HAVE_POPPLER_CAIRO + _importViaPoppler->signal_toggled().connect(sigc::mem_fun(*this, &PdfImportDialog::_onToggleImport)); +#endif _render_thumb = false; #ifdef HAVE_POPPLER_CAIRO @@ -324,6 +317,9 @@ PdfImportDialog::PdfImportDialog(PDFDoc *doc, const gchar */*uri*/) _poppler_doc = poppler_document_new_from_file(doc_uri, NULL, NULL); g_free(doc_uri); } + + // Set sensitivity of some widgets based on selected import type. + _onToggleImport(); #endif // Set default preview size @@ -373,11 +369,11 @@ int PdfImportDialog::getSelectedPage() { return _current_page; } -int PdfImportDialog::getImportMethod() { +bool PdfImportDialog::getImportMethod() { #ifdef HAVE_POPPLER_CAIRO - return (_importviaPopplerCheck->get_active()) ? 1 : 0; + return _importViaPoppler->get_active(); #else - return 0; + return false; #endif } @@ -413,7 +409,7 @@ void PdfImportDialog::getImportSettings(Inkscape::XML::Node *prefs) { prefs->setAttribute("embedImages", "0"); } #ifdef HAVE_POPPLER_CAIRO - if (_importviaPopplerCheck->get_active()) { + if (_importViaPoppler->get_active()) { prefs->setAttribute("importviapoppler", "1"); } else { prefs->setAttribute("importviapoppler", "0"); @@ -453,6 +449,23 @@ void PdfImportDialog::_onPageNumberChanged() { _setPreviewPage(_current_page); } +#ifdef HAVE_POPPLER_CAIRO +void PdfImportDialog::_onToggleImport() { + if( _importViaPoppler->get_active() ) { + hbox3->set_sensitive(false); + _localFontsCheck->set_sensitive(false); + _embedImagesCheck->set_sensitive(false); + hbox6->set_sensitive(false); + } else { + hbox3->set_sensitive(); + _localFontsCheck->set_sensitive(); + _embedImagesCheck->set_sensitive(); + hbox6->set_sensitive(); + } +} +#endif + + #ifdef HAVE_POPPLER_CAIRO /** * \brief Copies image data from a Cairo surface to a pixbuf @@ -673,8 +686,12 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) { globalParams = new GlobalParams(); #endif // ENABLE_OSX_APP_LOCATIONS } - // poppler does not use glib g_open. So on win32 we must use unicode call. code was copied from glib gstdio.c + + + // PDFDoc is from poppler. #ifndef WIN32 + // poppler does not use glib g_open. So on win32 we must use unicode call. code was copied from + // glib gstdio.c GooString *filename_goo = new GooString(uri); PDFDoc *pdf_doc = new PDFDoc(filename_goo, NULL, NULL, NULL); // TODO: Could ask for password //delete filename_goo; @@ -739,17 +756,18 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) { Catalog *catalog = pdf_doc->getCatalog(); Page *page = catalog->getPage(page_num); - int is_importvia_poppler = 0; + bool is_importvia_poppler = false; if(dlg) { #ifdef HAVE_POPPLER_CAIRO is_importvia_poppler = dlg->getImportMethod(); + // printf("PDF import via %s.\n", is_importvia_poppler ? "poppler" : "native"); #endif } SPDocument *doc = NULL; bool saved = false; - if(is_importvia_poppler == 0) + if(!is_importvia_poppler) { // native importer doc = SPDocument::createNewDoc(NULL, TRUE, TRUE); @@ -769,8 +787,6 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) { if (dlg) dlg->getImportSettings(prefs); - printf("pdf import via %s.", (is_importvia_poppler != 0) ? "poppler" : "native"); - // Apply crop settings PDFRectangle *clipToBox = NULL; double crop_setting; @@ -798,11 +814,11 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) { } } - // Create parser + // Create parser (extension/internal/pdfinput/pdf-parser.h) PdfParser *pdf_parser = new PdfParser(pdf_doc->getXRef(), builder, page_num-1, page->getRotate(), page->getResourceDict(), page->getCropBox(), clipToBox); - // Set up approximation precision for parser + // Set up approximation precision for parser. Used for convering Mesh Gradients into tiles. double color_delta; sp_repr_get_double(prefs, "approximationPrecision", &color_delta); if ( color_delta <= 0.0 ) { @@ -833,7 +849,7 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) { // the poppler import gchar* filename_uri = g_filename_to_uri(uri, NULL, NULL); GError *error = NULL; - /// @todo handle passwort + /// @todo handle password /// @todo check if win32 unicode needs special attention PopplerDocument* document = poppler_document_new_from_file(filename_uri, NULL, &error); @@ -867,7 +883,7 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) { } else { - doc = SPDocument::createNewDoc(NULL, TRUE, TRUE); // fallback create empthy document + doc = SPDocument::createNewDoc(NULL, TRUE, TRUE); // fallback create empty document } saved = DocumentUndo::getUndoSensitive(doc); DocumentUndo::setUndoSensitive(doc, false); // No need to undo in this temporary document diff --git a/src/extension/internal/pdfinput/pdf-input.h b/src/extension/internal/pdfinput/pdf-input.h index 866db5d82..6e36603c3 100644 --- a/src/extension/internal/pdfinput/pdf-input.h +++ b/src/extension/internal/pdfinput/pdf-input.h @@ -44,6 +44,7 @@ namespace Gtk { #else class HScale; #endif + class RadioButton; class VBox; class Label; } @@ -71,7 +72,7 @@ public: bool showDialog(); int getSelectedPage(); - int getImportMethod(); + bool getImportMethod(); void getImportSettings(Inkscape::XML::Node *prefs); private: @@ -86,7 +87,10 @@ private: void _onPageNumberChanged(); void _onToggleCropping(); void _onPrecisionChanged(); - +#ifdef HAVE_POPPLER_CAIRO + void _onToggleImport(); +#endif + class Gtk::Button * cancelbutton; class Gtk::Button * okbutton; class Gtk::Label * _labelSelect; @@ -101,7 +105,10 @@ private: class Gtk::Label * _labelPrecision; class Gtk::Label * _labelPrecisionWarning; #ifdef HAVE_POPPLER_CAIRO - class Gtk::CheckButton * _importviaPopplerCheck; // using poppler_cairo for importing + class Gtk::RadioButton * _importViaPoppler; // Use poppler_cairo importing + class Gtk::Label * _labelViaPoppler; + class Gtk::RadioButton * _importViaInternal; // Use native (poppler based) importing + class Gtk::Label * _labelViaInternal; #endif #if WITH_GTKMM_3_0 class Gtk::Scale * _fallbackPrecisionSlider; -- cgit v1.2.3 From e362cec58fb273941e3aea562ba042e2e9b95c98 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Sun, 24 May 2015 13:11:43 +0200 Subject: Respect PDF image 'interpolate' value on import. (bzr r14171) --- src/extension/internal/pdfinput/pdf-parser.cpp | 47 +++++++++++++++++++++---- src/extension/internal/pdfinput/svg-builder.cpp | 36 ++++++++++++------- src/extension/internal/pdfinput/svg-builder.h | 17 ++++----- 3 files changed, 73 insertions(+), 27 deletions(-) (limited to 'src/extension') diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp index cc0b38515..836c34c32 100644 --- a/src/extension/internal/pdfinput/pdf-parser.cpp +++ b/src/extension/internal/pdfinput/pdf-parser.cpp @@ -2780,12 +2780,14 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) Dict *dict; int width, height; int bits; + GBool interpolate; StreamColorSpaceMode csMode; GBool mask; GBool invert; Object maskObj, smaskObj; GBool haveColorKeyMask, haveExplicitMask, haveSoftMask; GBool maskInvert; + GBool maskInterpolate; Object obj1, obj2; // get info from the stream @@ -2828,6 +2830,19 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) } obj1.free(); + // image interpolation + dict->lookup("Interpolate", &obj1); + if (obj1.isNull()) { + obj1.free(); + dict->lookup("I", &obj1); + } + if (obj1.isBool()) + interpolate = obj1.getBool(); + else + interpolate = gFalse; + obj1.free(); + maskInterpolate = gFalse; + // image or mask? dict->lookup(const_cast("ImageMask"), &obj1); if (obj1.isNull()) { @@ -2884,7 +2899,7 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) obj1.free(); // draw it - builder->addImageMask(state, str, width, height, invert); + builder->addImageMask(state, str, width, height, invert, interpolate); } else { // get color space and color map @@ -2986,6 +3001,16 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) } int maskBits = obj1.getInt(); obj1.free(); + maskDict->lookup("Interpolate", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("I", &obj1); + } + if (obj1.isBool()) + maskInterpolate = obj1.getBool(); + else + maskInterpolate = gFalse; + obj1.free(); maskDict->lookup(const_cast("ColorSpace"), &obj1); if (obj1.isNull()) { obj1.free(); @@ -3071,6 +3096,16 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) goto err2; } obj1.free(); + maskDict->lookup("Interpolate", &obj1); + if (obj1.isNull()) { + obj1.free(); + maskDict->lookup("I", &obj1); + } + if (obj1.isBool()) + maskInterpolate = obj1.getBool(); + else + maskInterpolate = gFalse; + obj1.free(); maskInvert = gFalse; maskDict->lookup(const_cast("Decode"), &obj1); if (obj1.isNull()) { @@ -3092,14 +3127,14 @@ void PdfParser::doImage(Object * /*ref*/, Stream *str, GBool inlineImg) // draw it if (haveSoftMask) { - builder->addSoftMaskedImage(state, str, width, height, colorMap, - maskStr, maskWidth, maskHeight, maskColorMap); + builder->addSoftMaskedImage(state, str, width, height, colorMap, interpolate, + maskStr, maskWidth, maskHeight, maskColorMap, maskInterpolate); delete maskColorMap; } else if (haveExplicitMask) { - builder->addMaskedImage(state, str, width, height, colorMap, - maskStr, maskWidth, maskHeight, maskInvert); + builder->addMaskedImage(state, str, width, height, colorMap, interpolate, + maskStr, maskWidth, maskHeight, maskInvert, maskInterpolate); } else { - builder->addImage(state, str, width, height, colorMap, + builder->addImage(state, str, width, height, colorMap, interpolate, haveColorKeyMask ? maskColors : static_cast(NULL)); } delete colorMap; diff --git a/src/extension/internal/pdfinput/svg-builder.cpp b/src/extension/internal/pdfinput/svg-builder.cpp index a3abb4045..58e2030d9 100644 --- a/src/extension/internal/pdfinput/svg-builder.cpp +++ b/src/extension/internal/pdfinput/svg-builder.cpp @@ -1485,7 +1485,9 @@ void png_flush_base64stream(png_structp png_ptr) * */ Inkscape::XML::Node *SvgBuilder::_createImage(Stream *str, int width, int height, - GfxImageColorMap *color_map, int *mask_colors, bool alpha_only, bool invert_alpha) { + GfxImageColorMap *color_map, bool interpolate, + int *mask_colors, bool alpha_only, + bool invert_alpha) { // Create PNG write struct png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); @@ -1655,6 +1657,13 @@ Inkscape::XML::Node *SvgBuilder::_createImage(Stream *str, int width, int height Inkscape::XML::Node *image_node = _xml_doc->createElement("svg:image"); sp_repr_set_svg_double(image_node, "width", 1); sp_repr_set_svg_double(image_node, "height", 1); + if( !interpolate ) { + SPCSSAttr *css = sp_repr_css_attr_new(); + // This should be changed after CSS4 Images widely supported. + sp_repr_css_set_property(css, "image-rendering", "optimizeSpeed"); + sp_repr_css_change(image_node, css, "style"); + sp_repr_css_attr_unref(css); + } // PS/PDF images are placed via a transformation matrix, no preserveAspectRatio used image_node->setAttribute("preserveAspectRatio", "none"); @@ -1715,9 +1724,9 @@ Inkscape::XML::Node *SvgBuilder::_createMask(double width, double height) { } void SvgBuilder::addImage(GfxState * /*state*/, Stream *str, int width, int height, - GfxImageColorMap *color_map, int *mask_colors) { + GfxImageColorMap *color_map, bool interpolate, int *mask_colors) { - Inkscape::XML::Node *image_node = _createImage(str, width, height, color_map, mask_colors); + Inkscape::XML::Node *image_node = _createImage(str, width, height, color_map, interpolate, mask_colors); if (image_node) { _container->appendChild(image_node); Inkscape::GC::release(image_node); @@ -1725,7 +1734,7 @@ void SvgBuilder::addImage(GfxState * /*state*/, Stream *str, int width, int heig } void SvgBuilder::addImageMask(GfxState *state, Stream *str, int width, int height, - bool invert) { + bool invert, bool interpolate) { // Create a rectangle Inkscape::XML::Node *rect = _xml_doc->createElement("svg:rect"); @@ -1742,7 +1751,8 @@ void SvgBuilder::addImageMask(GfxState *state, Stream *str, int width, int heigh // Scaling 1x1 surfaces might not work so skip setting a mask with this size if ( width > 1 || height > 1 ) { - Inkscape::XML::Node *mask_image_node = _createImage(str, width, height, NULL, NULL, true, invert); + Inkscape::XML::Node *mask_image_node = + _createImage(str, width, height, NULL, interpolate, NULL, true, invert); if (mask_image_node) { // Create the mask Inkscape::XML::Node *mask_node = _createMask(1.0, 1.0); @@ -1762,13 +1772,13 @@ void SvgBuilder::addImageMask(GfxState *state, Stream *str, int width, int heigh } void SvgBuilder::addMaskedImage(GfxState * /*state*/, Stream *str, int width, int height, - GfxImageColorMap *color_map, + GfxImageColorMap *color_map, bool interpolate, Stream *mask_str, int mask_width, int mask_height, - bool invert_mask) { + bool invert_mask, bool mask_interpolate) { Inkscape::XML::Node *mask_image_node = _createImage(mask_str, mask_width, mask_height, - NULL, NULL, true, invert_mask); - Inkscape::XML::Node *image_node = _createImage(str, width, height, color_map, NULL); + NULL, mask_interpolate, NULL, true, invert_mask); + Inkscape::XML::Node *image_node = _createImage(str, width, height, color_map, interpolate, NULL); if ( mask_image_node && image_node ) { // Create mask for the image Inkscape::XML::Node *mask_node = _createMask(1.0, 1.0); @@ -1795,13 +1805,13 @@ void SvgBuilder::addMaskedImage(GfxState * /*state*/, Stream *str, int width, in } void SvgBuilder::addSoftMaskedImage(GfxState * /*state*/, Stream *str, int width, int height, - GfxImageColorMap *color_map, + GfxImageColorMap *color_map, bool interpolate, Stream *mask_str, int mask_width, int mask_height, - GfxImageColorMap *mask_color_map) { + GfxImageColorMap *mask_color_map, bool mask_interpolate) { Inkscape::XML::Node *mask_image_node = _createImage(mask_str, mask_width, mask_height, - mask_color_map, NULL, true); - Inkscape::XML::Node *image_node = _createImage(str, width, height, color_map, NULL); + mask_color_map, mask_interpolate, NULL, true); + Inkscape::XML::Node *image_node = _createImage(str, width, height, color_map, interpolate, NULL); if ( mask_image_node && image_node ) { // Create mask for the image Inkscape::XML::Node *mask_node = _createMask(1.0, 1.0); diff --git a/src/extension/internal/pdfinput/svg-builder.h b/src/extension/internal/pdfinput/svg-builder.h index f1ce02cf0..ad15c9c06 100644 --- a/src/extension/internal/pdfinput/svg-builder.h +++ b/src/extension/internal/pdfinput/svg-builder.h @@ -112,17 +112,17 @@ public: // Image handling void addImage(GfxState *state, Stream *str, int width, int height, - GfxImageColorMap *color_map, int *mask_colors); + GfxImageColorMap *color_map, bool interpolate, int *mask_colors); void addImageMask(GfxState *state, Stream *str, int width, int height, - bool invert); + bool invert, bool interpolate); void addMaskedImage(GfxState *state, Stream *str, int width, int height, - GfxImageColorMap *color_map, + GfxImageColorMap *color_map, bool interpolate, Stream *mask_str, int mask_width, int mask_height, - bool invert_mask); + bool invert_mask, bool mask_interpolate); void addSoftMaskedImage(GfxState *state, Stream *str, int width, int height, - GfxImageColorMap *color_map, + GfxImageColorMap *color_map, bool interpolate, Stream *mask_str, int mask_width, int mask_height, - GfxImageColorMap *mask_color_map); + GfxImageColorMap *mask_color_map, bool mask_interpolate); // Transparency group and soft mask handling void pushTransparencyGroup(GfxState *state, double *bbox, @@ -180,8 +180,9 @@ private: bool is_stroke=false); // Image/mask creation Inkscape::XML::Node *_createImage(Stream *str, int width, int height, - GfxImageColorMap *color_map, int *mask_colors, - bool alpha_only=false, bool invert_alpha=false); + GfxImageColorMap *color_map, bool interpolate, + int *mask_colors, bool alpha_only=false, + bool invert_alpha=false); Inkscape::XML::Node *_createMask(double width, double height); // Style setting SPCSSAttr *_setStyle(GfxState *state, bool fill, bool stroke, bool even_odd=false); -- cgit v1.2.3 From ad6dce6b6ccf624a4cf31c8439d26180d9da8d80 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Sun, 24 May 2015 22:51:57 +0200 Subject: Fix crash in import of PDF via Poppler/Cairo with relative path. Fixed bugs: - https://launchpad.net/bugs/1351246 (bzr r14172) --- src/extension/internal/pdfinput/pdf-input.cpp | 50 +++++++++++++++------------ 1 file changed, 28 insertions(+), 22 deletions(-) (limited to 'src/extension') diff --git a/src/extension/internal/pdfinput/pdf-input.cpp b/src/extension/internal/pdfinput/pdf-input.cpp index 0fa5dc3df..2d0873233 100644 --- a/src/extension/internal/pdfinput/pdf-input.cpp +++ b/src/extension/internal/pdfinput/pdf-input.cpp @@ -81,7 +81,6 @@ PdfImportDialog::PdfImportDialog(PDFDoc *doc, const gchar */*uri*/) _poppler_doc = NULL; #endif // HAVE_POPPLER_CAIRO _pdf_doc = doc; - cancelbutton = Gtk::manage(new class Gtk::Button(Gtk::StockID("gtk-cancel"))); okbutton = Gtk::manage(new class Gtk::Button(Gtk::StockID("gtk-ok"))); _labelSelect = Gtk::manage(new class Gtk::Label(_("Select page:"))); @@ -311,11 +310,16 @@ PdfImportDialog::PdfImportDialog(PDFDoc *doc, const gchar */*uri*/) #ifdef HAVE_POPPLER_CAIRO _cairo_surface = NULL; _render_thumb = true; + // Create PopplerDocument - gchar *doc_uri = g_filename_to_uri(_pdf_doc->getFileName()->getCString(),NULL,NULL); - if (doc_uri) { - _poppler_doc = poppler_document_new_from_file(doc_uri, NULL, NULL); - g_free(doc_uri); + Glib::ustring filename = _pdf_doc->getFileName()->getCString(); + if (!Glib::path_is_absolute(filename)) { + filename = Glib::build_filename(Glib::get_current_dir(),filename); + } + Glib::ustring full_uri = Glib::filename_to_uri(filename); + + if (!full_uri.empty()) { + _poppler_doc = poppler_document_new_from_file(full_uri.c_str(), NULL, NULL); } // Set sensitivity of some widgets based on selected import type. @@ -688,7 +692,8 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) { } - // PDFDoc is from poppler. + // PDFDoc is from poppler. PDFDoc is used for preview and for native import. + #ifndef WIN32 // poppler does not use glib g_open. So on win32 we must use unicode call. code was copied from // glib gstdio.c @@ -747,18 +752,11 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) { } } - // Get needed page - int page_num; - if (dlg) - page_num = dlg->getSelectedPage(); - else - page_num = 1; - Catalog *catalog = pdf_doc->getCatalog(); - Page *page = catalog->getPage(page_num); - + // Get options + int page_num = 1; bool is_importvia_poppler = false; - if(dlg) - { + if (dlg) { + page_num = dlg->getSelectedPage(); #ifdef HAVE_POPPLER_CAIRO is_importvia_poppler = dlg->getImportMethod(); // printf("PDF import via %s.\n", is_importvia_poppler ? "poppler" : "native"); @@ -791,6 +789,10 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) { PDFRectangle *clipToBox = NULL; double crop_setting; sp_repr_get_double(prefs, "cropTo", &crop_setting); + + Catalog *catalog = pdf_doc->getCatalog(); + Page *page = catalog->getPage(page_num); + if ( crop_setting >= 0.0 ) { // Do page clipping int crop_choice = (int)crop_setting; switch (crop_choice) { @@ -847,13 +849,20 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) { { #ifdef HAVE_POPPLER_CAIRO // the poppler import - gchar* filename_uri = g_filename_to_uri(uri, NULL, NULL); + + Glib::ustring full_path = uri; + if (!Glib::path_is_absolute(uri)) { + full_path = Glib::build_filename(Glib::get_current_dir(),uri); + } + Glib::ustring full_uri = Glib::filename_to_uri(full_path); + GError *error = NULL; /// @todo handle password /// @todo check if win32 unicode needs special attention - PopplerDocument* document = poppler_document_new_from_file(filename_uri, NULL, &error); + PopplerDocument* document = poppler_document_new_from_file(full_uri.c_str(), NULL, &error); if(error != NULL) { + std::cerr << "PDFInput::open: error opening document: " << full_uri << std::endl; g_error_free (error); } @@ -887,9 +896,6 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) { } saved = DocumentUndo::getUndoSensitive(doc); DocumentUndo::setUndoSensitive(doc, false); // No need to undo in this temporary document - - // Cleanup - g_free(filename_uri); #endif } -- cgit v1.2.3 From 871e15cd5f6972b71649a9acec4bfa6ace63b3f6 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Tue, 26 May 2015 11:04:59 +0200 Subject: Fix Gtk3 build. (bzr r14177) --- src/extension/internal/pdfinput/pdf-input.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/extension') diff --git a/src/extension/internal/pdfinput/pdf-input.cpp b/src/extension/internal/pdfinput/pdf-input.cpp index 2d0873233..1cd409a0a 100644 --- a/src/extension/internal/pdfinput/pdf-input.cpp +++ b/src/extension/internal/pdfinput/pdf-input.cpp @@ -36,8 +36,14 @@ #include #include #include +#include #include +#if WITH_GTKMM_3_0 +#include +#include +#endif + #include "extension/system.h" #include "extension/input.h" #include "svg-builder.h" -- cgit v1.2.3 From ebcbea982c7b7dce6a5d3641e3a5d3a556b4d69f Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Wed, 27 May 2015 22:02:55 +0200 Subject: Add 'font-variant-xxx' to properties that should not be set on non-text elements. (bzr r14179) --- src/extension/internal/pdfinput/pdf-parser.cpp | 35 +++++++ src/extension/internal/pdfinput/svg-builder.cpp | 132 ++++++++++++++++++++++-- 2 files changed, 159 insertions(+), 8 deletions(-) (limited to 'src/extension') diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp index 836c34c32..a70b42d41 100644 --- a/src/extension/internal/pdfinput/pdf-parser.cpp +++ b/src/extension/internal/pdfinput/pdf-parser.cpp @@ -409,6 +409,7 @@ PdfParser::~PdfParser() { } } +// Equivalent to Gfx::display() void PdfParser::parse(Object *obj, GBool topLevel) { Object obj2; @@ -1578,11 +1579,13 @@ void PdfParser::opCloseStroke(Object * /*args[]*/, int /*numArgs*/) { void PdfParser::opFill(Object /*args*/[], int /*numArgs*/) { + std::cout << "PdfParser::opFill" << std::endl; if (!state->isCurPt()) { //error(getPos(), const_cast("No path in fill")); return; } if (state->isPath()) { + std::cout << " isPath" << std::endl; if (state->getFillColorSpace()->getMode() == csPattern && !builder->isPatternTypeSupported(state->getFillPattern())) { doPatternFillFallback(gFalse); @@ -1595,6 +1598,7 @@ void PdfParser::opFill(Object /*args*/[], int /*numArgs*/) void PdfParser::opEOFill(Object /*args*/[], int /*numArgs*/) { + std::cout << "PdfParser::opEOFill" << std::endl; if (!state->isCurPt()) { //error(getPos(), const_cast("No path in eofill")); return; @@ -1663,6 +1667,7 @@ void PdfParser::opCloseEOFillStroke(Object /*args*/[], int /*numArgs*/) } void PdfParser::doFillAndStroke(GBool eoFill) { + std::cout << "PdfParser::doFillandStroke()" << std::endl; GBool fillOk = gTrue, strokeOk = gTrue; if (state->getFillColorSpace()->getMode() == csPattern && !builder->isPatternTypeSupported(state->getFillPattern())) { @@ -1673,14 +1678,17 @@ void PdfParser::doFillAndStroke(GBool eoFill) { strokeOk = gFalse; } if (fillOk && strokeOk) { + std::cout << " ... fillOk and StrokeOk" << std::endl; builder->addPath(state, true, true, eoFill); } else { + std::cout << " ... fillOk or StrokeOk not OK" << std::endl; doPatternFillFallback(eoFill); doPatternStrokeFallback(); } } void PdfParser::doPatternFillFallback(GBool eoFill) { + std::cout << "PdfParser::doPatternFillFallback: " << eoFill << std::endl; GfxPattern *pattern; if (!(pattern = state->getFillPattern())) { @@ -1704,6 +1712,7 @@ void PdfParser::doPatternFillFallback(GBool eoFill) { } void PdfParser::doPatternStrokeFallback() { + std::cout << "PdfParser::doPatternStrokeFallback" << std::endl; GfxPattern *pattern; if (!(pattern = state->getStrokePattern())) { @@ -1737,6 +1746,8 @@ void PdfParser::doShadingPatternFillFallback(GfxShadingPattern *sPat, shading = sPat->getShading(); + std::cout << "PdfParser::doShadingPatternFillFallback: " << shading->getType() << std::endl; + // save current graphics state savedPath = state->getPath()->copy(); saveState(); @@ -1823,6 +1834,12 @@ void PdfParser::doShadingPatternFillFallback(GfxShadingPattern *sPat, break; case 6: case 7: + std::cout << " Type 6/7: calling doPatchMeshShFill()" + << " Clip path? " << (clipHistory->getClipPath()?"true":"false") << std::endl; + if (clipHistory->getClipPath()) { + builder->addShadedFill(shading, NULL, clipHistory->getClipPath(), + clipHistory->getClipType() == clipEO ? true : false); + } doPatchMeshShFill(static_cast(shading)); break; } @@ -1856,6 +1873,7 @@ void PdfParser::opShFill(Object args[], int /*numArgs*/) return; } #endif + std::cout << "PdfParser::opShFill: type: " << shading->getType() << std::endl; // save current graphics state if (shading->getType() != 2 && shading->getType() != 3) { @@ -1943,6 +1961,12 @@ void PdfParser::opShFill(Object args[], int /*numArgs*/) break; case 6: case 7: + std::cout << " Type 6/7: calling doPatchMeshShFill()" + << " Clip path? " << (clipHistory->getClipPath()?"true":"false") << std::endl; + if (clipHistory->getClipPath()) { + builder->addShadedFill(shading, matrix, clipHistory->getClipPath(), + clipHistory->getClipType() == clipEO ? true : false); + } doPatchMeshShFill(static_cast(shading)); break; } @@ -2141,6 +2165,10 @@ void PdfParser::gouraudFillTriangle(double x0, double y0, GfxColor *color0, void PdfParser::doPatchMeshShFill(GfxPatchMeshShading *shading) { int start, i; + // if( true ) { + // builder->patchMeshShadedFill( state, shading ); + // } + std::cout << "PdfParser::doPatchMeshShFill: Number of patches: " << shading->getNPatches() << std::endl; if (shading->getNPatches() > 128) { start = 3; } else if (shading->getNPatches() > 64) { @@ -2690,6 +2718,7 @@ void PdfParser::doShowText(GooString *s) { state->textTransformDelta(0, state->getRise(), &riseX, &riseY); p = s->getCString(); len = s->getLength(); + // std::cout << "PDFParser::doShowText: p: " << (p?p:"null") << " " << len << std::endl; while (len > 0) { n = font->getNextChar(p, len, &code, &u, &uLen, /* TODO: This looks like a memory leak for u. */ @@ -2713,6 +2742,12 @@ void PdfParser::doShowText(GooString *s) { originX *= state->getFontSize(); originY *= state->getFontSize(); state->textTransformDelta(originX, originY, &tOriginX, &tOriginY); + // std::cout << " dx: " << dx << " dy: " << dy + // << " originX: " << originX << " originY: " << originY + // << " tOriginX: " << tOriginX << " tOriginY: " << tOriginY + // << " riseX: " << riseX << " riseY: " << riseY + // << " curX: " << state->getCurX() + riseX + // << " curY: " << state->getCurY() + riseY << std::endl; builder->addChar(state, state->getCurX() + riseX, state->getCurY() + riseY, dx, dy, tOriginX, tOriginY, code, n, u, uLen); state->shift(tdx, tdy); diff --git a/src/extension/internal/pdfinput/svg-builder.cpp b/src/extension/internal/pdfinput/svg-builder.cpp index 58e2030d9..f104316a7 100644 --- a/src/extension/internal/pdfinput/svg-builder.cpp +++ b/src/extension/internal/pdfinput/svg-builder.cpp @@ -461,9 +461,17 @@ void SvgBuilder::addPath(GfxState *state, bool fill, bool stroke, bool even_odd) void SvgBuilder::addShadedFill(GfxShading *shading, double *matrix, GfxPath *path, bool even_odd) { + std::cout << "SvgBuilder::addShadedFill: " << shading->getType() << std::endl; Inkscape::XML::Node *path_node = _xml_doc->createElement("svg:path"); gchar *pathtext = svgInterpretPath(path); path_node->setAttribute("d", pathtext); + if ( shading->getType() == 6 || shading->getType() == 7) { + path_node->setAttribute("id", "MyMesh"); + std::cout << " pathtext: " << (pathtext?pathtext:"null") << std::endl; + std::cout << " " << path_node->name() << std::endl; + //g_free(pathtext); + //return; + } g_free(pathtext); // Set style @@ -601,7 +609,9 @@ bool SvgBuilder::isPatternTypeSupported(GfxPattern *pattern) { GfxShading *shading = (static_cast(pattern))->getShading(); int shadingType = shading->getType(); if ( shadingType == 2 || // axial shading - shadingType == 3 ) { // radial shading + shadingType == 3 || // radial shading + shadingType == 6 || // Coons patch + shadingType == 7) { // Tensor patch return true; } return false; @@ -782,6 +792,110 @@ gchar *SvgBuilder::_createGradient(GfxShading *shading, double *matrix, bool for extend1 = radial_shading->getExtend1(); num_funcs = radial_shading->getNFuncs(); func = radial_shading->getFunc(0); + } else if (shading->getType() == 6 || shading->getType() == 7) { // Mesh shading + GfxPatchMeshShading *mesh_shading = static_cast(shading); + std::cout << "SVGBuilder::_createGradient: Number of patches: " + << mesh_shading->getNPatches() << std::endl; + for( unsigned i=0; i < mesh_shading->getNPatches(); ++i ) { + GfxPatch *patch = mesh_shading->getPatch(i); + + std::cout << " Patch: " << i << " " + << "(" << patch->x[0][0] << "," << patch->y[0][0] << ") " + << "(" << patch->x[3][0] << "," << patch->y[3][0] << ") " + << "(" << patch->x[3][3] << "," << patch->y[3][3] << ") " + << "(" << patch->x[0][3] << "," << patch->y[0][3] << ") " + << std::endl; + if (i > 0 ) continue; // We can't handle multiple meshes + std::cout << " Creating mesh" << std::endl; + // Mesh + gradient = _xml_doc->createElement("svg:mesh"); + sp_repr_set_svg_double(gradient, "x", patch->x[0][0]); + sp_repr_set_svg_double(gradient, "y", patch->y[0][0]); + + std::cout << " Creating mesh row" << std::endl; + // Mesh Row + Inkscape::XML::Node *meshrow = _xml_doc->createElement("svg:meshrow"); + + std::cout << " Creating mesh patch" << std::endl; + // Mesh Patch + Inkscape::XML::Node *meshpatch = _xml_doc->createElement("svg:meshpatch"); + + std::cout << " Creating stops" << std::endl; + // Mesh Stops + Inkscape::XML::Node *stop0 = _xml_doc->createElement("svg:stop"); + Inkscape::XML::Node *stop1 = _xml_doc->createElement("svg:stop"); + Inkscape::XML::Node *stop2 = _xml_doc->createElement("svg:stop"); + Inkscape::XML::Node *stop3 = _xml_doc->createElement("svg:stop"); + Inkscape::SVG::PathString pathString0; + Inkscape::SVG::PathString pathString1; + Inkscape::SVG::PathString pathString2; + Inkscape::SVG::PathString pathString3; + pathString0.curveTo(patch->x[1][0]-patch->x[0][0], patch->y[1][0]-patch->y[0][0], + patch->x[2][0]-patch->x[0][0], patch->y[2][0]-patch->y[0][0], + patch->x[3][0]-patch->x[0][0], patch->y[3][0]-patch->y[0][0]); + pathString1.curveTo(patch->x[3][1]-patch->x[3][0], patch->y[3][1]-patch->y[3][0], + patch->x[3][2]-patch->x[3][0], patch->y[3][2]-patch->y[3][0], + patch->x[3][3]-patch->x[3][0], patch->y[3][3]-patch->y[3][0]); + pathString2.curveTo(patch->x[2][3]-patch->x[3][3], patch->y[2][3]-patch->y[3][3], + patch->x[1][3]-patch->x[3][3], patch->y[1][3]-patch->y[3][3], + patch->x[0][3]-patch->x[3][3], patch->y[0][3]-patch->y[3][3]); + pathString3.curveTo(patch->x[0][2]-patch->x[0][3], patch->y[0][2]-patch->y[0][3], + patch->x[0][1]-patch->x[0][3], patch->y[0][1]-patch->y[0][3], + patch->x[0][0]-patch->x[0][3], patch->y[0][0]-patch->y[0][3]); + std::cout << " path0: " << pathString0.c_str() << std::endl; + std::cout << " path1: " << pathString1.c_str() << std::endl; + std::cout << " path2: " << pathString2.c_str() << std::endl; + std::cout << " path3: " << pathString3.c_str() << std::endl; + stop0->setAttribute("path", pathString0.c_str()); + stop1->setAttribute("path", pathString1.c_str()); + stop2->setAttribute("path", pathString2.c_str()); + stop3->setAttribute("path", pathString3.c_str()); + SPCSSAttr *css0 = sp_repr_css_attr_new(); + SPCSSAttr *css1 = sp_repr_css_attr_new(); + SPCSSAttr *css2 = sp_repr_css_attr_new(); + SPCSSAttr *css3 = sp_repr_css_attr_new(); + // See comment in GfxState.h if there is more than one patch. + //gchar *color_text0 = svgConvertGfxRGB(patch->color[0][0]); + //gchar *color_text1 = svgConvertGfxRGB(patch->color[1][0]); + //gchar *color_text2 = svgConvertGfxRGB(patch->color[1][1]); + //gchar *color_text3 = svgConvertGfxRGB(patch->color[0][1]); + //sp_repr_css_set_property(css0, "stop-color", color_text0); + //sp_repr_css_set_property(css1, "stop-color", color_text1); + //sp_repr_css_set_property(css2, "stop-color", color_text2); + //sp_repr_css_set_property(css3, "stop-color", color_text3); + sp_repr_css_set_property(css0, "stop-color", "#ff0000"); + sp_repr_css_set_property(css1, "stop-color", "#0000ff"); + sp_repr_css_set_property(css2, "stop-color", "#00ff00"); + sp_repr_css_set_property(css3, "stop-color", "#ff00ff"); + sp_repr_css_set_property(css0, "stop-opacity", "1"); + sp_repr_css_set_property(css1, "stop-opacity", "1"); + sp_repr_css_set_property(css2, "stop-opacity", "1"); + sp_repr_css_set_property(css3, "stop-opacity", "1"); + sp_repr_css_change(stop0, css0, "style"); + sp_repr_css_change(stop1, css1, "style"); + sp_repr_css_change(stop2, css2, "style"); + sp_repr_css_change(stop3, css3, "style"); + sp_repr_css_attr_unref(css0); + sp_repr_css_attr_unref(css1); + sp_repr_css_attr_unref(css2); + sp_repr_css_attr_unref(css3); + + // Put them into document. + meshpatch->appendChild(stop0); + meshpatch->appendChild(stop1); + meshpatch->appendChild(stop2); + meshpatch->appendChild(stop3); + meshrow->appendChild(meshpatch); + gradient->appendChild(meshrow); + + Inkscape::GC::release(meshpatch); + Inkscape::GC::release(meshrow); + Inkscape::GC::release(stop0); + Inkscape::GC::release(stop1); + Inkscape::GC::release(stop2); + Inkscape::GC::release(stop3); + std::cout << " exit" << std::endl; + } } else { // Unsupported shading type return NULL; } @@ -799,20 +913,21 @@ gchar *SvgBuilder::_createGradient(GfxShading *shading, double *matrix, bool for g_free(transform_text); } - if ( extend0 && extend1 ) { - gradient->setAttribute("spreadMethod", "pad"); - } + // if ( extend0 && extend1 ) { + // gradient->setAttribute("spreadMethod", "pad"); + // } - if ( num_funcs > 1 || !_addGradientStops(gradient, shading, func) ) { - Inkscape::GC::release(gradient); - return NULL; - } + // if ( num_funcs > 1 || !_addGradientStops(gradient, shading, func) ) { + // Inkscape::GC::release(gradient); + // return NULL; + // } Inkscape::XML::Node *defs = _doc->getDefs()->getRepr(); defs->appendChild(gradient); gchar *id = g_strdup(gradient->attribute("id")); Inkscape::GC::release(gradient); + std::cout << " Exit: " << id << std::endl; return id; } @@ -1414,6 +1529,7 @@ void SvgBuilder::addChar(GfxState *state, double x, double y, } gchar *tmp = g_utf16_to_utf8(uu, uLen, NULL, NULL, NULL); + // std::cout << "tmp: " << (tmp?tmp:"null") << std::endl; if ( tmp && *tmp ) { new_glyph.code = tmp; } else { -- cgit v1.2.3 From 158e9e378bd4875a27b57883d3f75415fb119e01 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Wed, 27 May 2015 22:31:43 +0200 Subject: Revert unintended changes. (bzr r14181) --- src/extension/internal/pdfinput/pdf-parser.cpp | 35 ------- src/extension/internal/pdfinput/svg-builder.cpp | 132 ++---------------------- 2 files changed, 8 insertions(+), 159 deletions(-) (limited to 'src/extension') diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp index a70b42d41..836c34c32 100644 --- a/src/extension/internal/pdfinput/pdf-parser.cpp +++ b/src/extension/internal/pdfinput/pdf-parser.cpp @@ -409,7 +409,6 @@ PdfParser::~PdfParser() { } } -// Equivalent to Gfx::display() void PdfParser::parse(Object *obj, GBool topLevel) { Object obj2; @@ -1579,13 +1578,11 @@ void PdfParser::opCloseStroke(Object * /*args[]*/, int /*numArgs*/) { void PdfParser::opFill(Object /*args*/[], int /*numArgs*/) { - std::cout << "PdfParser::opFill" << std::endl; if (!state->isCurPt()) { //error(getPos(), const_cast("No path in fill")); return; } if (state->isPath()) { - std::cout << " isPath" << std::endl; if (state->getFillColorSpace()->getMode() == csPattern && !builder->isPatternTypeSupported(state->getFillPattern())) { doPatternFillFallback(gFalse); @@ -1598,7 +1595,6 @@ void PdfParser::opFill(Object /*args*/[], int /*numArgs*/) void PdfParser::opEOFill(Object /*args*/[], int /*numArgs*/) { - std::cout << "PdfParser::opEOFill" << std::endl; if (!state->isCurPt()) { //error(getPos(), const_cast("No path in eofill")); return; @@ -1667,7 +1663,6 @@ void PdfParser::opCloseEOFillStroke(Object /*args*/[], int /*numArgs*/) } void PdfParser::doFillAndStroke(GBool eoFill) { - std::cout << "PdfParser::doFillandStroke()" << std::endl; GBool fillOk = gTrue, strokeOk = gTrue; if (state->getFillColorSpace()->getMode() == csPattern && !builder->isPatternTypeSupported(state->getFillPattern())) { @@ -1678,17 +1673,14 @@ void PdfParser::doFillAndStroke(GBool eoFill) { strokeOk = gFalse; } if (fillOk && strokeOk) { - std::cout << " ... fillOk and StrokeOk" << std::endl; builder->addPath(state, true, true, eoFill); } else { - std::cout << " ... fillOk or StrokeOk not OK" << std::endl; doPatternFillFallback(eoFill); doPatternStrokeFallback(); } } void PdfParser::doPatternFillFallback(GBool eoFill) { - std::cout << "PdfParser::doPatternFillFallback: " << eoFill << std::endl; GfxPattern *pattern; if (!(pattern = state->getFillPattern())) { @@ -1712,7 +1704,6 @@ void PdfParser::doPatternFillFallback(GBool eoFill) { } void PdfParser::doPatternStrokeFallback() { - std::cout << "PdfParser::doPatternStrokeFallback" << std::endl; GfxPattern *pattern; if (!(pattern = state->getStrokePattern())) { @@ -1746,8 +1737,6 @@ void PdfParser::doShadingPatternFillFallback(GfxShadingPattern *sPat, shading = sPat->getShading(); - std::cout << "PdfParser::doShadingPatternFillFallback: " << shading->getType() << std::endl; - // save current graphics state savedPath = state->getPath()->copy(); saveState(); @@ -1834,12 +1823,6 @@ void PdfParser::doShadingPatternFillFallback(GfxShadingPattern *sPat, break; case 6: case 7: - std::cout << " Type 6/7: calling doPatchMeshShFill()" - << " Clip path? " << (clipHistory->getClipPath()?"true":"false") << std::endl; - if (clipHistory->getClipPath()) { - builder->addShadedFill(shading, NULL, clipHistory->getClipPath(), - clipHistory->getClipType() == clipEO ? true : false); - } doPatchMeshShFill(static_cast(shading)); break; } @@ -1873,7 +1856,6 @@ void PdfParser::opShFill(Object args[], int /*numArgs*/) return; } #endif - std::cout << "PdfParser::opShFill: type: " << shading->getType() << std::endl; // save current graphics state if (shading->getType() != 2 && shading->getType() != 3) { @@ -1961,12 +1943,6 @@ void PdfParser::opShFill(Object args[], int /*numArgs*/) break; case 6: case 7: - std::cout << " Type 6/7: calling doPatchMeshShFill()" - << " Clip path? " << (clipHistory->getClipPath()?"true":"false") << std::endl; - if (clipHistory->getClipPath()) { - builder->addShadedFill(shading, matrix, clipHistory->getClipPath(), - clipHistory->getClipType() == clipEO ? true : false); - } doPatchMeshShFill(static_cast(shading)); break; } @@ -2165,10 +2141,6 @@ void PdfParser::gouraudFillTriangle(double x0, double y0, GfxColor *color0, void PdfParser::doPatchMeshShFill(GfxPatchMeshShading *shading) { int start, i; - // if( true ) { - // builder->patchMeshShadedFill( state, shading ); - // } - std::cout << "PdfParser::doPatchMeshShFill: Number of patches: " << shading->getNPatches() << std::endl; if (shading->getNPatches() > 128) { start = 3; } else if (shading->getNPatches() > 64) { @@ -2718,7 +2690,6 @@ void PdfParser::doShowText(GooString *s) { state->textTransformDelta(0, state->getRise(), &riseX, &riseY); p = s->getCString(); len = s->getLength(); - // std::cout << "PDFParser::doShowText: p: " << (p?p:"null") << " " << len << std::endl; while (len > 0) { n = font->getNextChar(p, len, &code, &u, &uLen, /* TODO: This looks like a memory leak for u. */ @@ -2742,12 +2713,6 @@ void PdfParser::doShowText(GooString *s) { originX *= state->getFontSize(); originY *= state->getFontSize(); state->textTransformDelta(originX, originY, &tOriginX, &tOriginY); - // std::cout << " dx: " << dx << " dy: " << dy - // << " originX: " << originX << " originY: " << originY - // << " tOriginX: " << tOriginX << " tOriginY: " << tOriginY - // << " riseX: " << riseX << " riseY: " << riseY - // << " curX: " << state->getCurX() + riseX - // << " curY: " << state->getCurY() + riseY << std::endl; builder->addChar(state, state->getCurX() + riseX, state->getCurY() + riseY, dx, dy, tOriginX, tOriginY, code, n, u, uLen); state->shift(tdx, tdy); diff --git a/src/extension/internal/pdfinput/svg-builder.cpp b/src/extension/internal/pdfinput/svg-builder.cpp index f104316a7..58e2030d9 100644 --- a/src/extension/internal/pdfinput/svg-builder.cpp +++ b/src/extension/internal/pdfinput/svg-builder.cpp @@ -461,17 +461,9 @@ void SvgBuilder::addPath(GfxState *state, bool fill, bool stroke, bool even_odd) void SvgBuilder::addShadedFill(GfxShading *shading, double *matrix, GfxPath *path, bool even_odd) { - std::cout << "SvgBuilder::addShadedFill: " << shading->getType() << std::endl; Inkscape::XML::Node *path_node = _xml_doc->createElement("svg:path"); gchar *pathtext = svgInterpretPath(path); path_node->setAttribute("d", pathtext); - if ( shading->getType() == 6 || shading->getType() == 7) { - path_node->setAttribute("id", "MyMesh"); - std::cout << " pathtext: " << (pathtext?pathtext:"null") << std::endl; - std::cout << " " << path_node->name() << std::endl; - //g_free(pathtext); - //return; - } g_free(pathtext); // Set style @@ -609,9 +601,7 @@ bool SvgBuilder::isPatternTypeSupported(GfxPattern *pattern) { GfxShading *shading = (static_cast(pattern))->getShading(); int shadingType = shading->getType(); if ( shadingType == 2 || // axial shading - shadingType == 3 || // radial shading - shadingType == 6 || // Coons patch - shadingType == 7) { // Tensor patch + shadingType == 3 ) { // radial shading return true; } return false; @@ -792,110 +782,6 @@ gchar *SvgBuilder::_createGradient(GfxShading *shading, double *matrix, bool for extend1 = radial_shading->getExtend1(); num_funcs = radial_shading->getNFuncs(); func = radial_shading->getFunc(0); - } else if (shading->getType() == 6 || shading->getType() == 7) { // Mesh shading - GfxPatchMeshShading *mesh_shading = static_cast(shading); - std::cout << "SVGBuilder::_createGradient: Number of patches: " - << mesh_shading->getNPatches() << std::endl; - for( unsigned i=0; i < mesh_shading->getNPatches(); ++i ) { - GfxPatch *patch = mesh_shading->getPatch(i); - - std::cout << " Patch: " << i << " " - << "(" << patch->x[0][0] << "," << patch->y[0][0] << ") " - << "(" << patch->x[3][0] << "," << patch->y[3][0] << ") " - << "(" << patch->x[3][3] << "," << patch->y[3][3] << ") " - << "(" << patch->x[0][3] << "," << patch->y[0][3] << ") " - << std::endl; - if (i > 0 ) continue; // We can't handle multiple meshes - std::cout << " Creating mesh" << std::endl; - // Mesh - gradient = _xml_doc->createElement("svg:mesh"); - sp_repr_set_svg_double(gradient, "x", patch->x[0][0]); - sp_repr_set_svg_double(gradient, "y", patch->y[0][0]); - - std::cout << " Creating mesh row" << std::endl; - // Mesh Row - Inkscape::XML::Node *meshrow = _xml_doc->createElement("svg:meshrow"); - - std::cout << " Creating mesh patch" << std::endl; - // Mesh Patch - Inkscape::XML::Node *meshpatch = _xml_doc->createElement("svg:meshpatch"); - - std::cout << " Creating stops" << std::endl; - // Mesh Stops - Inkscape::XML::Node *stop0 = _xml_doc->createElement("svg:stop"); - Inkscape::XML::Node *stop1 = _xml_doc->createElement("svg:stop"); - Inkscape::XML::Node *stop2 = _xml_doc->createElement("svg:stop"); - Inkscape::XML::Node *stop3 = _xml_doc->createElement("svg:stop"); - Inkscape::SVG::PathString pathString0; - Inkscape::SVG::PathString pathString1; - Inkscape::SVG::PathString pathString2; - Inkscape::SVG::PathString pathString3; - pathString0.curveTo(patch->x[1][0]-patch->x[0][0], patch->y[1][0]-patch->y[0][0], - patch->x[2][0]-patch->x[0][0], patch->y[2][0]-patch->y[0][0], - patch->x[3][0]-patch->x[0][0], patch->y[3][0]-patch->y[0][0]); - pathString1.curveTo(patch->x[3][1]-patch->x[3][0], patch->y[3][1]-patch->y[3][0], - patch->x[3][2]-patch->x[3][0], patch->y[3][2]-patch->y[3][0], - patch->x[3][3]-patch->x[3][0], patch->y[3][3]-patch->y[3][0]); - pathString2.curveTo(patch->x[2][3]-patch->x[3][3], patch->y[2][3]-patch->y[3][3], - patch->x[1][3]-patch->x[3][3], patch->y[1][3]-patch->y[3][3], - patch->x[0][3]-patch->x[3][3], patch->y[0][3]-patch->y[3][3]); - pathString3.curveTo(patch->x[0][2]-patch->x[0][3], patch->y[0][2]-patch->y[0][3], - patch->x[0][1]-patch->x[0][3], patch->y[0][1]-patch->y[0][3], - patch->x[0][0]-patch->x[0][3], patch->y[0][0]-patch->y[0][3]); - std::cout << " path0: " << pathString0.c_str() << std::endl; - std::cout << " path1: " << pathString1.c_str() << std::endl; - std::cout << " path2: " << pathString2.c_str() << std::endl; - std::cout << " path3: " << pathString3.c_str() << std::endl; - stop0->setAttribute("path", pathString0.c_str()); - stop1->setAttribute("path", pathString1.c_str()); - stop2->setAttribute("path", pathString2.c_str()); - stop3->setAttribute("path", pathString3.c_str()); - SPCSSAttr *css0 = sp_repr_css_attr_new(); - SPCSSAttr *css1 = sp_repr_css_attr_new(); - SPCSSAttr *css2 = sp_repr_css_attr_new(); - SPCSSAttr *css3 = sp_repr_css_attr_new(); - // See comment in GfxState.h if there is more than one patch. - //gchar *color_text0 = svgConvertGfxRGB(patch->color[0][0]); - //gchar *color_text1 = svgConvertGfxRGB(patch->color[1][0]); - //gchar *color_text2 = svgConvertGfxRGB(patch->color[1][1]); - //gchar *color_text3 = svgConvertGfxRGB(patch->color[0][1]); - //sp_repr_css_set_property(css0, "stop-color", color_text0); - //sp_repr_css_set_property(css1, "stop-color", color_text1); - //sp_repr_css_set_property(css2, "stop-color", color_text2); - //sp_repr_css_set_property(css3, "stop-color", color_text3); - sp_repr_css_set_property(css0, "stop-color", "#ff0000"); - sp_repr_css_set_property(css1, "stop-color", "#0000ff"); - sp_repr_css_set_property(css2, "stop-color", "#00ff00"); - sp_repr_css_set_property(css3, "stop-color", "#ff00ff"); - sp_repr_css_set_property(css0, "stop-opacity", "1"); - sp_repr_css_set_property(css1, "stop-opacity", "1"); - sp_repr_css_set_property(css2, "stop-opacity", "1"); - sp_repr_css_set_property(css3, "stop-opacity", "1"); - sp_repr_css_change(stop0, css0, "style"); - sp_repr_css_change(stop1, css1, "style"); - sp_repr_css_change(stop2, css2, "style"); - sp_repr_css_change(stop3, css3, "style"); - sp_repr_css_attr_unref(css0); - sp_repr_css_attr_unref(css1); - sp_repr_css_attr_unref(css2); - sp_repr_css_attr_unref(css3); - - // Put them into document. - meshpatch->appendChild(stop0); - meshpatch->appendChild(stop1); - meshpatch->appendChild(stop2); - meshpatch->appendChild(stop3); - meshrow->appendChild(meshpatch); - gradient->appendChild(meshrow); - - Inkscape::GC::release(meshpatch); - Inkscape::GC::release(meshrow); - Inkscape::GC::release(stop0); - Inkscape::GC::release(stop1); - Inkscape::GC::release(stop2); - Inkscape::GC::release(stop3); - std::cout << " exit" << std::endl; - } } else { // Unsupported shading type return NULL; } @@ -913,21 +799,20 @@ gchar *SvgBuilder::_createGradient(GfxShading *shading, double *matrix, bool for g_free(transform_text); } - // if ( extend0 && extend1 ) { - // gradient->setAttribute("spreadMethod", "pad"); - // } + if ( extend0 && extend1 ) { + gradient->setAttribute("spreadMethod", "pad"); + } - // if ( num_funcs > 1 || !_addGradientStops(gradient, shading, func) ) { - // Inkscape::GC::release(gradient); - // return NULL; - // } + if ( num_funcs > 1 || !_addGradientStops(gradient, shading, func) ) { + Inkscape::GC::release(gradient); + return NULL; + } Inkscape::XML::Node *defs = _doc->getDefs()->getRepr(); defs->appendChild(gradient); gchar *id = g_strdup(gradient->attribute("id")); Inkscape::GC::release(gradient); - std::cout << " Exit: " << id << std::endl; return id; } @@ -1529,7 +1414,6 @@ void SvgBuilder::addChar(GfxState *state, double x, double y, } gchar *tmp = g_utf16_to_utf8(uu, uLen, NULL, NULL, NULL); - // std::cout << "tmp: " << (tmp?tmp:"null") << std::endl; if ( tmp && *tmp ) { new_glyph.code = tmp; } else { -- cgit v1.2.3 From 74b8a70899955af0a132a1eb38bbe16b40110c73 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Fri, 29 May 2015 13:15:32 +0200 Subject: Use more fine-grain fallbacks for Poppler/Cairo PDF imports. (bzr r14184) --- src/extension/internal/pdfinput/pdf-input.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/extension') diff --git a/src/extension/internal/pdfinput/pdf-input.cpp b/src/extension/internal/pdfinput/pdf-input.cpp index 1cd409a0a..363061734 100644 --- a/src/extension/internal/pdfinput/pdf-input.cpp +++ b/src/extension/internal/pdfinput/pdf-input.cpp @@ -881,6 +881,13 @@ PdfInput::open(::Inkscape::Extension::Input * /*mod*/, const gchar * uri) { Glib::ustring output; cairo_surface_t* surface = cairo_svg_surface_create_for_stream(Inkscape::Extension::Internal::_write_ustring_cb, &output, width, height); + + // This magical function results in more fine-grain fallbacks. In particular, a mesh + // gradient won't necessarily result in the whole PDF being rasterized. Of course, SVG + // 1.2 never made it as a standard, but hey, we'll take what we can get. This trick was + // found by examining the 'pdftocairo' code. + cairo_svg_surface_restrict_to_version( surface, CAIRO_SVG_VERSION_1_2 ); + cairo_t* cr = cairo_create(surface); poppler_page_render_for_printing(page, cr); -- cgit v1.2.3