diff options
Diffstat (limited to 'share/extensions/image_attributes.py')
-rwxr-xr-x | share/extensions/image_attributes.py | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/share/extensions/image_attributes.py b/share/extensions/image_attributes.py new file mode 100755 index 0000000..7645b93 --- /dev/null +++ b/share/extensions/image_attributes.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python +# coding=utf-8 +# +# Copyright (C) 2015, ~suv <suv-sf@users.sf.net> +# +# This program 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +""" +image_attributes.py - adjust image attributes which don't have global +GUI options yet + +Tool for Inkscape 0.91 to adjust rendering of drawings with linked +or embedded bitmap images created with older versions of Inkscape +or third-party applications. +""" + +import inkex +from inkex import Image + +class ImageAttributes(inkex.EffectExtension): + """Set attributes in images""" + def effect(self): + self.options.tab_main() + + def add_arguments(self, pars): + pars.add_argument("--tab_main", type=self.arg_method(), default=self.method_tab_basic) + pars.add_argument("--fix_scaling", type=inkex.Boolean, default=True) + pars.add_argument("--fix_rendering", type=inkex.Boolean, default=False) + pars.add_argument("--aspect_ratio", default="none",\ + help="Value for attribute 'preserveAspectRatio'") + pars.add_argument("--aspect_clip", default="unset",\ + help="optional 'meetOrSlice' value") + pars.add_argument("--aspect_ratio_scope", type=self.arg_method("change"),\ + default="selected_only", help="When to edit 'preserveAspectRatio' attribute") + pars.add_argument("--image_rendering", default="unset",\ + help="Value for attribute 'image-rendering'") + pars.add_argument("--image_rendering_scope", type=self.arg_method("change"),\ + default="selected_only", help="When to edit 'image-rendering' attribute") + + def change_attribute(self, node, attribute): + for key, value in attribute.items(): + if key == 'preserveAspectRatio': + # set presentation attribute + if value != "unset": + node.set(key, str(value)) + else: + if node.get(key): + del node.attrib[key] + elif key == 'image-rendering': + node_style = dict(inkex.Style.parse_str(node.get('style'))) + if key not in node_style: + # set presentation attribute + if value != "unset": + node.set(key, str(value)) + else: + if node.get(key): + del node.attrib[key] + else: + # set style property + if value != "unset": + node_style[key] = str(value) + else: + del node_style[key] + node.set('style', str(inkex.Style(node_style))) + else: + pass + + def change_all_images(self, node, attribute): + for img in node.xpath('descendant-or-self::svg:image'): + self.change_attribute(img, attribute) + + def change_selected_only(self, selected, attribute): + for node in selected.values(): + if isinstance(node, Image): + self.change_attribute(node, attribute) + + def change_in_selection(self, selected, attribute): + for node in selected.values(): + self.change_all_images(node, attribute) + + def change_in_document(self, selected, attribute): + self.change_all_images(self.document.getroot(), attribute) + + def change_on_parent_group(self, selected, attribute): + for node in selected.values(): + self.change_attribute(node.getparent(), attribute) + + def change_on_root_only(self, selected, attribute): + self.change_attribute(self.document.getroot(), attribute) + + def method_tab_basic(self): + """Render all bitmap images like in older Inskcape versions""" + self.change_in_document(self.svg.selected, { + 'preserveAspectRatio': ("none" if self.options.fix_scaling else "unset"), + 'image-rendering': ("optimizeSpeed" if self.options.fix_rendering else "unset"), + }) + + def method_tab_aspect_ratio(self): + """Image Aspect Ratio""" + attr_val = [self.options.aspect_ratio] + if self.options.aspect_clip != "unset": + attr_val.append(self.options.aspect_clip) + self.options.aspect_ratio_scope(self.svg.selected,\ + {'preserveAspectRatio': ' '.join(attr_val)}) + + def method_tab_image_rendering(self): + """Image Rendering Quality""" + self.options.image_rendering_scope(self.svg.selected,\ + {'image-rendering': self.options.image_rendering}) + +if __name__ == '__main__': + ImageAttributes().run() |