summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2015-05-08 17:26:29 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2015-05-08 17:26:29 +0000
commitf31b2c75e1313ccceeb6d33cc14aa545d4d370f9 (patch)
tree444b38fe397f34ee5c298ed0efd5cc9f49afb7cf
parentMore helper/geom.h pruning. (diff)
parentcmake: Bring cmake installation in line with autotools (bug #1451481) (diff)
downloadinkscape-f31b2c75e1313ccceeb6d33cc14aa545d4d370f9.tar.gz
inkscape-f31b2c75e1313ccceeb6d33cc14aa545d4d370f9.zip
Merge from trunk
(bzr r14059.2.11)
-rw-r--r--.bzrignore11
-rw-r--r--AUTHORS1
-rw-r--r--CMakeLists.txt83
-rw-r--r--CMakeScripts/ConfigChecks.cmake3
-rw-r--r--CMakeScripts/ConfigPaths.cmake8
-rw-r--r--CMakeScripts/DefineDependsandFlags.cmake119
-rw-r--r--CMakeScripts/HelperFunctions.cmake19
-rw-r--r--CMakeScripts/Modules/FindIconv.cmake60
-rw-r--r--CMakeScripts/Modules/FindIntl.cmake127
-rw-r--r--CMakeScripts/Modules/FindLibCDR.cmake56
-rw-r--r--CMakeScripts/Modules/FindLibRevenge.cmake41
-rw-r--r--CMakeScripts/Modules/FindLibVisio.cmake56
-rw-r--r--CMakeScripts/Modules/FindLibWPG.cmake65
-rw-r--r--config.h.cmake24
-rw-r--r--po/ca.po160
-rw-r--r--po/de.po3357
-rw-r--r--po/is.po5543
-rw-r--r--po/ru.po2
-rw-r--r--share/CMakeLists.txt17
-rw-r--r--share/attributes/CMakeLists.txt2
-rw-r--r--share/branding/CMakeLists.txt2
-rw-r--r--share/examples/CMakeLists.txt2
-rw-r--r--share/extensions/CMakeLists.txt46
-rwxr-xr-xshare/extensions/synfig_prepare.py2
-rw-r--r--share/filters/CMakeLists.txt10
-rw-r--r--share/fonts/CMakeLists.txt1
-rw-r--r--share/gradients/CMakeLists.txt1
-rw-r--r--share/icons/CMakeLists.txt6
-rw-r--r--share/icons/application/CMakeLists.txt9
-rw-r--r--share/keys/CMakeLists.txt2
-rw-r--r--share/markers/CMakeLists.txt2
-rw-r--r--share/palettes/CMakeLists.txt13
-rw-r--r--share/patterns/CMakeLists.txt10
-rw-r--r--share/screens/CMakeLists.txt2
-rw-r--r--share/symbols/CMakeLists.txt11
-rw-r--r--share/templates/CMakeLists.txt11
-rw-r--r--share/tutorials/CMakeLists.txt2
-rw-r--r--share/ui/CMakeLists.txt3
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/attributes.cpp24
-rw-r--r--src/attributes.h23
-rw-r--r--src/conn-avoid-ref.cpp5
-rw-r--r--src/desktop-style.cpp121
-rw-r--r--src/desktop-style.h25
-rw-r--r--src/desktop.cpp3
-rw-r--r--src/desktop.h2
-rw-r--r--src/dir-util.cpp2
-rw-r--r--src/dir-util.h4
-rw-r--r--src/display/canvas-arena.cpp2
-rw-r--r--src/display/canvas-axonomgrid.cpp4
-rw-r--r--src/display/canvas-grid.cpp28
-rw-r--r--src/document.cpp36
-rw-r--r--src/document.h8
-rw-r--r--src/extension/CMakeLists.txt2
-rw-r--r--src/extension/dbus/document-interface.cpp46
-rw-r--r--src/extension/execution-env.cpp12
-rw-r--r--src/extension/extension.cpp4
-rw-r--r--src/extension/implementation/implementation.cpp8
-rw-r--r--src/extension/implementation/script.cpp28
-rw-r--r--src/extension/implementation/script.h2
-rw-r--r--src/extension/internal/bitmap/imagemagick.cpp22
-rw-r--r--src/extension/internal/bluredge.cpp6
-rw-r--r--src/extension/internal/cairo-render-context.cpp1
-rw-r--r--src/extension/internal/cairo-renderer.cpp8
-rw-r--r--src/extension/internal/cdr-input.h4
-rw-r--r--src/extension/internal/emf-inout.cpp50
-rw-r--r--src/extension/internal/emf-inout.h2
-rw-r--r--src/extension/internal/emf-print.cpp12
-rw-r--r--src/extension/internal/filter/filter.cpp6
-rw-r--r--src/extension/internal/grid.cpp13
-rw-r--r--src/extension/internal/latex-text-renderer.cpp8
-rw-r--r--src/extension/internal/pdfinput/pdf-input.h4
-rw-r--r--src/extension/internal/vsd-input.h4
-rw-r--r--src/extension/internal/wmf-inout.cpp74
-rw-r--r--src/extension/internal/wmf-print.cpp6
-rw-r--r--src/extension/param/bool.cpp4
-rw-r--r--src/extension/param/color.cpp4
-rw-r--r--src/extension/param/description.cpp4
-rw-r--r--src/extension/param/enum.cpp4
-rw-r--r--src/extension/param/float.cpp4
-rw-r--r--src/extension/param/int.cpp4
-rw-r--r--src/extension/param/notebook.cpp4
-rw-r--r--src/extension/param/radiobutton.cpp4
-rw-r--r--src/extension/param/string.cpp4
-rw-r--r--src/extension/prefdialog.h9
-rw-r--r--src/file.cpp13
-rw-r--r--src/gradient-chemistry.cpp12
-rw-r--r--src/gradient-drag.cpp19
-rw-r--r--src/graphlayout.cpp10
-rw-r--r--src/graphlayout.h4
-rw-r--r--src/helper-fns.h2
-rw-r--r--src/helper/geom-pathstroke.cpp204
-rw-r--r--src/helper/geom.cpp9
-rw-r--r--src/helper/png-write.cpp12
-rw-r--r--src/helper/png-write.h7
-rw-r--r--src/inkscape.cpp4
-rw-r--r--src/inkview.cpp2
-rw-r--r--src/libavoid/connector.cpp6
-rw-r--r--src/libavoid/graph.cpp4
-rw-r--r--src/libavoid/orthogonal.cpp1
-rw-r--r--src/libdepixelize/kopftracer2011.cpp7
-rw-r--r--src/libnrtype/FontFactory.h2
-rw-r--r--src/libnrtype/Layout-TNG-OutIter.cpp4
-rw-r--r--src/libnrtype/Layout-TNG.h6
-rw-r--r--src/libuemf/CMakeLists.txt1
-rw-r--r--src/libuemf/Makefile_insert2
-rw-r--r--src/libuemf/README100
-rw-r--r--src/libuemf/uemf.c273
-rw-r--r--src/libuemf/uemf.h180
-rw-r--r--src/libuemf/uemf_endian.c1673
-rw-r--r--src/libuemf/uemf_endian.h7
-rw-r--r--src/libuemf/uemf_print.c652
-rw-r--r--src/libuemf/uemf_print.h14
-rw-r--r--src/libuemf/uemf_safe.c1202
-rw-r--r--src/libuemf/uemf_safe.h32
-rw-r--r--src/libuemf/upmf.c1282
-rw-r--r--src/libuemf/upmf.h146
-rw-r--r--src/libuemf/upmf_print.c818
-rw-r--r--src/libuemf/upmf_print.h137
-rw-r--r--src/libuemf/uwmf.c100
-rw-r--r--src/libuemf/uwmf.h5
-rw-r--r--src/libuemf/uwmf_print.c14
-rw-r--r--src/libuemf/uwmf_print.h2
-rw-r--r--src/live_effects/lpe-fillet-chamfer.h8
-rw-r--r--src/live_effects/lpe-gears.cpp2
-rw-r--r--src/live_effects/lpe-knot.cpp6
-rw-r--r--src/live_effects/lpe-lattice2.cpp2
-rw-r--r--src/live_effects/lpe-lattice2.h6
-rw-r--r--src/live_effects/lpe-taperstroke.cpp4
-rw-r--r--src/live_effects/parameter/filletchamferpointarray.cpp1
-rw-r--r--src/live_effects/parameter/originalpath.cpp4
-rw-r--r--src/live_effects/parameter/originalpatharray.cpp4
-rw-r--r--src/live_effects/parameter/path.cpp8
-rw-r--r--src/main.cpp24
-rw-r--r--src/object-snapper.cpp5
-rw-r--r--src/object-test.h3
-rw-r--r--src/path-chemistry.cpp127
-rw-r--r--src/path-chemistry.h2
-rw-r--r--src/removeoverlap.cpp13
-rw-r--r--src/removeoverlap.h2
-rw-r--r--src/selcue.cpp19
-rw-r--r--src/selection-chemistry.cpp929
-rw-r--r--src/selection-chemistry.h9
-rw-r--r--src/selection-describer.cpp34
-rw-r--r--src/selection.cpp185
-rw-r--r--src/selection.h30
-rw-r--r--src/seltrans.cpp55
-rw-r--r--src/seltrans.h2
-rw-r--r--src/snap.cpp14
-rw-r--r--src/snap.h8
-rw-r--r--src/sp-conn-end.cpp5
-rw-r--r--src/sp-defs.cpp8
-rw-r--r--src/sp-filter.cpp18
-rw-r--r--src/sp-filter.h3
-rw-r--r--src/sp-item-group.cpp88
-rw-r--r--src/sp-item-group.h6
-rw-r--r--src/sp-item-transform.cpp6
-rw-r--r--src/sp-lpe-item.cpp30
-rw-r--r--src/sp-marker.cpp6
-rw-r--r--src/sp-marker.h2
-rw-r--r--src/sp-namedview.cpp2
-rw-r--r--src/sp-object.cpp10
-rw-r--r--src/sp-object.h6
-rw-r--r--src/sp-pattern.cpp6
-rw-r--r--src/sp-pattern.h2
-rw-r--r--src/sp-switch.cpp24
-rw-r--r--src/sp-switch.h2
-rw-r--r--src/sp-text.cpp26
-rw-r--r--src/splivarot.cpp97
-rw-r--r--src/style-enums.h137
-rw-r--r--src/style.cpp63
-rw-r--r--src/style.h18
-rw-r--r--src/text-chemistry.cpp84
-rw-r--r--src/text-editing.cpp7
-rw-r--r--src/trace/siox.cpp2
-rw-r--r--src/trace/trace.cpp8
-rw-r--r--src/ui/clipboard.cpp33
-rw-r--r--src/ui/dialog-events.cpp4
-rw-r--r--src/ui/dialog/aboutbox.h8
-rw-r--r--src/ui/dialog/align-and-distribute.cpp86
-rw-r--r--src/ui/dialog/calligraphic-profile-rename.h4
-rw-r--r--src/ui/dialog/clonetiler.cpp16
-rw-r--r--src/ui/dialog/color-item.cpp4
-rw-r--r--src/ui/dialog/debug.cpp4
-rw-r--r--src/ui/dialog/document-properties.cpp4
-rw-r--r--src/ui/dialog/export.cpp32
-rw-r--r--src/ui/dialog/filedialogimpl-gtkmm.h8
-rw-r--r--src/ui/dialog/filedialogimpl-win32.h5
-rw-r--r--src/ui/dialog/filter-effects-dialog.cpp58
-rw-r--r--src/ui/dialog/filter-effects-dialog.h4
-rw-r--r--src/ui/dialog/find.cpp92
-rw-r--r--src/ui/dialog/find.h10
-rw-r--r--src/ui/dialog/floating-behavior.cpp6
-rw-r--r--src/ui/dialog/font-substitution.cpp32
-rw-r--r--src/ui/dialog/font-substitution.h5
-rw-r--r--src/ui/dialog/glyphs.cpp12
-rw-r--r--src/ui/dialog/grid-arrange-tab.cpp70
-rw-r--r--src/ui/dialog/guides.h4
-rw-r--r--src/ui/dialog/icon-preview.cpp14
-rw-r--r--src/ui/dialog/layer-properties.h4
-rw-r--r--src/ui/dialog/layers.h4
-rw-r--r--src/ui/dialog/livepatheffect-add.h8
-rw-r--r--src/ui/dialog/lpe-fillet-chamfer-properties.cpp4
-rw-r--r--src/ui/dialog/lpe-powerstroke-properties.cpp4
-rw-r--r--src/ui/dialog/messages.h8
-rw-r--r--src/ui/dialog/object-attributes.cpp2
-rw-r--r--src/ui/dialog/object-properties.cpp4
-rw-r--r--src/ui/dialog/objects.cpp8
-rw-r--r--src/ui/dialog/objects.h4
-rw-r--r--src/ui/dialog/ocaldialogs.h4
-rw-r--r--src/ui/dialog/pixelartdialog.cpp8
-rw-r--r--src/ui/dialog/polar-arrange-tab.cpp14
-rw-r--r--src/ui/dialog/print.cpp2
-rw-r--r--src/ui/dialog/spellcheck.h4
-rw-r--r--src/ui/dialog/svg-fonts-dialog.cpp4
-rw-r--r--src/ui/dialog/swatches.cpp6
-rw-r--r--src/ui/dialog/symbols.cpp4
-rw-r--r--src/ui/dialog/tags.cpp11
-rw-r--r--src/ui/dialog/text-edit.cpp26
-rw-r--r--src/ui/dialog/text-edit.h4
-rw-r--r--src/ui/dialog/tile.h4
-rw-r--r--src/ui/dialog/transformation.cpp48
-rw-r--r--src/ui/interface.cpp19
-rw-r--r--src/ui/previewholder.h4
-rw-r--r--src/ui/tools/box3d-tool.cpp2
-rw-r--r--src/ui/tools/connector-tool.cpp8
-rw-r--r--src/ui/tools/eraser-tool.cpp33
-rw-r--r--src/ui/tools/flood-tool.cpp2
-rw-r--r--src/ui/tools/gradient-tool.cpp37
-rw-r--r--src/ui/tools/lpe-tool.cpp8
-rw-r--r--src/ui/tools/measure-tool.cpp6
-rw-r--r--src/ui/tools/mesh-tool.cpp27
-rw-r--r--src/ui/tools/node-tool.cpp10
-rw-r--r--src/ui/tools/pen-tool.cpp15
-rw-r--r--src/ui/tools/pencil-tool.cpp3
-rw-r--r--src/ui/tools/rect-tool.cpp1
-rw-r--r--src/ui/tools/select-tool.cpp6
-rw-r--r--src/ui/tools/spray-tool.cpp32
-rw-r--r--src/ui/tools/text-tool.cpp7
-rw-r--r--src/ui/tools/tool-base.cpp10
-rw-r--r--src/ui/tools/tweak-tool.cpp25
-rw-r--r--src/ui/widget/addtoicon.cpp4
-rw-r--r--src/ui/widget/button.h8
-rw-r--r--src/ui/widget/clipmaskicon.cpp4
-rw-r--r--src/ui/widget/color-picker.h8
-rw-r--r--src/ui/widget/color-preview.h4
-rw-r--r--src/ui/widget/dock-item.h4
-rw-r--r--src/ui/widget/dock.h8
-rw-r--r--src/ui/widget/entity-entry.cpp4
-rw-r--r--src/ui/widget/filter-effect-chooser.h8
-rw-r--r--src/ui/widget/frame.h8
-rw-r--r--src/ui/widget/imageicon.h8
-rw-r--r--src/ui/widget/imagetoggler.h4
-rw-r--r--src/ui/widget/insertordericon.h3
-rw-r--r--src/ui/widget/labelled.h8
-rw-r--r--src/ui/widget/layertypeicon.cpp4
-rw-r--r--src/ui/widget/licensor.h8
-rw-r--r--src/ui/widget/notebook-page.h4
-rw-r--r--src/ui/widget/object-composite-settings.cpp3
-rw-r--r--src/ui/widget/object-composite-settings.h8
-rw-r--r--src/ui/widget/panel.cpp4
-rw-r--r--src/ui/widget/panel.h4
-rw-r--r--src/ui/widget/preferences-widget.cpp4
-rw-r--r--src/ui/widget/preferences-widget.h4
-rw-r--r--src/ui/widget/rotateable.cpp4
-rw-r--r--src/ui/widget/selected-style.h4
-rw-r--r--src/ui/widget/spin-scale.h4
-rw-r--r--src/ui/widget/spin-slider.h4
-rw-r--r--src/ui/widget/spinbutton.h8
-rw-r--r--src/ui/widget/style-subject.cpp42
-rw-r--r--src/ui/widget/style-subject.h13
-rw-r--r--src/ui/widget/style-swatch.h4
-rw-r--r--src/ui/widget/tolerance-slider.cpp4
-rw-r--r--src/ui/widget/unit-menu.h8
-rw-r--r--src/unclump.cpp61
-rw-r--r--src/unclump.h2
-rw-r--r--src/util/ziptool.cpp2
-rw-r--r--src/vanishing-point.cpp26
-rw-r--r--src/verbs.cpp7
-rw-r--r--src/widgets/arc-toolbar.cpp33
-rw-r--r--src/widgets/connector-toolbar.cpp16
-rw-r--r--src/widgets/dash-selector.h4
-rw-r--r--src/widgets/desktop-widget.cpp4
-rw-r--r--src/widgets/desktop-widget.h8
-rw-r--r--src/widgets/ege-adjustment-action.cpp2
-rw-r--r--src/widgets/fill-style.cpp36
-rw-r--r--src/widgets/gradient-toolbar.cpp15
-rw-r--r--src/widgets/gradient-vector.cpp1
-rw-r--r--src/widgets/icon.cpp4
-rw-r--r--src/widgets/mesh-toolbar.cpp10
-rw-r--r--src/widgets/paint-selector.cpp22
-rw-r--r--src/widgets/rect-toolbar.cpp18
-rw-r--r--src/widgets/shrink-wrap-button.cpp4
-rw-r--r--src/widgets/sp-attribute-widget.h4
-rw-r--r--src/widgets/spiral-toolbar.cpp16
-rw-r--r--src/widgets/spw-utilities.cpp4
-rw-r--r--src/widgets/star-toolbar.cpp38
-rw-r--r--src/widgets/stroke-marker-selector.h8
-rw-r--r--src/widgets/stroke-style.cpp30
-rw-r--r--src/widgets/stroke-style.h2
-rw-r--r--src/widgets/swatch-selector.h8
-rw-r--r--src/widgets/text-toolbar.cpp48
-rw-r--r--src/widgets/toolbox.cpp4
-rw-r--r--src/xml/repr-util.cpp5
-rw-r--r--src/xml/repr.h2
-rw-r--r--test/CMakeLists.txt478
-rw-r--r--test/doc-per-case-test.cpp52
-rw-r--r--test/doc-per-case-test.h43
-rw-r--r--test/src/attributes-test.cpp618
-rw-r--r--test/src/color-profile-test.cpp126
-rw-r--r--test/src/dir-util-test.cpp63
-rw-r--r--test/unittest.cpp58
312 files changed, 14157 insertions, 8590 deletions
diff --git a/.bzrignore b/.bzrignore
index c85c5284f..784575a91 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -224,3 +224,14 @@ build-osxapp
inst-osxapp
packaging/macosx/ScriptExec/build
packaging/macosx/Inkscape.app
+
+# cmake bits
+cmake_install.cmake
+cmake_uninstall.cmake
+CMakeCache.txt
+CMakeFiles
+Makefile
+bin/
+lib/
+include/
+
diff --git a/AUTHORS b/AUTHORS
index 8c8085e83..17c173115 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -80,6 +80,7 @@ Thomas Ingham
Jean-Olivier Irisson
Bob Jamison
Ted Janeczko
+Marc Jeanmougin
jEsuSdA
Lauris Kaplinski
Lynn Kerby
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 11069a51c..23dd58708 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,7 @@
# CMake TODO
-# - Remove hard coded defines (see bwelow)
-# - Test on MinGW and OSX
+# - Remove hard coded defines (see below)
+# - Test on MinGW
+# √ Test on OSX
# - Add configurable options for Python/Perl, see configure --help
#
# ideasman42
@@ -29,6 +30,30 @@ if(CMAKE_COMPILER_IS_GNUCC)
endif()
endif()
+#
+# Set platform defaults (originally copied from darktable)
+#
+if(APPLE)
+ message("-- Mac OS X build detected, setting default features")
+ # prefer macports and/or user-installed libraries over system ones
+ #LIST(APPEND CMAKE_PREFIX_PATH /opt/local /usr/local)
+ set(CMAKE_FIND_FRAMEWORK "LAST")
+
+ # test and display relevant env variables
+ if(DEFINED ENV{CMAKE_PREFIX_PATH})
+ message("CMAKE_PREFIX_PATH: $ENV{CMAKE_PREFIX_PATH}")
+ endif()
+ if(DEFINED ENV{GTKMM_BASEPATH})
+ message("GTKMM_BASEPATH: $ENV{GTKMM_BASEPATH}")
+ endif()
+
+ # detect current GTK+ backend
+ include(${CMAKE_SOURCE_DIR}/CMakeScripts/HelperFunctions.cmake)
+ pkg_check_variable(gtk+-2.0 target)
+ message("GTK2 backend: ${GTK+_2.0_TARGET}")
+
+endif(APPLE)
+
#-----------------------------------------------------------------------------
# Redirect output files
@@ -36,19 +61,33 @@ set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin CACHE INTERNAL "" FORCE )
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib CACHE INTERNAL "" FORCE )
# -----------------------------------------------------------------------------
+#
+# -----------------------------------------------------------------------------
+set(GMOCK_DIR "${CMAKE_SOURCE_DIR}/gtest/gmock-1.7.0"
+ CACHE PATH "The path to the GoogleMock test framework.")
+
+if(EXISTS "${GMOCK_DIR}" AND IS_DIRECTORY "${GMOCK_DIR}")
+ set(GMOCK_PRESENT ON)
+endif()
+
+# -----------------------------------------------------------------------------
# Options
# -----------------------------------------------------------------------------
option(WITH_DBUS "Compile with support for DBus interface" OFF)
-option(ENABLE_LCMS "Compile with LCMS support" OFF)
-option(WITH_GNOME_VFS "Compile with support for Gnome VFS" OFF)
+option(ENABLE_LCMS "Compile with LCMS support" ON)
+option(WITH_GNOME_VFS "Compile with support for Gnome VFS" ON)
#option(WITH_INKJAR "Enable support for openoffice files (SVG jars)" ON)
+option(WITH_GTEST "Compile with Google Test support" ${GMOCK_PRESENT})
option(WITH_PROFILING "Turn on profiling" OFF) # Set to true if compiler/linker should enable profiling
option(WITH_GTKSPELL "Compile with support for GTK spelling widget" ON)
-option(WITH_LIBWPG "Compile with support of libpoppler-cairo for WordPrefect Graphics" ON)
option(ENABLE_POPPLER "Compile with support of libpoppler" ON)
option(ENABLE_POPPLER_CAIRO "Compile with support of libpoppler-cairo for rendering PDF preview (depends on ENABLE_POPPLER)" ON)
+option(WITH_IMAGE_MAGICK "Compile with support of ImageMagick for raster extensions and image import resolution" ON)
+option(WITH_LIBCDR "Compile with support of libcdr for CorelDRAW Diagrams" ON)
+option(WITH_LIBVISIO "Compile with support of libvisio for Microsoft Visio Diagrams" ON)
+option(WITH_LIBWPG "Compile with support of libwpg for WordPerfect Graphics" ON)
include(CMakeScripts/ConfigPaths.cmake) # Installation Paths
include(CMakeScripts/DefineDependsandFlags.cmake) # Includes, Compiler Flags, and Link Libraries
@@ -111,31 +150,21 @@ if(UNIX)
install(
FILES ${CMAKE_BINARY_DIR}/inkscape.desktop
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications
+ DESTINATION ${SHARE_INSTALL}/applications
)
- install(
- DIRECTORY
- ${CMAKE_SOURCE_DIR}/share/attributes
- ${CMAKE_SOURCE_DIR}/share/branding
- ${CMAKE_SOURCE_DIR}/share/examples
- ${CMAKE_SOURCE_DIR}/share/extensions
- ${CMAKE_SOURCE_DIR}/share/filters
- ${CMAKE_SOURCE_DIR}/share/fonts
- ${CMAKE_SOURCE_DIR}/share/gradients
- ${CMAKE_SOURCE_DIR}/share/icons
- ${CMAKE_SOURCE_DIR}/share/keys
- ${CMAKE_SOURCE_DIR}/share/markers
- ${CMAKE_SOURCE_DIR}/share/palettes
- ${CMAKE_SOURCE_DIR}/share/patterns
- ${CMAKE_SOURCE_DIR}/share/screens
- ${CMAKE_SOURCE_DIR}/share/symbols
- ${CMAKE_SOURCE_DIR}/share/templates
- ${CMAKE_SOURCE_DIR}/share/tutorials
- ${CMAKE_SOURCE_DIR}/share/ui
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/inkscape
- )
+ # this should probably be done no matter what the platform is, just set SHARE_INSTALL first
+ add_subdirectory(share)
else()
# TODO, WIN32/APPLE
endif()
+
+#-----------------------------------------------------------------------------
+
+add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
+
+if (WITH_GTEST)
+ enable_testing()
+ add_subdirectory(test EXCLUDE_FROM_ALL)
+endif()
diff --git a/CMakeScripts/ConfigChecks.cmake b/CMakeScripts/ConfigChecks.cmake
index 5f76e01e9..905465448 100644
--- a/CMakeScripts/ConfigChecks.cmake
+++ b/CMakeScripts/ConfigChecks.cmake
@@ -9,6 +9,9 @@ include(CheckStructHasMember)
# usage: CHECK_FUNCTION_EXISTS (<function name> <RESULT_VARIABLE> )
# usage: CHECK_STRUCT_HAS_MEMBER (<struct> <member> <header> <RESULT_VARIABLE>)
+set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${INKSCAPE_LIBS})
+set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${INKSCAPE_INCS_SYS})
+
CHECK_INCLUDE_FILES(boost/concept_check.hpp HAVE_BOOST_CONCEPT_CHECK_HPP)
CHECK_INCLUDE_FILES(cairo-pdf.h HAVE_CAIRO_PDF)
CHECK_FUNCTION_EXISTS(floor HAVE_FLOOR)
diff --git a/CMakeScripts/ConfigPaths.cmake b/CMakeScripts/ConfigPaths.cmake
index af0a7d50c..770e0c6ad 100644
--- a/CMakeScripts/ConfigPaths.cmake
+++ b/CMakeScripts/ConfigPaths.cmake
@@ -2,9 +2,15 @@ MESSAGE(STATUS "Creating build files in: ${CMAKE_CURRENT_BINARY_DIR}")
IF(WIN32)
SET(PACKAGE_LOCALE_DIR "locale")
-ELSEIF(WIN32)
+ set(SHARE_INSTALL "share" CACHE STRING "Data file install path. Must be a relative path (from CMAKE_INSTALL_PREFIX), with no trailing slash.")
+ELSE(WIN32)
# TODO: check and change this to correct value:
SET(PACKAGE_LOCALE_DIR "locale")
+
+ if(NOT SHARE_INSTALL)
+ set(SHARE_INSTALL "share" CACHE STRING "Data file install path. Must be a relative path (from CMAKE_INSTALL_PREFIX), with no trailing slash.")
+ endif(NOT SHARE_INSTALL)
+ mark_as_advanced(SHARE_INSTALL)
ENDIF(WIN32)
#SET(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/lib)
diff --git a/CMakeScripts/DefineDependsandFlags.cmake b/CMakeScripts/DefineDependsandFlags.cmake
index 12f0b5240..dceed9560 100644
--- a/CMakeScripts/DefineDependsandFlags.cmake
+++ b/CMakeScripts/DefineDependsandFlags.cmake
@@ -3,8 +3,7 @@ set(INKSCAPE_LIBS "")
set(INKSCAPE_INCS "")
set(INKSCAPE_INCS_SYS "")
-list(APPEND INKSCAPE_INCS
- ${PROJECT_SOURCE_DIR}
+list(APPEND INKSCAPE_INCS ${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/src
# generated includes
@@ -20,11 +19,25 @@ list(APPEND INKSCAPE_INCS_SYS ${GSL_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${GSL_LIBRARIES})
if (WIN32)
list(APPEND INKSCAPE_LIBS "-L$ENV{DEVLIBS_PATH}/lib") # FIXME
- list(APPEND INKSCAPE_LIBS "-lintl.dll") # FIXME
list(APPEND INKSCAPE_LIBS "-lpangocairo-1.0.dll") # FIXME
list(APPEND INKSCAPE_LIBS "-lpangoft2-1.0.dll") # FIXME
list(APPEND INKSCAPE_LIBS "-lpangowin32-1.0.dll") # FIXME
list(APPEND INKSCAPE_LIBS "-lgthread-2.0.dll") # FIXME
+elseif(APPLE)
+ if(DEFINED ENV{CMAKE_PREFIX_PATH})
+ # Adding the library search path explicitly seems not required
+ # if MacPorts is installed in default prefix ('/opt/local') -
+ # Cmake then can rely on the hard-coded paths in its modules.
+ # Only prepend search path if $CMAKE_PREFIX_PATH is defined:
+ list(APPEND INKSCAPE_LIBS "-L$ENV{CMAKE_PREFIX_PATH}/lib") # FIXME
+ endif()
+ list(APPEND INKSCAPE_LIBS "-lpangocairo-1.0") # FIXME
+ list(APPEND INKSCAPE_LIBS "-lpangoft2-1.0") # FIXME
+ list(APPEND INKSCAPE_LIBS "-lfontconfig") # FIXME
+ if(${GTK+_2.0_TARGET} MATCHES "x11")
+ # only link X11 if using X11 backend of GTK2
+ list(APPEND INKSCAPE_LIBS "-lX11") # FIXME
+ endif()
else()
list(APPEND INKSCAPE_LIBS "-ldl") # FIXME
list(APPEND INKSCAPE_LIBS "-lpangocairo-1.0") # FIXME
@@ -33,6 +46,10 @@ else()
list(APPEND INKSCAPE_LIBS "-lX11") # FIXME
endif()
+if(NOT APPLE)
+ # FIXME: should depend on availability of OpenMP support (see below) (?)
+ list(APPEND INKSCAPE_LIBS "-lgomp") # FIXME
+endif()
list(APPEND INKSCAPE_LIBS "-lgslcblas") # FIXME
if(WITH_GNOME_VFS)
@@ -65,6 +82,16 @@ if(ENABLE_LCMS)
endif()
endif()
+find_package(Iconv REQUIRED)
+list(APPEND INKSCAPE_INCS_SYS ${ICONV_INCLUDE_DIRS})
+list(APPEND INKSCAPE_LIBS ${ICONV_LIBRARIES})
+add_definitions(${ICONV_DEFINITIONS})
+
+find_package(Intl REQUIRED)
+list(APPEND INKSCAPE_INCS_SYS ${Intl_INCLUDE_DIRS})
+list(APPEND INKSCAPE_LIBS ${Intl_LIBRARIES})
+add_definitions(${Intl_DEFINITIONS})
+
find_package(BoehmGC REQUIRED)
list(APPEND INKSCAPE_INCS_SYS ${BOEHMGC_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${BOEHMGC_LIBRARIES})
@@ -94,6 +121,10 @@ if(ENABLE_POPPLER)
POPPLER_VERSION VERSION_EQUAL "0.26.0")
set(POPPLER_EVEN_NEWER_COLOR_SPACE_API ON)
endif()
+ if(POPPLER_VERSION VERSION_GREATER "0.29.0" OR
+ POPPLER_VERSION VERSION_EQUAL "0.29.0")
+ set(POPPLER_EVEN_NEWER_NEW_COLOR_SPACE_API ON)
+ endif()
if(POPPLER_VERSION VERSION_GREATER "0.15.1" OR
POPPLER_VERSION VERSION_EQUAL "0.15.1")
set(POPPLER_NEW_GFXPATCH ON)
@@ -117,8 +148,9 @@ add_definitions(${POPPLER_DEFINITIONS})
if(WITH_LIBWPG)
find_package(LibWPG)
if(LIBWPG_FOUND)
- set(WITH_LIBWPG01 ${LIBWPG01_FOUND})
- set(WITH_LIBWPG02 ${LIBWPG02_FOUND})
+ set(WITH_LIBWPG01 ${LIBWPG-0.1_FOUND})
+ set(WITH_LIBWPG02 ${LIBWPG-0.2_FOUND})
+ set(WITH_LIBWPG03 ${LIBWPG-0.3_FOUND})
list(APPEND INKSCAPE_INCS_SYS ${LIBWPG_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${LIBWPG_LIBRARIES})
add_definitions(${LIBWPG_DEFINITIONS})
@@ -127,6 +159,40 @@ if(WITH_LIBWPG)
endif()
endif()
+if(WITH_LIBVISIO)
+ find_package(LibVisio)
+ if(LIBVISIO_FOUND)
+ set(WITH_LIBVISIO00 ${LIBVISIO-0.0_FOUND})
+ set(WITH_LIBVISIO01 ${LIBVISIO-0.1_FOUND})
+ list(APPEND INKSCAPE_INCS_SYS ${LIBVISIO_INCLUDE_DIRS})
+ list(APPEND INKSCAPE_LIBS ${LIBVISIO_LIBRARIES})
+ add_definitions(${LIBVISIO_DEFINITIONS})
+ else()
+ set(WITH_LIBVISIO OFF)
+ endif()
+endif()
+
+if(WITH_LIBCDR)
+ find_package(LibCDR)
+ if(LIBCDR_FOUND)
+ set(WITH_LIBCDR00 ${LIBCDR-0.0_FOUND})
+ set(WITH_LIBCDR01 ${LIBCDR-0.1_FOUND})
+ list(APPEND INKSCAPE_INCS_SYS ${LIBCDR_INCLUDE_DIRS})
+ list(APPEND INKSCAPE_LIBS ${LIBCDR_LIBRARIES})
+ add_definitions(${LIBCDR_DEFINITIONS})
+ else()
+ set(WITH_LIBCDR OFF)
+ endif()
+endif()
+
+FIND_PACKAGE(JPEG REQUIRED)
+#IF(JPEG_FOUND)
+ #INCLUDE_DIRECTORIES(${JPEG_INCLUDE_DIR})
+ #TARGET_LINK_LIBRARIES(mpo ${JPEG_LIBRARIES})
+#ENDIF()
+list(APPEND INKSCAPE_INCS_SYS ${JPEG_INCLUDE_DIR})
+list(APPEND INKSCAPE_LIBS ${JPEG_LIBRARIES})
+
find_package(PNG REQUIRED)
list(APPEND INKSCAPE_INCS_SYS ${PNG_PNG_INCLUDE_DIR})
list(APPEND INKSCAPE_LIBS ${PNG_LIBRARY})
@@ -147,6 +213,14 @@ if(WITH_DBUS)
endif()
endif()
+if(WITH_GTEST)
+ if(EXISTS "${GMOCK_DIR}" AND IS_DIRECTORY "${GMOCK_DIR}")
+
+ else()
+ set(WITH_GTEST off)
+ endif()
+endif()
+
# ----------------------------------------------------------------------------
# CMake's builtin
# ----------------------------------------------------------------------------
@@ -223,13 +297,14 @@ if(WITH_GTKSPELL)
list(APPEND INKSCAPE_INCS_SYS ${GTKSPELL_INCLUDE_DIR})
list(APPEND INKSCAPE_LIBS ${GTKSPELL_LIBRARIES})
add_definitions(${GTKSPELL_DEFINITIONS})
+ else()
+ set(WITH_GTKSPELL OFF)
endif()
- set(WITH_GTKSPELL ${GTKSPELL_FOUND})
endif()
-find_package(OpenSSL)
-list(APPEND INKSCAPE_INCS_SYS ${OPENSSL_INCLUDE_DIR})
-list(APPEND INKSCAPE_LIBS ${OPENSSL_LIBRARIES})
+#find_package(OpenSSL)
+#list(APPEND INKSCAPE_INCS_SYS ${OPENSSL_INCLUDE_DIR})
+#list(APPEND INKSCAPE_LIBS ${OPENSSL_LIBRARIES})
find_package(LibXslt REQUIRED)
list(APPEND INKSCAPE_INCS_SYS ${LIBXSLT_INCLUDE_DIR})
@@ -256,21 +331,35 @@ find_package(ZLIB REQUIRED)
list(APPEND INKSCAPE_INCS_SYS ${ZLIB_INCLUDE_DIRS})
list(APPEND INKSCAPE_LIBS ${ZLIB_LIBRARIES})
-find_package(ImageMagick COMPONENTS MagickCore Magick++)
-if(ImageMagick_FOUND)
- list(APPEND INKSCAPE_INCS_SYS ${ImageMagick_MagickCore_INCLUDE_DIR})
- list(APPEND INKSCAPE_LIBS ${ImageMagick_Magick++_LIBRARY})
+if(WITH_IMAGE_MAGICK)
+ find_package(ImageMagick COMPONENTS MagickCore Magick++)
+ if(ImageMagick_FOUND)
+ # the component-specific paths apparently fail to get detected correctly
+ # on some linux distros (or with older Cmake versions).
+ # Use variables which list all include dirs and libraries instead:
+ list(APPEND INKSCAPE_INCS_SYS ${ImageMagick_INCLUDE_DIRS})
+ list(APPEND INKSCAPE_LIBS ${ImageMagick_LIBRARIES})
+ # TODO: Cmake's ImageMagick module misses required defines for newer
+ # versions of ImageMagick. See also:
+ # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=776832
+ #add_definitions(-DMAGICKCORE_HDRI_ENABLE=0) # FIXME (version check?)
+ #add_definitions(-DMAGICKCORE_QUANTUM_DEPTH=16) # FIXME (version check?)
+ else()
+ set(WITH_IMAGE_MAGICK OFF) # enable 'Extensions > Raster'
+ endif()
endif()
include(${CMAKE_CURRENT_LIST_DIR}/IncludeJava.cmake)
# end Dependencies
+list(REMOVE_DUPLICATES INKSCAPE_LIBS)
+list(REMOVE_DUPLICATES INKSCAPE_INCS_SYS)
# C/C++ Flags
include_directories(${INKSCAPE_INCS})
include_directories(SYSTEM ${INKSCAPE_INCS_SYS})
+include(${CMAKE_CURRENT_LIST_DIR}/ConfigChecks.cmake)
+
unset(INKSCAPE_INCS)
unset(INKSCAPE_INCS_SYS)
-
-include(${CMAKE_CURRENT_LIST_DIR}/ConfigChecks.cmake)
diff --git a/CMakeScripts/HelperFunctions.cmake b/CMakeScripts/HelperFunctions.cmake
new file mode 100644
index 000000000..0e6fff51a
--- /dev/null
+++ b/CMakeScripts/HelperFunctions.cmake
@@ -0,0 +1,19 @@
+# pkg_check_variable() - a function to retrieve pkg-config variables in CMake
+#
+# source: http://bloerg.net/2015/03/06/pkg-config-variables-in-cmake.html
+
+find_package(PkgConfig REQUIRED)
+
+function(pkg_check_variable _pkg _name)
+ string(TOUPPER ${_pkg} _pkg_upper)
+ string(TOUPPER ${_name} _name_upper)
+ string(REPLACE "-" "_" _pkg_upper ${_pkg_upper})
+ string(REPLACE "-" "_" _name_upper ${_name_upper})
+ set(_output_name "${_pkg_upper}_${_name_upper}")
+
+ execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=${_name} ${_pkg}
+ OUTPUT_VARIABLE _pkg_result
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ set("${_output_name}" "${_pkg_result}" CACHE STRING "pkg-config variable ${_name} of ${_pkg}")
+endfunction()
diff --git a/CMakeScripts/Modules/FindIconv.cmake b/CMakeScripts/Modules/FindIconv.cmake
new file mode 100644
index 000000000..338d17d05
--- /dev/null
+++ b/CMakeScripts/Modules/FindIconv.cmake
@@ -0,0 +1,60 @@
+# - Try to find Iconv
+# Once done this will define
+#
+# ICONV_FOUND - system has Iconv
+# ICONV_INCLUDE_DIR - the Iconv include directory
+# ICONV_LIBRARIES - Link these to use Iconv
+# ICONV_SECOND_ARGUMENT_IS_CONST - the second argument for iconv() is const
+#
+include(CheckCXXSourceCompiles)
+
+IF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
+ # Already in cache, be silent
+ SET(ICONV_FIND_QUIETLY TRUE)
+ENDIF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
+
+FIND_PATH(ICONV_INCLUDE_DIR iconv.h)
+
+FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c)
+
+IF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
+ SET(ICONV_FOUND TRUE)
+ENDIF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
+
+set(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
+set(CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARIES})
+IF(ICONV_FOUND)
+ check_cxx_source_compiles("
+ #include <iconv.h>
+ int main(){
+ iconv_t conv = 0;
+ const char* in = 0;
+ size_t ilen = 0;
+ char* out = 0;
+ size_t olen = 0;
+ iconv(conv, &in, &ilen, &out, &olen);
+ return 0;
+ }
+" ICONV_SECOND_ARGUMENT_IS_CONST )
+ IF(ICONV_SECOND_ARGUMENT_IS_CONST)
+ SET(ICONV_CONST "const")
+ ENDIF(ICONV_SECOND_ARGUMENT_IS_CONST)
+ENDIF(ICONV_FOUND)
+set(CMAKE_REQUIRED_INCLUDES)
+set(CMAKE_REQUIRED_LIBRARIES)
+
+IF(ICONV_FOUND)
+ IF(NOT ICONV_FIND_QUIETLY)
+ MESSAGE(STATUS "Found Iconv: ${ICONV_LIBRARIES}")
+ ENDIF(NOT ICONV_FIND_QUIETLY)
+ELSE(ICONV_FOUND)
+ IF(Iconv_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Could not find Iconv")
+ ENDIF(Iconv_FIND_REQUIRED)
+ENDIF(ICONV_FOUND)
+
+MARK_AS_ADVANCED(
+ ICONV_INCLUDE_DIR
+ ICONV_LIBRARIES
+ ICONV_SECOND_ARGUMENT_IS_CONST
+)
diff --git a/CMakeScripts/Modules/FindIntl.cmake b/CMakeScripts/Modules/FindIntl.cmake
new file mode 100644
index 000000000..e6c5f6d0c
--- /dev/null
+++ b/CMakeScripts/Modules/FindIntl.cmake
@@ -0,0 +1,127 @@
+#.rst:
+# FindIntl
+# --------
+#
+# Find the Gettext libintl headers and libraries.
+#
+# This module reports information about the Gettext libintl
+# installation in several variables. General variables::
+#
+# Intl_FOUND - true if the libintl headers and libraries were found
+# Intl_INCLUDE_DIRS - the directory containing the libintl headers
+# Intl_LIBRARIES - libintl libraries to be linked
+#
+# The following cache variables may also be set::
+#
+# Intl_INCLUDE_DIR - the directory containing the libintl headers
+# Intl_LIBRARY - the libintl library (if any)
+#
+# .. note::
+# On some platforms, such as Linux with GNU libc, the gettext
+# functions are present in the C standard library and libintl
+# is not required. ``Intl_LIBRARIES`` will be empty in this
+# case.
+#
+# .. note::
+# If you wish to use the Gettext tools (``msgmerge``,
+# ``msgfmt``, etc.), use :module:`FindGettext`.
+
+
+# Written by Roger Leigh <rleigh@codelibre.net>
+
+#=============================================================================
+# Copyright 2014 Roger Leigh <rleigh@codelibre.net>
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+
+# CMake - Cross Platform Makefile Generator
+# Copyright 2000-2015 Kitware, Inc.
+# Copyright 2000-2011 Insight Software Consortium
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# * Neither the names of Kitware, Inc., the Insight Software Consortium,
+# nor the names of their contributors may be used to endorse or promote
+# products derived from this software without specific prior written
+# permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# ------------------------------------------------------------------------------
+#
+# The above copyright and license notice applies to distributions of
+# CMake in source and binary form. Some source files contain additional
+# notices of original copyright by their contributors; see each source
+# for details. Third-party software packages supplied with CMake under
+# compatible licenses provide their own copyright notices documented in
+# corresponding subdirectories.
+#
+# ------------------------------------------------------------------------------
+#
+# CMake was initially developed by Kitware with the following sponsorship:
+#
+# * National Library of Medicine at the National Institutes of Health
+# as part of the Insight Segmentation and Registration Toolkit (ITK).
+#
+# * US National Labs (Los Alamos, Livermore, Sandia) ASC Parallel
+# Visualization Initiative.
+#
+# * National Alliance for Medical Image Computing (NAMIC) is funded by the
+# National Institutes of Health through the NIH Roadmap for Medical Research,
+# Grant U54 EB005149.
+#
+# * Kitware, Inc.
+
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+# Find include directory
+find_path(Intl_INCLUDE_DIR
+ NAMES "libintl.h"
+ DOC "libintl include directory")
+mark_as_advanced(Intl_INCLUDE_DIR)
+
+# Find all Intl libraries
+find_library(Intl_LIBRARY "intl"
+ DOC "libintl libraries (if not in the C library)")
+mark_as_advanced(Intl_LIBRARY)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Intl
+ FOUND_VAR Intl_FOUND
+ REQUIRED_VARS Intl_INCLUDE_DIR
+ FAIL_MESSAGE "Failed to find Gettext libintl")
+
+if(Intl_FOUND)
+ set(Intl_INCLUDE_DIRS "${Intl_INCLUDE_DIR}")
+ if(Intl_LIBRARY)
+ set(Intl_LIBRARIES "${Intl_LIBRARY}")
+ else()
+ unset(Intl_LIBRARIES)
+ endif()
+endif()
diff --git a/CMakeScripts/Modules/FindLibCDR.cmake b/CMakeScripts/Modules/FindLibCDR.cmake
new file mode 100644
index 000000000..57a04807e
--- /dev/null
+++ b/CMakeScripts/Modules/FindLibCDR.cmake
@@ -0,0 +1,56 @@
+# - Try to find LibCDR
+# Once done this will define
+#
+# LIBCDR_FOUND - system has LibCDR
+# LIBCDR_INCLUDE_DIRS - the LibCDR include directory
+# LIBCDR_LIBRARIES - Link these to use LibCDR
+# LIBCDR_DEFINITIONS - Compiler switches required for using LibCDR
+#
+# Copyright (c) 2008 Joshua L. Blocher <verbalshadow@gmail.com>
+# Copyright (c) 2015 su_v <suv-sf@users.sf.net>
+#
+# Redistribution and use is allowed according to the terms of the New
+# BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+
+include(${CMAKE_CURRENT_LIST_DIR}/../HelperMacros.cmake)
+
+if (LIBCDR_LIBRARIES AND LIBCDR_INCLUDE_DIRS)
+ # in cache already
+ set(LIBCDR_FOUND TRUE)
+else (LIBCDR_LIBRARIES AND LIBCDR_INCLUDE_DIRS)
+ # use pkg-config to get the directories and then use these values
+ # in the FIND_PATH() and FIND_LIBRARY() calls
+ find_package(PkgConfig)
+ if (PKG_CONFIG_FOUND)
+ INKSCAPE_PKG_CONFIG_FIND(LIBCDR-0.1 libcdr-0.1 0 libcdr/libcdr.h libcdr-0.1 cdr-0.1)
+ if (LIBCDR-0.1_FOUND)
+ find_package(LibRevenge)
+ if (LIBREVENGE_FOUND)
+ list(APPEND LIBCDR_INCLUDE_DIRS ${LIBCDR-0.1_INCLUDE_DIRS})
+ list(APPEND LIBCDR_LIBRARIES ${LIBCDR-0.1_LIBRARIES})
+ list(APPEND LIBCDR_INCLUDE_DIRS ${LIBREVENGE_INCLUDE_DIRS})
+ list(APPEND LIBCDR_LIBRARIES ${LIBREVENGE_LIBRARIES})
+ set(LIBCDR01_FOUND TRUE)
+ endif (LIBREVENGE_FOUND)
+ else()
+ INKSCAPE_PKG_CONFIG_FIND(LIBCDR-0.0 libcdr-0.0 0 libcdr/libcdr.h libcdr-0.0 cdr-0.0)
+ INKSCAPE_PKG_CONFIG_FIND(LIBWPD-0.9 libwpd-0.9 0 libwpd/libwpd.h libwpd-0.9 wpd-0.9)
+ INKSCAPE_PKG_CONFIG_FIND(LIBWPD-STREAM-0.9 libwpd-stream-0.9 0 libwpd/libwpd.h libwpd-0.9 wpd-stream-0.9)
+ if (LIBCDR-0.0_FOUND AND LIBWPD-STREAM-0.9_FOUND AND LIBWPD-0.9_FOUND)
+ list(APPEND LIBCDR_INCLUDE_DIRS ${LIBCDR-0.0_INCLUDE_DIRS})
+ list(APPEND LIBCDR_LIBRARIES ${LIBCDR-0.0_LIBRARIES})
+ list(APPEND LIBCDR_INCLUDE_DIRS ${LIBWPD-0.9_INCLUDE_DIRS})
+ list(APPEND LIBCDR_LIBRARIES ${LIBWPD-0.9_LIBRARIES})
+ list(APPEND LIBCDR_INCLUDE_DIRS ${LIBWPD-STREAM-0.9_INCLUDE_DIRS})
+ list(APPEND LIBCDR_LIBRARIES ${LIBWPD-STREAM-0.9_LIBRARIES})
+ set(LIBCDR00_FOUND TRUE)
+ endif (LIBCDR-0.0_FOUND AND LIBWPD-STREAM-0.9_FOUND AND LIBWPD-0.9_FOUND)
+ endif (LIBCDR-0.1_FOUND)
+ if (LIBCDR-0.1_FOUND OR LIBCDR-0.0_FOUND)
+ set(LIBCDR_FOUND TRUE)
+ endif (LIBCDR-0.1_FOUND OR LIBCDR-0.0_FOUND)
+ endif (PKG_CONFIG_FOUND)
+endif (LIBCDR_LIBRARIES AND LIBCDR_INCLUDE_DIRS)
+
diff --git a/CMakeScripts/Modules/FindLibRevenge.cmake b/CMakeScripts/Modules/FindLibRevenge.cmake
new file mode 100644
index 000000000..90d1ecf06
--- /dev/null
+++ b/CMakeScripts/Modules/FindLibRevenge.cmake
@@ -0,0 +1,41 @@
+# - Try to find LibRevenge
+# Once done this will define
+#
+# LIBREVENGE_FOUND - system has LibRevenge
+# LIBREVENGE_INCLUDE_DIRS - the LibRevenge include directory
+# LIBREVENGE_LIBRARIES - Link these to use LibRevenge
+# LIBREVENGE_DEFINITIONS - Compiler switches required for using LibRevenge
+#
+# Copyright (c) 2008 Joshua L. Blocher <verbalshadow@gmail.com>
+# Copyright (c) 2015 su_v <suv-sf@users.sf.net>
+#
+# Redistribution and use is allowed according to the terms of the New
+# BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+
+include(${CMAKE_CURRENT_LIST_DIR}/../HelperMacros.cmake)
+
+if (LIBREVENGE_LIBRARIES AND LIBREVENGE_INCLUDE_DIRS)
+ # in cache already
+ set(LIBREVENGE_FOUND TRUE)
+else (LIBREVENGE_LIBRARIES AND LIBREVENGE_INCLUDE_DIRS)
+ # use pkg-config to get the directories and then use these values
+ # in the FIND_PATH() and FIND_LIBRARY() calls
+ find_package(PkgConfig)
+ if (PKG_CONFIG_FOUND)
+ INKSCAPE_PKG_CONFIG_FIND(LIBREVENGE-0.0 librevenge-0.0 0 librevenge/librevenge.h librevenge-0.0 revenge-0.0)
+ INKSCAPE_PKG_CONFIG_FIND(LIBREVENGE-STREAM-0.0 librevenge-stream-0.0 0 librevenge-0.0/librevenge-stream/librevenge-stream.h librevenge-stream-0.0 revenge-stream-0.0)
+ if (LIBREVENGE-0.0_FOUND AND LIBREVENGE-STREAM-0.0_FOUND)
+ list(APPEND LIBREVENGE_INCLUDE_DIRS ${LIBREVENGE-0.0_INCLUDE_DIRS})
+ list(APPEND LIBREVENGE_LIBRARIES ${LIBREVENGE-0.0_LIBRARIES})
+ list(APPEND LIBREVENGE_INCLUDE_DIRS ${LIBREVENGE-STREAM-0.0_INCLUDE_DIRS})
+ list(APPEND LIBREVENGE_LIBRARIES ${LIBREVENGE-STREAM-0.0_LIBRARIES})
+ set(LIBREVENGE00_FOUND TRUE)
+ endif (LIBREVENGE-0.0_FOUND AND LIBREVENGE-STREAM-0.0_FOUND)
+ if (LIBREVENGE-0.0_FOUND)
+ set(LIBREVENGE_FOUND TRUE)
+ endif (LIBREVENGE-0.0_FOUND)
+ endif (PKG_CONFIG_FOUND)
+endif (LIBREVENGE_LIBRARIES AND LIBREVENGE_INCLUDE_DIRS)
+
diff --git a/CMakeScripts/Modules/FindLibVisio.cmake b/CMakeScripts/Modules/FindLibVisio.cmake
new file mode 100644
index 000000000..a4e88aeaa
--- /dev/null
+++ b/CMakeScripts/Modules/FindLibVisio.cmake
@@ -0,0 +1,56 @@
+# - Try to find LibVisio
+# Once done this will define
+#
+# LIBVISIO_FOUND - system has LibVisio
+# LIBVISIO_INCLUDE_DIRS - the LibVisio include directory
+# LIBVISIO_LIBRARIES - Link these to use LibVisio
+# LIBVISIO_DEFINITIONS - Compiler switches required for using LibVisio
+#
+# Copyright (c) 2008 Joshua L. Blocher <verbalshadow@gmail.com>
+# Copyright (c) 2015 su_v <suv-sf@users.sf.net>
+#
+# Redistribution and use is allowed according to the terms of the New
+# BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+
+include(${CMAKE_CURRENT_LIST_DIR}/../HelperMacros.cmake)
+
+if (LIBVISIO_LIBRARIES AND LIBVISIO_INCLUDE_DIRS)
+ # in cache already
+ set(LIBVISIO_FOUND TRUE)
+else (LIBVISIO_LIBRARIES AND LIBVISIO_INCLUDE_DIRS)
+ # use pkg-config to get the directories and then use these values
+ # in the FIND_PATH() and FIND_LIBRARY() calls
+ find_package(PkgConfig)
+ if (PKG_CONFIG_FOUND)
+ INKSCAPE_PKG_CONFIG_FIND(LIBVISIO-0.1 libvisio-0.1 0 libvisio/libvisio.h libvisio-0.1 visio-0.1)
+ if (LIBVISIO-0.1_FOUND)
+ find_package(LibRevenge)
+ if (LIBREVENGE_FOUND)
+ list(APPEND LIBVISIO_INCLUDE_DIRS ${LIBVISIO-0.1_INCLUDE_DIRS})
+ list(APPEND LIBVISIO_LIBRARIES ${LIBVISIO-0.1_LIBRARIES})
+ list(APPEND LIBVISIO_INCLUDE_DIRS ${LIBREVENGE_INCLUDE_DIRS})
+ list(APPEND LIBVISIO_LIBRARIES ${LIBREVENGE_LIBRARIES})
+ set(LIBVISIO01_FOUND TRUE)
+ endif (LIBREVENGE_FOUND)
+ else()
+ INKSCAPE_PKG_CONFIG_FIND(LIBVISIO-0.0 libvisio-0.0 0 libvisio/libvisio.h libvisio-0.0 visio-0.0)
+ INKSCAPE_PKG_CONFIG_FIND(LIBWPD-0.9 libwpd-0.9 0 libwpd/libwpd.h libwpd-0.9 wpd-0.9)
+ INKSCAPE_PKG_CONFIG_FIND(LIBWPD-STREAM-0.9 libwpd-stream-0.9 0 libwpd/libwpd.h libwpd-0.9 wpd-stream-0.9)
+ if (LIBVISIO-0.0_FOUND AND LIBWPD-STREAM-0.9_FOUND AND LIBWPD-0.9_FOUND)
+ list(APPEND LIBVISIO_INCLUDE_DIRS ${LIBVISIO-0.0_INCLUDE_DIRS})
+ list(APPEND LIBVISIO_LIBRARIES ${LIBVISIO-0.0_LIBRARIES})
+ list(APPEND LIBVISIO_INCLUDE_DIRS ${LIBWPD-0.9_INCLUDE_DIRS})
+ list(APPEND LIBVISIO_LIBRARIES ${LIBWPD-0.9_LIBRARIES})
+ list(APPEND LIBVISIO_INCLUDE_DIRS ${LIBWPD-STREAM-0.9_INCLUDE_DIRS})
+ list(APPEND LIBVISIO_LIBRARIES ${LIBWPD-STREAM-0.9_LIBRARIES})
+ set(LIBVISIO00_FOUND TRUE)
+ endif (LIBVISIO-0.0_FOUND AND LIBWPD-STREAM-0.9_FOUND AND LIBWPD-0.9_FOUND)
+ endif (LIBVISIO-0.1_FOUND)
+ if (LIBVISIO-0.1_FOUND OR LIBVISIO-0.0_FOUND)
+ set(LIBVISIO_FOUND TRUE)
+ endif (LIBVISIO-0.1_FOUND OR LIBVISIO-0.0_FOUND)
+ endif (PKG_CONFIG_FOUND)
+endif (LIBVISIO_LIBRARIES AND LIBVISIO_INCLUDE_DIRS)
+
diff --git a/CMakeScripts/Modules/FindLibWPG.cmake b/CMakeScripts/Modules/FindLibWPG.cmake
index 4f173da2d..ea241a570 100644
--- a/CMakeScripts/Modules/FindLibWPG.cmake
+++ b/CMakeScripts/Modules/FindLibWPG.cmake
@@ -23,32 +23,45 @@ else (LIBWPG_LIBRARIES AND LIBWPG_INCLUDE_DIRS)
# in the FIND_PATH() and FIND_LIBRARY() calls
find_package(PkgConfig)
if (PKG_CONFIG_FOUND)
- INKSCAPE_PKG_CONFIG_FIND(LIBWPG-0.1 libwpg-0.1 0 libwpg/libwpg.h libwpg-0.1 wpg-0.1)
- INKSCAPE_PKG_CONFIG_FIND(LIBWPG-STREAM-0.1 libwpg-stream-0.1 0 libwpg/libwpg.h libwpg-0.1 wpg-stream-0.1)
- INKSCAPE_PKG_CONFIG_FIND(LIBWPD-0.8 libwpd-0.8 0 libwpd/libwpd.h libwpd-0.8 wpd-0.8)
- if (LIBWPG-0.1_FOUND AND LIBWPG-STREAM-0.1_FOUND AND LIBWPD-0.8_FOUND)
- list(APPEND LIBWPG_INCLUDE_DIRS ${LIBWPG-0.1_INCLUDE_DIRS})
- list(APPEND LIBWPG_LIBRARIES ${LIBWPG-0.1_LIBRARIES})
- list(APPEND LIBWPG_INCLUDE_DIRS ${LIBWPG-STREAM-0.1_INCLUDE_DIRS})
- list(APPEND LIBWPG_LIBRARIES ${LIBWPG-STREAM-0.1_LIBRARIES})
- list(APPEND LIBWPG_INCLUDE_DIRS ${LIBWPD-0.8_INCLUDE_DIRS})
- list(APPEND LIBWPG_LIBRARIES ${LIBWPD-0.8_LIBRARIES})
- set(LIBWPG01_FOUND TRUE)
- endif (LIBWPG-0.1_FOUND AND LIBWPG-STREAM-0.1_FOUND AND LIBWPD-0.8_FOUND)
- INKSCAPE_PKG_CONFIG_FIND(LIBWPG-0.2 libwpg-0.2 0 libwpg/libwpg.h libwpg-0.2 wpg-0.2)
- INKSCAPE_PKG_CONFIG_FIND(LIBWPD-0.9 libwpd-0.9 0 libwpd/libwpd.h libwpd-0.9 wpd-0.9)
- INKSCAPE_PKG_CONFIG_FIND(LIBWPD-STREAM-0.9 libwpd-stream-0.9 0 libwpd/libwpd.h libwpd-0.9 wpd-stream-0.9)
- if (LIBWPG02_FOUND)
- list(APPEND LIBWPG_INCLUDE_DIRS ${LIBWPG02_INCLUDE_DIRS})
- list(APPEND LIBWPG_LIBRARIES ${LIBWPG02_LIBRARIES})
- list(APPEND LIBWPG_INCLUDE_DIRS ${LIBWPD-0.9_INCLUDE_DIRS})
- list(APPEND LIBWPG_LIBRARIES ${LIBWPD-0.9_LIBRARIES})
- list(APPEND LIBWPG_INCLUDE_DIRS ${LIBWPD-STREAM-0.9_INCLUDE_DIRS})
- list(APPEND LIBWPG_LIBRARIES ${LIBWPD-STREAM-0.9_LIBRARIES})
- set(LIBWPG02_FOUND TRUE)
- endif (LIBWPG02_FOUND)
- if (LIBWPG01_FOUND OR LIBWPG_02_FOUND)
+ INKSCAPE_PKG_CONFIG_FIND(LIBWPG-0.3 libwpg-0.3 0 libwpg/libwpg.h libwpg-0.3 wpg-0.3)
+ if (LIBWPG-0.3_FOUND)
+ find_package(LibRevenge)
+ if (LIBREVENGE_FOUND)
+ list(APPEND LIBWPG_INCLUDE_DIRS ${LIBWPG-0.3_INCLUDE_DIRS})
+ list(APPEND LIBWPG_LIBRARIES ${LIBWPG-0.3_LIBRARIES})
+ list(APPEND LIBWPG_INCLUDE_DIRS ${LIBREVENGE_INCLUDE_DIRS})
+ list(APPEND LIBWPG_LIBRARIES ${LIBREVENGE_LIBRARIES})
+ set(LIBWPG03_FOUND TRUE)
+ endif (LIBREVENGE_FOUND)
+ else()
+ INKSCAPE_PKG_CONFIG_FIND(LIBWPG-0.2 libwpg-0.2 0 libwpg/libwpg.h libwpg-0.2 wpg-0.2)
+ INKSCAPE_PKG_CONFIG_FIND(LIBWPD-0.9 libwpd-0.9 0 libwpd/libwpd.h libwpd-0.9 wpd-0.9)
+ INKSCAPE_PKG_CONFIG_FIND(LIBWPD-STREAM-0.9 libwpd-stream-0.9 0 libwpd/libwpd.h libwpd-0.9 wpd-stream-0.9)
+ if (LIBWPG-0.2_FOUND AND LIBWPD-STREAM-0.9_FOUND AND LIBWPD-0.9_FOUND)
+ list(APPEND LIBWPG_INCLUDE_DIRS ${LIBWPG-0.2_INCLUDE_DIRS})
+ list(APPEND LIBWPG_LIBRARIES ${LIBWPG-0.2_LIBRARIES})
+ list(APPEND LIBWPG_INCLUDE_DIRS ${LIBWPD-0.9_INCLUDE_DIRS})
+ list(APPEND LIBWPG_LIBRARIES ${LIBWPD-0.9_LIBRARIES})
+ list(APPEND LIBWPG_INCLUDE_DIRS ${LIBWPD-STREAM-0.9_INCLUDE_DIRS})
+ list(APPEND LIBWPG_LIBRARIES ${LIBWPD-STREAM-0.9_LIBRARIES})
+ set(LIBWPG02_FOUND TRUE)
+ else()
+ INKSCAPE_PKG_CONFIG_FIND(LIBWPG-0.1 libwpg-0.1 0 libwpg/libwpg.h libwpg-0.1 wpg-0.1)
+ INKSCAPE_PKG_CONFIG_FIND(LIBWPG-STREAM-0.1 libwpg-stream-0.1 0 libwpg/libwpg.h libwpg-0.1 wpg-stream-0.1)
+ INKSCAPE_PKG_CONFIG_FIND(LIBWPD-0.8 libwpd-0.8 0 libwpd/libwpd.h libwpd-0.8 wpd-0.8)
+ if (LIBWPG-0.1_FOUND AND LIBWPG-STREAM-0.1_FOUND AND LIBWPD-0.8_FOUND)
+ list(APPEND LIBWPG_INCLUDE_DIRS ${LIBWPG-0.1_INCLUDE_DIRS})
+ list(APPEND LIBWPG_LIBRARIES ${LIBWPG-0.1_LIBRARIES})
+ list(APPEND LIBWPG_INCLUDE_DIRS ${LIBWPG-STREAM-0.1_INCLUDE_DIRS})
+ list(APPEND LIBWPG_LIBRARIES ${LIBWPG-STREAM-0.1_LIBRARIES})
+ list(APPEND LIBWPG_INCLUDE_DIRS ${LIBWPD-0.8_INCLUDE_DIRS})
+ list(APPEND LIBWPG_LIBRARIES ${LIBWPD-0.8_LIBRARIES})
+ set(LIBWPG01_FOUND TRUE)
+ endif (LIBWPG-0.1_FOUND AND LIBWPG-STREAM-0.1_FOUND AND LIBWPD-0.8_FOUND)
+ endif (LIBWPG-0.2_FOUND AND LIBWPD-STREAM-0.9_FOUND AND LIBWPD-0.9_FOUND)
+ endif (LIBWPG-0.3_FOUND)
+ if (LIBWPG-0.1_FOUND OR LIBWPG-0.2_FOUND OR LIBWPG-0.3_FOUND)
set(LIBWPG_FOUND TRUE)
- endif (LIBWPG01_FOUND OR LIBWPG_02_FOUND)
+ endif (LIBWPG-0.1_FOUND OR LIBWPG-0.2_FOUND OR LIBWPG-0.3_FOUND)
endif (PKG_CONFIG_FOUND)
endif (LIBWPG_LIBRARIES AND LIBWPG_INCLUDE_DIRS)
diff --git a/config.h.cmake b/config.h.cmake
index 398608446..3bd7837bd 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -137,6 +137,9 @@
/* Use color space API from Poppler >= 0.26.0 */
#cmakedefine POPPLER_EVEN_NEWER_COLOR_SPACE_API 1
+/* Use color space API from Poppler >= 0.29.0 */
+#cmakedefine POPPLER_EVEN_NEWER_NEW_COLOR_SPACE_API 1
+
/* Use new error API from Poppler >= 0.20.0 */
#cmakedefine POPPLER_NEW_ERRORAPI
@@ -292,6 +295,24 @@
/* enable openoffice files (SVG jars) */
#cmakedefine WITH_INKJAR 1
+/* Build in libcdr */
+#cmakedefine WITH_LIBCDR 1
+
+/* Build using libcdr 0.0.x */
+#cmakedefine WITH_LIBCDR00 1
+
+/* Build using libcdr 0.1.x */
+#cmakedefine WITH_LIBCDR01 1
+
+/* Build in libvisio */
+#cmakedefine WITH_LIBVISIO 1
+
+/* Build using libvisio 0.0.x */
+#cmakedefine WITH_LIBVISIO00 1
+
+/* Build using libvisio 0.1.x */
+#cmakedefine WITH_LIBVISIO01 1
+
/* Build in libwpg */
#cmakedefine WITH_LIBWPG 1
@@ -301,6 +322,9 @@
/* Build in libwpg-0.2 */
#cmakedefine WITH_LIBWPG02 1
+/* Build in libwpg-0.3 */
+#cmakedefine WITH_LIBWPG03 1
+
/* Use MMX optimizations, if CPU supports it */
#cmakedefine WITH_MMX 1
diff --git a/po/ca.po b/po/ca.po
index 3d59ad78a..c6a14a4ad 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -506,7 +506,7 @@ msgstr "Membrana fina"
#: ../share/filters/filters.svg.h:156
msgid "Thin like a soap membrane"
-msgstr "Prim com una pel·lícula a la superfície de la sopa"
+msgstr "Prim com una pel·lícula a la superfície del sabó"
#: ../share/filters/filters.svg.h:158
msgid "Matte Ridge"
@@ -577,7 +577,7 @@ msgstr "Escorça"
#: ../share/filters/filters.svg.h:188
msgid "Bark texture, vertical; use with deep colors"
-msgstr "Textura d'escorça de forma vertical: useu-la amb color intensos"
+msgstr "Textura d'escorça de forma vertical: useu-la amb colors intensos"
#: ../share/filters/filters.svg.h:190
msgid "Lizard Skin"
@@ -893,7 +893,7 @@ msgstr "Gent"
#: ../share/filters/filters.svg.h:332
msgid "Colorized blotches, like a crowd of people"
-msgstr "Taques de diversos color, com en una gentada"
+msgstr "Taques de diversos colors, com en una gentada"
#: ../share/filters/filters.svg.h:334
msgid "Scotland"
@@ -916,7 +916,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:342
msgid "Cutout Glow"
-msgstr "Resplendor retallat"
+msgstr "Resplendor retallada"
#: ../share/filters/filters.svg.h:344
msgid "In and out glow with a possible offset and colorizable flood"
@@ -1301,7 +1301,7 @@ msgstr "TransparĂšncia rugosa"
#: ../share/filters/filters.svg.h:488
msgid "Adds a turbulent transparency which displaces pixels at the same time"
-msgstr "Afegeix una transparÚncia turbulent amb píxels desplaçats alhora"
+msgstr "Afegeix una transparÚncia turbulenta amb píxels desplaçats alhora"
#: ../share/filters/filters.svg.h:490
msgid "Gouache"
@@ -1607,7 +1607,7 @@ msgstr "Barreja oposada"
#: ../share/filters/filters.svg.h:628
msgid "Blend an image with its hue opposite"
-msgstr "Barreja una imatge amb la seua oposada"
+msgstr "Barreja una imatge amb la seva oposada"
#: ../share/filters/filters.svg.h:630
msgid "Hue to White"
@@ -1670,7 +1670,7 @@ msgid ""
"Overlays two copies with different blur amounts and modifiable blend and "
"composite"
msgstr ""
-"Superposa dues copies amb diferent grau de difuminat, mescla i composiciĂł"
+"Superposa dues cĂČpies amb diferent grau de difuminat, mescla i composiciĂł"
#: ../share/filters/filters.svg.h:658
msgid "Image Drawing Basic"
@@ -3203,7 +3203,7 @@ msgstr "Negre atzabeja"
#: ../share/patterns/patterns.svg.h:1
msgid "Stripes 1:1"
-msgstr "Rallat 1:1"
+msgstr "Ratllat 1:1"
#: ../share/patterns/patterns.svg.h:1
msgid "Stripes 1:1 white"
@@ -3683,7 +3683,7 @@ msgstr "Prohibit aparcar"
#: ../share/symbols/symbols.h:103 ../share/symbols/symbols.h:104
msgctxt "Symbol"
msgid "No Dogs"
-msgstr "Prohibit gossos"
+msgstr "Prohibits gossos"
#. Symbols: ./AigaSymbols.svg
#: ../share/symbols/symbols.h:105 ../share/symbols/symbols.h:106
@@ -4025,13 +4025,13 @@ msgstr "Retard"
#: ../share/symbols/symbols.h:175
msgctxt "Symbol"
msgid "Loop Limit Begin"
-msgstr "Inici del limit del bucle"
+msgstr "Inici del lĂ­mit del bucle"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:176
msgctxt "Symbol"
msgid "Loop Limit End"
-msgstr "Final del limit del bucle"
+msgstr "Final del lĂ­mit del bucle"
#. Symbols: ./LogicSymbols.svg
#: ../share/symbols/symbols.h:177
@@ -4450,7 +4450,7 @@ msgstr "Capsa 3D"
#: ../src/color-profile.cpp:853
#, c-format
msgid "Color profiles directory (%s) is unavailable."
-msgstr "El directori de les perfils de color (%s) no es troba disponible."
+msgstr "El directori dels perfils de color (%s) no es troba disponible."
#: ../src/color-profile.cpp:912 ../src/color-profile.cpp:929
msgid "(invalid UTF-8 string)"
@@ -4774,7 +4774,7 @@ msgstr "cantonada"
#: ../src/display/snap-indicator.cpp:164
msgid "text anchor"
-msgstr "ancora del text"
+msgstr "Ă ncora del text"
#: ../src/display/snap-indicator.cpp:167
msgid "text baseline"
@@ -4850,7 +4850,7 @@ msgstr "Cantonada"
#: ../src/display/snap-indicator.cpp:234
msgid "Text anchor"
-msgstr "Ancora del text"
+msgstr "Àncora del text"
#: ../src/display/snap-indicator.cpp:237
msgid "Multiple of grid spacing"
@@ -5452,7 +5452,7 @@ msgid ""
"between the given ranges to the full color range"
msgstr ""
"Canvia el nivell del canal especificat de la imatge seleccionada escalant a "
-"tota la gamma possible els valors compresos dins uns lĂ­mits ."
+"tota la gamma possible els valors compresos dins uns lĂ­mits."
#: ../src/extension/internal/bitmap/medianFilter.cpp:37
msgid "Median"
@@ -5736,7 +5736,7 @@ msgstr "OrientaciĂł del text:"
#: ../src/extension/internal/cairo-ps-out.cpp:376
#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:251
msgid "Embed fonts"
-msgstr "Fonts incrustades"
+msgstr "Tipus de lletra incrustats"
#: ../src/extension/internal/cairo-ps-out.cpp:335
#: ../src/extension/internal/cairo-ps-out.cpp:377
@@ -5954,11 +5954,11 @@ msgstr "Converteix línies de traços/punts a línies individuals"
#: ../src/extension/internal/emf-inout.cpp:3576
#: ../src/extension/internal/wmf-inout.cpp:3151
msgid "Convert gradients to colored polygon series"
-msgstr "Converteix el gradient a series de polĂ­gons pintats"
+msgstr "Converteix els degradats a sĂšries de polĂ­gons pintats"
#: ../src/extension/internal/emf-inout.cpp:3577
msgid "Use native rectangular linear gradients"
-msgstr "Usa un gradient lineal rectangular nadiu"
+msgstr "Usa un degradat lineal rectangular nadiu"
#: ../src/extension/internal/emf-inout.cpp:3578
msgid "Map all fill patterns to standard EMF hatches"
@@ -9815,7 +9815,7 @@ msgstr "Radi (unitat o %):"
#: ../src/live_effects/lpe-fillet-chamfer.cpp:62
msgid "Radius, in unit or %"
-msgstr "Radi, en l'unitat o %"
+msgstr "Radi, en la unitat o %"
#: ../src/live_effects/lpe-fillet-chamfer.cpp:63
msgid "Chamfer steps:"
@@ -10535,7 +10535,7 @@ msgstr "Creixement:"
#: ../src/live_effects/lpe-rough-hatches.cpp:226
msgid "Growth of distance between hatches."
-msgstr "Creixement de la distĂ ncia entre les lĂ­nies de al trama."
+msgstr "Creixement de la distĂ ncia entre les lĂ­nies de la trama."
#. FIXME: top/bottom names are inverted in the UI/svg and in the code!!
#: ../src/live_effects/lpe-rough-hatches.cpp:228
@@ -11006,7 +11006,7 @@ msgstr ""
#: ../src/live_effects/lpe-sketch.cpp:49
msgid "Average offset:"
-msgstr "DesviaciĂł mitja:"
+msgstr "DesviaciĂł mitjana:"
#: ../src/live_effects/lpe-sketch.cpp:50
msgid "Average distance each stroke is away from the original path"
@@ -11623,7 +11623,7 @@ msgstr "Mostra l'id,x,y,w,h de tots els objectes"
#: ../src/main.cpp:478
msgid "The ID of the object whose dimensions are queried"
-msgstr "L' ID de l'objecte les dimensions del qual es volen consultar"
+msgstr "L'ID de l'objecte les dimensions del qual es volen consultar"
#. TRANSLATORS: this option makes Inkscape print the name (path) of the extension directory
#: ../src/main.cpp:484
@@ -14354,7 +14354,7 @@ msgstr "Suprimeix els clons del mosaic"
msgid ""
"If you want to clone several objects, <b>group</b> them and <b>clone the "
"group</b>."
-msgstr "Per clonar varis objectes, <b>agrupeu-los</b> i <b>cloneu el grup</b>."
+msgstr "Per clonar diversos objectes, <b>agrupeu-los</b> i <b>cloneu el grup</b>."
#: ../src/ui/dialog/clonetiler.cpp:2238
msgid "<small>Creating tiled clones...</small>"
@@ -14917,7 +14917,7 @@ msgstr "Tanca en acabar"
#: ../src/ui/dialog/export.cpp:177
msgid "Once the export completes, close this dialog"
-msgstr "Un cop acabada la exportaciĂł, tanca aquest diĂ leg"
+msgstr "Un cop acabada l'exportaciĂł, tanca aquest diĂ leg"
#: ../src/ui/dialog/export.cpp:179
msgid "_Export"
@@ -16344,7 +16344,7 @@ msgstr "Selecciona tots els elements afectats"
#: ../src/ui/dialog/font-substitution.cpp:114
msgid "Don't show this warning again"
-msgstr "No mostris més aquest avis"
+msgstr "No mostris més aquest avís"
#: ../src/ui/dialog/font-substitution.cpp:255
msgid "Font '%1' substituted with '%2'"
@@ -16993,7 +16993,7 @@ msgstr "Meetei mayek"
#: ../src/ui/dialog/glyphs.cpp:286
msgid "Hangul Syllables"
-msgstr "Síl·libes Hangul"
+msgstr "Síl·labes Hangul"
#: ../src/ui/dialog/glyphs.cpp:287
msgid "Hangul Jamo Extended-B"
@@ -17210,7 +17210,7 @@ msgstr "Ampliat:"
#: ../src/ui/dialog/icon-preview.cpp:240
msgid "Actual Size:"
-msgstr "Mida actual:"
+msgstr "Mida real:"
#: ../src/ui/dialog/icon-preview.cpp:245
msgctxt "Icon preview window"
@@ -17265,7 +17265,7 @@ msgstr "cops per l'amplada de traç actual"
#: ../src/ui/dialog/inkscape-preferences.cpp:205
msgid "Size of dots created with Ctrl+click (relative to current stroke width)"
msgstr ""
-"Mida del punts creats amb Ctrl+clic (relativa a l'amplada de traç actual)"
+"Mida dels punts creats amb Ctrl+clic (relativa a l'amplada de traç actual)"
#: ../src/ui/dialog/inkscape-preferences.cpp:220
msgid "<b>No objects selected</b> to take the style from."
@@ -18868,7 +18868,7 @@ msgid ""
"The ICC profile to use to calibrate display output.\n"
"Searched directories:%s"
msgstr ""
-"El perfil ICC que s'ha de usar per calibrar la sortida de la pantalla.\n"
+"El perfil ICC que s'ha d'usar per calibrar la sortida de la pantalla.\n"
"Directoris on s'ha buscat:%s"
#: ../src/ui/dialog/inkscape-preferences.cpp:971
@@ -19100,7 +19100,7 @@ msgstr "Acoloreix els marcadors personalitzats del mateix color que l'objecte"
#: ../src/ui/dialog/inkscape-preferences.cpp:1146
#: ../src/ui/dialog/inkscape-preferences.cpp:1356
msgid "Update marker color when object color changes"
-msgstr "Actualitza el color del marcador quan canvii el color de l'objecte"
+msgstr "Actualitza el color del marcador quan canviĂŻ el color de l'objecte"
#. Selecting options
#: ../src/ui/dialog/inkscape-preferences.cpp:1149
@@ -19580,7 +19580,7 @@ msgid ""
"(possibly in groups), relink the duplicated clone to the duplicated original "
"instead of the old original"
msgstr ""
-"En duplicar una selecció que conté tan el clon com l'original (cosa possible "
+"En duplicar una selecció que conté tant el clon com l'original (cosa possible "
"amb grups), torna a enllaçar el clon duplicat amb l'original duplicat en "
"comptes de fer-ho amb l'original antic"
@@ -19672,7 +19672,7 @@ msgid ""
"Stroke color same as object, fill color either object fill color or marker "
"fill color"
msgstr ""
-"Color de contorn igual que el objecte; color d'emplenat, color d'emplenat de "
+"Color de contorn igual que l'objecte; color d'emplenat, color d'emplenat de "
"l'objecte o bé color d'emplenat del marcador"
#: ../src/ui/dialog/inkscape-preferences.cpp:1358
@@ -22525,7 +22525,7 @@ msgid ""
"<b>Shift+Ctrl</b>: snap rotation angle to %g° increments and rotate both "
"handles"
msgstr ""
-"<b>Maj+Ctrl</b>: ajusta l'angle de rotaciĂł amb increments de %gÂș i gira les "
+"<b>Maj+Ctrl</b>: ajusta l'angle de rotació amb increments de %g° i gira les "
"dues nanses"
#: ../src/ui/tool/node.cpp:528
@@ -22538,7 +22538,7 @@ msgstr "<b>Ctrl</b>: Mou la nansa per les seves passes reals en l'efecte viu BSp
msgctxt "Path handle tip"
msgid "<b>Ctrl</b>: snap rotation angle to %g° increments, click to retract"
msgstr ""
-"<b>Ctrl</b>: ajusta l'angle de rotaciĂł amb increments de %gÂș, clica per "
+"<b>Ctrl</b>: ajusta l'angle de rotació amb increments de %g°, clica per "
"rectificar"
#: ../src/ui/tool/node.cpp:536
@@ -22793,13 +22793,13 @@ msgstr ""
#, c-format
msgctxt "Transform handle tip"
msgid "Skew horizontally by %.2f°"
-msgstr "Inclina horitzontalment %.2fÂș"
+msgstr "Inclina horitzontalment %.2f°"
#: ../src/ui/tool/transform-handle-set.cpp:597
#, c-format
msgctxt "Transform handle tip"
msgid "Skew vertically by %.2f°"
-msgstr "Inclina verticalment %.2fÂș"
+msgstr "Inclina verticalment %.2f°"
#: ../src/ui/tool/transform-handle-set.cpp:656
msgctxt "Transform handle tip"
@@ -24499,11 +24499,11 @@ msgstr "<b>mit.</b>"
#: ../src/ui/widget/selected-style.cpp:246
msgid "Fill is averaged over selected objects"
-msgstr "L'emplenat és una mitja dels objectes seleccionats"
+msgstr "L'emplenat és una mitjana dels objectes seleccionats"
#: ../src/ui/widget/selected-style.cpp:246
msgid "Stroke is averaged over selected objects"
-msgstr "El traç és una mitja dels objectes seleccionats"
+msgstr "El traç és una mitjana dels objectes seleccionats"
#. TRANSLATOR COMMENT: M means "Multiple"
#: ../src/ui/widget/selected-style.cpp:249
@@ -24630,7 +24630,7 @@ msgstr "Amplada del traç: %.5g%s%s"
#: ../src/ui/widget/selected-style.cpp:1162
msgid " (averaged)"
-msgstr " (mitja)"
+msgstr " (mitjana)"
#: ../src/ui/widget/selected-style.cpp:1188
msgid "0 (transparent)"
@@ -25925,7 +25925,7 @@ msgstr "B_loca o desbloca la capa actual"
#: ../src/verbs.cpp:2682
msgid "Toggle lock on current layer"
-msgstr "Commuta boqueig a la capa actual"
+msgstr "Commuta el boqueig a la capa actual"
#: ../src/verbs.cpp:2683
msgid "_Show/hide Current Layer"
@@ -25938,7 +25938,7 @@ msgstr "Commuta la visibilitat de la capa actual"
#. Object
#: ../src/verbs.cpp:2687
msgid "Rotate _90° CW"
-msgstr "Gira _90Âș en sentit horari"
+msgstr "Gira _90° en sentit horari"
#. This is shared between tooltips and statusbar, so they
#. must use UTF-8, not HTML entities for special characters.
@@ -25948,7 +25948,7 @@ msgstr "Gira la selecció 90° en sentit horari"
#: ../src/verbs.cpp:2691
msgid "Rotate 9_0° CCW"
-msgstr "Gira 9_0Âș en sentit antihorari"
+msgstr "Gira 9_0° en sentit antihorari"
#. This is shared between tooltips and statusbar, so they
#. must use UTF-8, not HTML entities for special characters.
@@ -26928,7 +26928,7 @@ msgstr "Editor de tipografia SVG..."
#: ../src/verbs.cpp:2949
msgid "Edit SVG fonts"
-msgstr "Edita els tipografia SVG"
+msgstr "Edita les tipografies SVG"
#: ../src/verbs.cpp:2950
msgid "Print Colors..."
@@ -28523,7 +28523,7 @@ msgstr ""
msgid ""
"Fill is solid unless a subpath is counterdirectional (fill-rule: nonzero)"
msgstr ""
-"L'emplenat és solid excepte si el subcamí va en sentit oposat (regla: "
+"L'emplenat Ă©s sĂČlid excepte si el subcamĂ­ va en sentit oposat (regla: "
"nonzero)"
#: ../src/widgets/paint-selector.cpp:600
@@ -28797,7 +28797,7 @@ msgstr "Menor"
#: ../src/widgets/ruler.cpp:210
msgid "Lower limit of ruler"
-msgstr "Limit menor del regle"
+msgstr "LĂ­mit menor del regle"
#: ../src/widgets/ruler.cpp:219
msgid "Upper"
@@ -28805,7 +28805,7 @@ msgstr "Superior"
#: ../src/widgets/ruler.cpp:220
msgid "Upper limit of ruler"
-msgstr "Limit superior del regle"
+msgstr "LĂ­mit superior del regle"
#: ../src/widgets/ruler.cpp:230
msgid "Position of mark on the ruler"
@@ -30012,7 +30012,7 @@ msgstr "LĂ­nia base del text"
#: ../src/widgets/toolbox.cpp:1806
msgid "Snap text anchors and baselines"
-msgstr "Ajusta les ancores del text i les lĂ­nies base"
+msgstr "Ajusta les Ă ncores del text i les lĂ­nies base"
#: ../src/widgets/toolbox.cpp:1816
msgid "Page border"
@@ -30141,7 +30141,7 @@ msgstr "Mode atrau/repel"
#: ../src/widgets/tweak-toolbar.cpp:220
msgid "Attract parts of paths towards cursor; with Shift from cursor"
-msgstr "Atrau els camins cap al cursor o bĂ© els repel amb la tecla MajĂșscules"
+msgstr "Atrau els camins cap al cursor o bĂ© els repel·leix amb la tecla MajĂșscules"
#: ../src/widgets/tweak-toolbar.cpp:226
msgid "Roughen mode"
@@ -30618,7 +30618,7 @@ msgstr ""
#: ../share/extensions/gcodetools.py:6110
msgid "Lathe X and Z axis remap should be the same. Exiting..."
msgstr ""
-"Els eixos de gir X i Z reassignats haurien de ser el mateixos. S'estĂ  "
+"Els eixos de gir X i Z reassignats haurien de ser els mateixos. S'estĂ  "
"sortint..."
#: ../share/extensions/gcodetools.py:6662
@@ -30698,7 +30698,7 @@ msgid ""
"The HPGL data contained unknown (unsupported) commands, there is a "
"possibility that the drawing is missing some content."
msgstr ""
-"Les dades HPGL contenen comandaments desconeguts (sense suport), hi ha una "
+"Les dades HPGL contenen ordres desconegudes (sense suport), hi ha una "
"possibilitat que el dibuix hagi perdut una part del contingut."
#. issue error if no paths found
@@ -30719,7 +30719,7 @@ msgid ""
"Technical details:\n"
"%s"
msgstr ""
-"El fantĂ stic emulador lxml per libxml2 es necessari per a inkex.py. "
+"El fantàstic emulador lxml per libxml2 és necessari per a inkex.py. "
"Baixeu-vos i instal·leu-vos l'Ășltima versiĂł de lxml de "
"http://cheeseshop.python.org/pypi/lxml/, o bé feu-ho a través del gestor de "
"paquets des de la lĂ­nia d'ordres: sudo apt-get install python-lxml\n"
@@ -30870,7 +30870,7 @@ msgstr ""
#: ../share/extensions/jessyInk_summary.py:123
msgid "{0}\t\"{1}\" (object id \"{2}\") will be replaced by \"{3}\"."
-msgstr "{0}\t\"{1}\" (l'object amb id \"{2}\") serà reemplaçat per \"{3}\"."
+msgstr "{0}\t\"{1}\" (l'objecte amb id \"{2}\") serà reemplaçat per \"{3}\"."
#: ../share/extensions/jessyInk_summary.py:168
msgid ""
@@ -30979,7 +30979,7 @@ msgid ""
"Please choose a larger object or set 'Space between copies' > 0"
msgstr ""
"La longitud total del patró és massa petita: \n"
-"Trieu un objecte major o configureu «Espai entre copies» > 0"
+"Trieu un objecte major o configureu «Espai entre cĂČpies» > 0"
#: ../share/extensions/pathalongpath.py:277
msgid ""
@@ -31181,7 +31181,7 @@ msgstr "IntroduĂŻu una tipografia substituta a la caixa."
#: ../share/extensions/replace_font.py:253
msgid "Please enter a replacement font in the replace all box."
-msgstr "IntroduĂŻu un tipografia substituta a totes les caixes."
+msgstr "IntroduĂŻu una tipografia substituta a totes les caixes."
#: ../share/extensions/summersnight.py:44
msgid ""
@@ -31235,7 +31235,7 @@ msgstr "Oops... L'element \"%s\" no és a la capa web lliscadora"
#: ../share/extensions/webslicer_export.py:57
msgid "You must give a directory to export the slices."
-msgstr "Cal que doneu un directori per exportar el fragments."
+msgstr "Cal que doneu un directori per exportar els fragments."
#: ../share/extensions/webslicer_export.py:69
#, python-format
@@ -31433,9 +31433,9 @@ msgstr ""
"Ajusta el to, la saturaciĂł, i la brillantor de la representaciĂł HSL dels "
"objectes en color.\n"
"Opcions:\n"
-" * To: gir en graus (dona voltes).\n"
-" * SaturaciĂł: afegeix/treu % (min=-100, mĂ x=100).\n"
-" * Brillantor: afegeix/treu % (min=-100, mĂ x=100).\n"
+" * To: gir en graus (dĂłna voltes).\n"
+" * SaturaciĂł: afegeix/treu % (mĂ­n=-100, mĂ x=100).\n"
+" * Brillantor: afegeix/treu % (mĂ­n=-100, mĂ x=100).\n"
" * To/SaturaciĂł/Brillantor aleatĂČries: Fes aleatoris el valor dels "
"parĂ metres.\n"
" "
@@ -32081,7 +32081,7 @@ msgstr ""
"- El parĂ metre unitat base especifica en quina unitat de les coordenades estĂ  "
"la sortida (96 px = 1 in).\n"
"- Tipus d'elements suportats\n"
-" - Camins ( lĂ­nies i splines)\n"
+" - Camins (lĂ­nies i splines)\n"
" - Rectangles\n"
" - Clons (la referĂšncia creuada amb l'original s'ha perdut)\n"
"- L'opció de sortida spline ROBO-Master només es pot llegir correctament amb "
@@ -32284,7 +32284,7 @@ msgid ""
"home directory."
msgstr ""
"* No escriviu l'extensiĂł del fitxer, ja s'afegirĂ  automĂ ticament.\n"
-"* El camĂ­ relatius (o noms de fitxers sense camĂ­) sĂłn relatius a la "
+"* El camĂ­ relatiu (o noms de fitxers sense camĂ­) sĂłn relatius a la "
"carpeta de l'usuari."
#: ../share/extensions/extrude.inx.h:3
@@ -32389,7 +32389,7 @@ msgstr "Empra coordenades polars"
msgid ""
"When set, Isotropic scaling uses smallest of width/xrange or height/yrange"
msgstr ""
-"Quan estĂ  configurat , l'escalat isotrĂČpic empra el mĂ­nim entre amplada/rangX "
+"Quan estĂ  configurat, l'escalat isotrĂČpic empra el mĂ­nim entre amplada/rangX "
"o alçada/rangY"
#: ../share/extensions/funcplot.inx.h:12
@@ -32524,10 +32524,10 @@ msgstr ""
"El connector Gcodetools: converteix els camins a Gcode (usant interpolaciĂł "
"circular), fa desplaçament de camins i grava cantons afilats usant talladors "
"de con. Aquest connector calcula Gcode per als camins mitjançant la "
-"interpolaciĂł circular o moviment lineal quan sigui necessari. El tutorials, "
-"manuals i suport es poden trobar al fĂČrum de suport de anglĂšs: "
-"http://www.cnc-club.ru/gcodetools i al fĂČrum de suport de RĂșssia: "
-"http://www.cnc-club.ru/gcodetoolsru Credits: Nick Drobchenko, Vladimir "
+"interpolaciĂł circular o moviment lineal quan sigui necessari. Els tutorials, "
+"manuals i suport es poden trobar al fĂČrum de suport en anglĂšs: "
+"http://www.cnc-club.ru/gcodetools i al fĂČrum de suport en rus: "
+"http://www.cnc-club.ru/gcodetoolsru CrĂšdits: Nick Drobchenko, Vladimir "
"Kalyaev, John Brooker, Henry Nicolas, Chris Lusby Taylor. Gcodetools ver. 1.7"
#: ../share/extensions/gcodetools_about.inx.h:5
@@ -32625,7 +32625,7 @@ msgid ""
"+Ctrl+G) 3. Press Apply Suspected small objects will be marked out by "
"colored arrows."
msgstr ""
-"Ús: 1. Seleccioneu totes les desplaçaments d'àrea (traços grisos) 2. Objecte "
+"Ús: 1. Seleccioneu totes els desplaçaments d'àrea (traços grisos) 2. Objecte "
"/ Desagrupa (Maj+ Ctrl + G) 3. Feu clic a Aplica, els objectes petits es "
"marcaran amb fletxes de colors."
@@ -32875,7 +32875,7 @@ msgstr "Capgira l'eix «Y» i parametritza Gcode "
#: ../share/extensions/gcodetools_lathe.inx.h:44
#: ../share/extensions/gcodetools_path_to_gcode.inx.h:33
msgid "Round all values to 4 digits"
-msgstr "Arredoneix tots el valors a 4 dĂ­gits"
+msgstr "Arredoneix tots els valors a 4 dĂ­gits"
#: ../share/extensions/gcodetools_area.inx.h:52
#: ../share/extensions/gcodetools_dxf_points.inx.h:24
@@ -33054,7 +33054,7 @@ msgstr ""
"(desplaçament, escala, mirall, rotació en el pla XY) del camí. Mode 3 punts "
"només: no poseu els tres punts en una sola línia (utilitzeu el mode 2 punts "
"en el seu lloc). Podeu modificar després els valors de la superfície Z, la "
-"profunditat Z utilitzant l'eina de text (3ra coordenada). Si no hi ha punts "
+"profunditat Z utilitzant l'eina de text (3a coordenada). Si no hi ha punts "
"dins de la capa actual es prenen de la capa superior. No desagrupeu els punts "
"d'orientaciĂł! Podeu seleccionar usant doble clic per entrar el grup o amb "
"Ctrl + Clic. Ara premeu s'aplicarĂ  per crear punts de control (conjunt "
@@ -33118,7 +33118,7 @@ msgstr "Prepara el camĂ­ per al plasma"
#: ../share/extensions/gcodetools_prepare_path_for_plasma.inx.h:2
msgid "Prepare path for plasma or laser cuters"
-msgstr "Prepara el camĂ­ per al plasma el cĂșter laser"
+msgstr "Prepara el camĂ­ per al plasma el lĂ ser cĂșter"
#: ../share/extensions/gcodetools_prepare_path_for_plasma.inx.h:3
msgid "Create in-out paths"
@@ -33253,7 +33253,7 @@ msgstr ""
"\n"
"Si la vora és zero, el patró serà discontinu als cantons. Utilitzeu una vora "
"positiva, preferiblement més gran que la mida de cel·la, per produir una unió "
-"suau del patrĂł als cantons. Utilitzeu una vora negatiu per reduir la mida del "
+"suau del patrĂł als cantons. Utilitzeu una vora negativa per reduir la mida del "
"patrĂł i obtenir una vora buida."
#: ../share/extensions/gimp_xcf.inx.h:1
@@ -33779,7 +33779,7 @@ msgstr ""
"Aquesta extensiĂł renderitza una lĂ­nia de text usant\n"
"tipus de lletra\"Hershey\" per a impressores, derivats de \n"
"NBS SP-424 1976-04, \"Una contribuciĂł a \n"
-"les tĂšcniques d'escritura per ordinador: Taules de \n"
+"les tĂšcniques d'escriptura per ordinador: Taules de \n"
"coordenades pel repertori Hershey's Repertory dels\n"
"tipus de lletra occidentals i dels sĂ­mbols grĂ fics.\"\n"
"\n"
@@ -33919,7 +33919,7 @@ msgstr "Gira en sentit horari:"
#: ../share/extensions/hpgl_output.inx.h:15
#: ../share/extensions/plotter.inx.h:34
msgid "Rotation of the drawing (Default: 0°)"
-msgstr "Gir del dibuix (Per defecte: 0Âș)"
+msgstr "Gir del dibuix (Per defecte: 0°)"
#: ../share/extensions/hpgl_output.inx.h:16
#: ../share/extensions/plotter.inx.h:35
@@ -35017,7 +35017,7 @@ msgstr "OrientaciĂł del text: "
#: ../share/extensions/measure.inx.h:5
msgid "Angle [with Fixed Angle option only] (°):"
-msgstr "Angle [nomĂ©s amb l'opciĂł d'angle fixat] (Âș):"
+msgstr "Angle [només amb l'opció d'angle fixat] (°):"
#: ../share/extensions/measure.inx.h:6
msgid "Font size (px):"
@@ -35485,7 +35485,7 @@ msgstr ""
#: ../share/extensions/plotter.inx.h:21
msgid "Parallel (LPT) connections are not supported."
-msgstr "No es suporten les connexions paral·lel (LPT)."
+msgstr "No se suporten les connexions paral·lel (LPT)."
#: ../share/extensions/plotter.inx.h:32
msgid ""
@@ -35499,7 +35499,7 @@ msgstr ""
#: ../share/extensions/plotter.inx.h:33
msgid "Rotation (°, clockwise):"
-msgstr "Gira en sentit horari(Âș):"
+msgstr "Gira en sentit horari(°):"
#: ../share/extensions/plotter.inx.h:52
msgid "Show debug information"
@@ -35532,7 +35532,7 @@ msgstr "Sortida d'AutoCAD Plot"
#: ../share/extensions/plt_output.inx.h:3
msgid "Save a file for plotters"
-msgstr "Desa un fitxer per a plĂłters"
+msgstr "Desa un fitxer per a plĂČters"
#: ../share/extensions/polyhedron_3d.inx.h:1
msgid "3D Polyhedron"
@@ -35932,7 +35932,7 @@ msgstr "Pas (mida entre dents):"
#: ../share/extensions/render_gears.inx.h:4
msgid "Pressure angle (degrees):"
-msgstr "Angle de pressiĂł (Âș):"
+msgstr "Angle de pressió (°):"
#: ../share/extensions/render_gears.inx.h:5
msgid "Diameter of center hole (0 for none):"
@@ -36206,7 +36206,7 @@ msgid ""
"level."
msgstr ""
"Aquesta extensiĂł optimitza el fitxer SVG d'acord a les segĂŒents opcions:\n"
-" * Escurça els nom de color: Converteix tots els colors a format #RRGGBB "
+" * Escurça els noms de colors: Converteix tots els colors a format #RRGGBB "
"o #RGB.\n"
" * Converteix els atributs CSS a XML: converteix els estils des de les "
"etiquetes d'estils i declaracions d'estil interior=\"\" a atributs XML.\n"
@@ -36247,7 +36247,7 @@ msgstr ""
"més curt a l'element més referenciat. Per exemple, #linearGradient5621, "
"referenciat 100 cops, es pot convertir en #a.\n"
" * Preserva els noms ID creats manualment que no s'acabin amb dĂ­gits: en "
-"general, la sortida SVG optimitzada el suprimeix, perĂČ si es necessari per "
+"general, la sortida SVG optimitzada el suprimeix, perĂČ si Ă©s necessari per "
"referĂšncies (p.e. #middledot), podeu usar aquesta opciĂł.\n"
" * Preserva aquests noms ID, separats amb coma: podeu usar-ho junt amb "
"les altres opcions de preservació si voleu preservar més noms ID "
@@ -36659,7 +36659,7 @@ msgid ""
"Each layer split into it's own svg file and collected as a tape archive (tar "
"file)"
msgstr ""
-"Cada capa divideix el seu propi fitxer svg i el colecta com un sol fitxer "
+"Cada capa divideix el seu propi fitxer svg i el recull com un sol fitxer "
"(fitxer tar)"
#: ../share/extensions/text_braille.inx.h:1
diff --git a/po/de.po b/po/de.po
index ce41974c4..15d76defe 100644
--- a/po/de.po
+++ b/po/de.po
@@ -14,21 +14,21 @@
# Alexander Senger <neutronenspalter@freenet.de>, 2009.
# Benjamin Weis <benjamin.weis@gmx.com>, 2014.
# Heiko Wöhrle <mail@heikowoehrle.de>, 2014.
+# Eduard Braun <eduard.braun2@gmx.de>, 2015.
#
msgid ""
msgstr ""
"Project-Id-Version: inkscape\n"
"Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2015-01-25 08:39+0100\n"
-"PO-Revision-Date: 2015-01-05 09:36+0100\n"
-"Last-Translator: Heiko Wöhrle <mail@heikowoehrle.de>\n"
+"POT-Creation-Date: 2015-03-10 09:10+0100\n"
+"PO-Revision-Date: 2015-04-21 02:20+0200\n"
+"Last-Translator: Eduard Braun <eduard.braun2@gmx.de>\n"
"Language-Team: <de@li.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.7.1\n"
"X-Poedit-Basepath: .\n"
"X-Poedit-SourceCharset: utf-8\n"
"X-Language: de_DE\n"
@@ -1034,7 +1034,7 @@ msgstr "Dreidimensional verkrĂŒmmte, faserige Holztextur"
#: ../share/filters/filters.svg.h:402
msgid "3D Mother of Pearl"
-msgstr "3D Mutter der Perlen"
+msgstr "3D Perlmutt"
#: ../share/filters/filters.svg.h:404
msgid "3D warped, iridescent pearly shell texture"
@@ -1060,26 +1060,27 @@ msgstr "Schwarzlicht"
#: ../src/extension/internal/filter/bumps.h:101
#: ../src/extension/internal/filter/bumps.h:321
#: ../src/extension/internal/filter/bumps.h:328
-#: ../src/extension/internal/filter/color.h:82
-#: ../src/extension/internal/filter/color.h:164
-#: ../src/extension/internal/filter/color.h:171
-#: ../src/extension/internal/filter/color.h:262
-#: ../src/extension/internal/filter/color.h:340
-#: ../src/extension/internal/filter/color.h:347
-#: ../src/extension/internal/filter/color.h:437
-#: ../src/extension/internal/filter/color.h:532
-#: ../src/extension/internal/filter/color.h:654
-#: ../src/extension/internal/filter/color.h:751
-#: ../src/extension/internal/filter/color.h:830
-#: ../src/extension/internal/filter/color.h:921
-#: ../src/extension/internal/filter/color.h:1049
-#: ../src/extension/internal/filter/color.h:1119
-#: ../src/extension/internal/filter/color.h:1212
-#: ../src/extension/internal/filter/color.h:1324
-#: ../src/extension/internal/filter/color.h:1429
-#: ../src/extension/internal/filter/color.h:1505
-#: ../src/extension/internal/filter/color.h:1609
-#: ../src/extension/internal/filter/color.h:1616
+#: ../src/extension/internal/filter/color.h:83
+#: ../src/extension/internal/filter/color.h:165
+#: ../src/extension/internal/filter/color.h:172
+#: ../src/extension/internal/filter/color.h:283
+#: ../src/extension/internal/filter/color.h:337
+#: ../src/extension/internal/filter/color.h:415
+#: ../src/extension/internal/filter/color.h:422
+#: ../src/extension/internal/filter/color.h:512
+#: ../src/extension/internal/filter/color.h:607
+#: ../src/extension/internal/filter/color.h:729
+#: ../src/extension/internal/filter/color.h:826
+#: ../src/extension/internal/filter/color.h:905
+#: ../src/extension/internal/filter/color.h:996
+#: ../src/extension/internal/filter/color.h:1124
+#: ../src/extension/internal/filter/color.h:1194
+#: ../src/extension/internal/filter/color.h:1287
+#: ../src/extension/internal/filter/color.h:1399
+#: ../src/extension/internal/filter/color.h:1504
+#: ../src/extension/internal/filter/color.h:1580
+#: ../src/extension/internal/filter/color.h:1684
+#: ../src/extension/internal/filter/color.h:1691
#: ../src/extension/internal/filter/morphology.h:194
#: ../src/extension/internal/filter/overlays.h:73
#: ../src/extension/internal/filter/paint.h:99
@@ -1089,7 +1090,7 @@ msgstr "Schwarzlicht"
#: ../src/extension/internal/filter/transparency.h:345
#: ../src/filter-enums.cpp:67 ../src/ui/dialog/clonetiler.cpp:830
#: ../src/ui/dialog/clonetiler.cpp:981
-#: ../src/ui/dialog/document-properties.cpp:157
+#: ../src/ui/dialog/document-properties.cpp:164
#: ../share/extensions/color_HSL_adjust.inx.h:20
#: ../share/extensions/color_blackandwhite.inx.h:3
#: ../share/extensions/color_brighter.inx.h:2
@@ -3933,14 +3934,13 @@ msgstr "Sortieren"
#: ../share/symbols/symbols.h:161
msgctxt "Symbol"
msgid "Connector"
-msgstr "Verbinder"
+msgstr "Objektverbinder"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:162
-#, fuzzy
msgctxt "Symbol"
msgid "Off-Page Connector"
-msgstr "Objektverbinder"
+msgstr "SeitenĂŒbergreifender Objektverbinder"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:163
@@ -4238,17 +4238,15 @@ msgstr "Hafen"
#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:239 ../share/symbols/symbols.h:240
-#, fuzzy
msgctxt "Symbol"
msgid "Motorbike Trail"
-msgstr "Schneemobilweg"
+msgstr "Motorradstrecke"
#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:241 ../share/symbols/symbols.h:242
-#, fuzzy
msgctxt "Symbol"
msgid "Radiator Water"
-msgstr "SĂ€ttigung"
+msgstr "KĂŒhlwasser"
#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:243 ../share/symbols/symbols.h:244
@@ -4386,12 +4384,11 @@ msgstr "Windsurfen"
#: ../share/symbols/symbols.h:291
msgctxt "Symbol"
msgid "Blank"
-msgstr ""
+msgstr "Leer"
#: ../share/templates/templates.h:1
-#, fuzzy
msgid "CD Label 120mmx120mm "
-msgstr "CD-Beschriftung 120x120 "
+msgstr "CD Etikett 120mm×120mm "
#: ../share/templates/templates.h:1
msgid "Simple CD Label template with disc's pattern."
@@ -4422,9 +4419,8 @@ msgid "LaTeX beamer template with helping grid."
msgstr "LaTeX Beamervorlage mit Hilfsgitter."
#: ../share/templates/templates.h:1
-#, fuzzy
msgid "LaTex LaTeX latex grid beamer"
-msgstr "LaTex LaTeX latex Gitter Projektion"
+msgstr "LaTex LaTeX latex Gitter Beamer"
#: ../share/templates/templates.h:1
msgid "Typography Canvas"
@@ -4439,22 +4435,22 @@ msgid "guidelines typography canvas"
msgstr "Leitfaden TypografiearbeitsflÀche"
#. 3D box
-#: ../src/box3d.cpp:260 ../src/box3d.cpp:1314
+#: ../src/box3d.cpp:250 ../src/box3d.cpp:1304
#: ../src/ui/dialog/inkscape-preferences.cpp:407
msgid "3D Box"
msgstr "3D-Box"
-#: ../src/color-profile.cpp:853
+#: ../src/color-profile.cpp:842
#, c-format
msgid "Color profiles directory (%s) is unavailable."
msgstr "Farbprofilverzeichnis (%s) ist nicht verfĂŒgbar."
-#: ../src/color-profile.cpp:912 ../src/color-profile.cpp:929
+#: ../src/color-profile.cpp:901 ../src/color-profile.cpp:918
msgid "(invalid UTF-8 string)"
msgstr "(ungĂŒltiger UTF-8 string)"
# CHECK
-#: ../src/color-profile.cpp:914
+#: ../src/color-profile.cpp:903
msgctxt "Profile name"
msgid "None"
msgstr "Kein"
@@ -4471,23 +4467,23 @@ msgstr ""
"<b>Aktuelle Ebene ist gesperrt</b>. Entsperren Sie sie, um darauf zu "
"zeichnen."
-#: ../src/desktop-events.cpp:236
+#: ../src/desktop-events.cpp:242
msgid "Create guide"
msgstr "Hilfslinien erstellen"
-#: ../src/desktop-events.cpp:492
+#: ../src/desktop-events.cpp:498
msgid "Move guide"
-msgstr "FĂŒhrungslinie verschieben"
+msgstr "Hilfslinie verschieben"
-#: ../src/desktop-events.cpp:499 ../src/desktop-events.cpp:557
+#: ../src/desktop-events.cpp:505 ../src/desktop-events.cpp:563
#: ../src/ui/dialog/guides.cpp:138
msgid "Delete guide"
-msgstr "FĂŒhrungslinie löschen"
+msgstr "Hilfslinie löschen"
-#: ../src/desktop-events.cpp:537
+#: ../src/desktop-events.cpp:543
#, c-format
msgid "<b>Guideline</b>: %s"
-msgstr "<b>FĂŒhrungslinie</b>: %s"
+msgstr "<b>Hilfslinie</b>: %s"
#: ../src/desktop.cpp:873
msgid "No previous zoom."
@@ -4497,92 +4493,92 @@ msgstr "Kein vorheriger Zoomfaktor."
msgid "No next zoom."
msgstr "Kein nÀchster Zoomfaktor."
-#: ../src/display/canvas-axonomgrid.cpp:353 ../src/display/canvas-grid.cpp:693
+#: ../src/display/canvas-axonomgrid.cpp:361 ../src/display/canvas-grid.cpp:701
msgid "Grid _units:"
msgstr "Gitter-Raster_einheiten:"
-#: ../src/display/canvas-axonomgrid.cpp:355 ../src/display/canvas-grid.cpp:695
+#: ../src/display/canvas-axonomgrid.cpp:363 ../src/display/canvas-grid.cpp:703
msgid "_Origin X:"
msgstr "_Ursprung X:"
-#: ../src/display/canvas-axonomgrid.cpp:355 ../src/display/canvas-grid.cpp:695
+#: ../src/display/canvas-axonomgrid.cpp:363 ../src/display/canvas-grid.cpp:703
#: ../src/ui/dialog/inkscape-preferences.cpp:746
#: ../src/ui/dialog/inkscape-preferences.cpp:771
msgid "X coordinate of grid origin"
msgstr "X-Koordinate des Gitterursprungs"
-#: ../src/display/canvas-axonomgrid.cpp:358 ../src/display/canvas-grid.cpp:698
+#: ../src/display/canvas-axonomgrid.cpp:366 ../src/display/canvas-grid.cpp:706
msgid "O_rigin Y:"
msgstr "U_rsprung Y:"
-#: ../src/display/canvas-axonomgrid.cpp:358 ../src/display/canvas-grid.cpp:698
+#: ../src/display/canvas-axonomgrid.cpp:366 ../src/display/canvas-grid.cpp:706
#: ../src/ui/dialog/inkscape-preferences.cpp:747
#: ../src/ui/dialog/inkscape-preferences.cpp:772
msgid "Y coordinate of grid origin"
msgstr "Y-Koordinate des Gitterursprungs"
-#: ../src/display/canvas-axonomgrid.cpp:361 ../src/display/canvas-grid.cpp:704
+#: ../src/display/canvas-axonomgrid.cpp:369 ../src/display/canvas-grid.cpp:712
msgid "Spacing _Y:"
msgstr "Abstand _Y:"
-#: ../src/display/canvas-axonomgrid.cpp:361
+#: ../src/display/canvas-axonomgrid.cpp:369
#: ../src/ui/dialog/inkscape-preferences.cpp:775
msgid "Base length of z-axis"
msgstr "BasislÀnge der Z-Achse"
-#: ../src/display/canvas-axonomgrid.cpp:364
+#: ../src/display/canvas-axonomgrid.cpp:372
#: ../src/ui/dialog/inkscape-preferences.cpp:778
#: ../src/widgets/box3d-toolbar.cpp:302
msgid "Angle X:"
msgstr "Winkel X:"
-#: ../src/display/canvas-axonomgrid.cpp:364
+#: ../src/display/canvas-axonomgrid.cpp:372
#: ../src/ui/dialog/inkscape-preferences.cpp:778
msgid "Angle of x-axis"
msgstr "Winkel der X-Achse"
-#: ../src/display/canvas-axonomgrid.cpp:366
+#: ../src/display/canvas-axonomgrid.cpp:374
#: ../src/ui/dialog/inkscape-preferences.cpp:779
#: ../src/widgets/box3d-toolbar.cpp:381
msgid "Angle Z:"
msgstr "Winkel Z:"
-#: ../src/display/canvas-axonomgrid.cpp:366
+#: ../src/display/canvas-axonomgrid.cpp:374
#: ../src/ui/dialog/inkscape-preferences.cpp:779
msgid "Angle of z-axis"
msgstr "Winkel der Z-Achse"
-#: ../src/display/canvas-axonomgrid.cpp:370 ../src/display/canvas-grid.cpp:709
+#: ../src/display/canvas-axonomgrid.cpp:378 ../src/display/canvas-grid.cpp:717
msgid "Minor grid line _color:"
msgstr "Nebengitter-Linienfarbe:"
-#: ../src/display/canvas-axonomgrid.cpp:370 ../src/display/canvas-grid.cpp:709
+#: ../src/display/canvas-axonomgrid.cpp:378 ../src/display/canvas-grid.cpp:717
#: ../src/ui/dialog/inkscape-preferences.cpp:730
msgid "Minor grid line color"
msgstr "Nebengitter-Linienfarbe:"
-#: ../src/display/canvas-axonomgrid.cpp:370 ../src/display/canvas-grid.cpp:709
+#: ../src/display/canvas-axonomgrid.cpp:378 ../src/display/canvas-grid.cpp:717
msgid "Color of the minor grid lines"
msgstr "Farbe der Nebengitterlinien"
-#: ../src/display/canvas-axonomgrid.cpp:375 ../src/display/canvas-grid.cpp:714
+#: ../src/display/canvas-axonomgrid.cpp:383 ../src/display/canvas-grid.cpp:722
msgid "Ma_jor grid line color:"
msgstr "Farbe der _dicken Gitterlinien:"
-#: ../src/display/canvas-axonomgrid.cpp:375 ../src/display/canvas-grid.cpp:714
+#: ../src/display/canvas-axonomgrid.cpp:383 ../src/display/canvas-grid.cpp:722
#: ../src/ui/dialog/inkscape-preferences.cpp:732
msgid "Major grid line color"
msgstr "Farbe der dicken Gitterlinien"
-#: ../src/display/canvas-axonomgrid.cpp:376 ../src/display/canvas-grid.cpp:715
+#: ../src/display/canvas-axonomgrid.cpp:384 ../src/display/canvas-grid.cpp:723
msgid "Color of the major (highlighted) grid lines"
msgstr "Farbe der dicken (hervorgehobenen) Gitterlinien"
-#: ../src/display/canvas-axonomgrid.cpp:380 ../src/display/canvas-grid.cpp:719
+#: ../src/display/canvas-axonomgrid.cpp:388 ../src/display/canvas-grid.cpp:727
msgid "_Major grid line every:"
msgstr "D_icke Gitterlinien alle:"
-#: ../src/display/canvas-axonomgrid.cpp:380 ../src/display/canvas-grid.cpp:719
+#: ../src/display/canvas-axonomgrid.cpp:388 ../src/display/canvas-grid.cpp:727
msgid "lines"
msgstr "Linien"
@@ -4634,25 +4630,25 @@ msgstr ""
"Legt fest, ob das Raster angezeigt werden soll. Objekte rasten auch an "
"unsichtbaren Gittern ein."
-#: ../src/display/canvas-grid.cpp:701
+#: ../src/display/canvas-grid.cpp:709
msgid "Spacing _X:"
msgstr "Abstand _X:"
-#: ../src/display/canvas-grid.cpp:701
+#: ../src/display/canvas-grid.cpp:709
#: ../src/ui/dialog/inkscape-preferences.cpp:752
msgid "Distance between vertical grid lines"
msgstr "Abstand der vertikalen Gitterlinien"
-#: ../src/display/canvas-grid.cpp:704
+#: ../src/display/canvas-grid.cpp:712
#: ../src/ui/dialog/inkscape-preferences.cpp:753
msgid "Distance between horizontal grid lines"
msgstr "Abstand der horizontalen Gitterlinien"
-#: ../src/display/canvas-grid.cpp:736
+#: ../src/display/canvas-grid.cpp:744
msgid "_Show dots instead of lines"
msgstr "Zeige Punkte anstatt Linien"
-#: ../src/display/canvas-grid.cpp:737
+#: ../src/display/canvas-grid.cpp:745
msgid "If set, displays dots at gridpoints instead of gridlines"
msgstr "Wenn gesetzt, Punkte an Gitterpunkten anstelle Gitterlinien verwenden"
@@ -4676,7 +4672,7 @@ msgstr "Gitterlinie (Senkrechte)"
#: ../src/display/snap-indicator.cpp:88
msgid "guide"
-msgstr "FĂŒhrungslinie"
+msgstr "Hilfslinie"
#: ../src/display/snap-indicator.cpp:91
msgid "guide intersection"
@@ -4684,15 +4680,15 @@ msgstr "Gitter-Überschneidung"
#: ../src/display/snap-indicator.cpp:94
msgid "guide origin"
-msgstr "FĂŒhrungslinienursprung"
+msgstr "Hilfslinienursprung"
#: ../src/display/snap-indicator.cpp:97
msgid "guide (perpendicular)"
-msgstr "FĂŒhrungslinie (Senkrechte)"
+msgstr "Hilfslinie (Senkrechte)"
#: ../src/display/snap-indicator.cpp:100
msgid "grid-guide intersection"
-msgstr "Gitter-FĂŒhrungslinien-Überschneidung"
+msgstr "Gitter-Hilfslinien-Überschneidung"
#: ../src/display/snap-indicator.cpp:103
msgid "cusp node"
@@ -4720,7 +4716,7 @@ msgstr "PfadĂŒberschneidung"
#: ../src/display/snap-indicator.cpp:121
msgid "guide-path intersection"
-msgstr "FĂŒhrungslinie-Pfad-Überschneidung"
+msgstr "Hilfslinie-Pfad-Überschneidung"
#: ../src/display/snap-indicator.cpp:124
msgid "clip-path"
@@ -4832,11 +4828,11 @@ msgstr "PfadĂŒberschneidung"
#: ../src/display/snap-indicator.cpp:218
msgid "Guide"
-msgstr "FĂŒhrungslinien"
+msgstr "Hilfslinien"
#: ../src/display/snap-indicator.cpp:221
msgid "Guide origin"
-msgstr "FĂŒhrungslinienursprung"
+msgstr "Hilfslinienursprung"
#: ../src/display/snap-indicator.cpp:224
msgid "Convex hull corner"
@@ -4876,7 +4872,7 @@ msgstr "Dokument im Speicher %d"
msgid "Memory document %1"
msgstr "Dokument im Speicher %1"
-#: ../src/document.cpp:839
+#: ../src/document.cpp:855
#, c-format
msgid "Unnamed document %d"
msgstr "Unbenanntes Dokument %d"
@@ -4947,7 +4943,7 @@ msgstr "Dialog beim Starten des Programmes anzeigen"
#: ../src/extension/execution-env.cpp:144
#, c-format
msgid "'%s' working, please wait..."
-msgstr "»%s« arbeitet, bitte warten..."
+msgstr "„%s“ arbeitet, bitte warten..."
#. static int i = 0;
#. std::cout << "Checking module[" << i++ << "]: " << name << std::endl;
@@ -4987,16 +4983,16 @@ msgstr "eine AbhÀngigkeit nicht aufgelöst werden konnte."
#: ../src/extension/extension.cpp:325
msgid "Extension \""
-msgstr "Erweiterung »"
+msgstr "Erweiterung „"
#: ../src/extension/extension.cpp:325
msgid "\" failed to load because "
-msgstr "«: Laden fehlgeschlagen, da "
+msgstr "“: Laden fehlgeschlagen, da "
#: ../src/extension/extension.cpp:674
#, c-format
msgid "Could not create extension error log file '%s'"
-msgstr "Fehlerprotokolldatei »%s« konnte nicht erweitert oder erzeugt werden."
+msgstr "Fehlerprotokolldatei „%s“ konnte nicht erweitert oder erzeugt werden."
#: ../src/extension/extension.cpp:782
#: ../share/extensions/webslicer_create_rect.inx.h:2
@@ -5138,9 +5134,9 @@ msgstr "Rauschen hinzufĂŒgen"
#. _settings->add_checkbutton(false, SP_ATTR_STITCHTILES, _("Stitch Tiles"), "stitch", "noStitch");
#: ../src/extension/internal/bitmap/addNoise.cpp:47
-#: ../src/extension/internal/filter/color.h:426
-#: ../src/extension/internal/filter/color.h:1497
-#: ../src/extension/internal/filter/color.h:1585
+#: ../src/extension/internal/filter/color.h:501
+#: ../src/extension/internal/filter/color.h:1572
+#: ../src/extension/internal/filter/color.h:1660
#: ../src/extension/internal/filter/distort.h:69
#: ../src/extension/internal/filter/morphology.h:60 ../src/rdf.cpp:244
#: ../src/ui/dialog/filter-effects-dialog.cpp:2842
@@ -5279,7 +5275,7 @@ msgid "Apply charcoal stylization to selected bitmap(s)"
msgstr "Kohlezeichnungseffekt auf Bitmap(s) anwenden"
#: ../src/extension/internal/bitmap/colorize.cpp:50
-#: ../src/extension/internal/filter/color.h:317
+#: ../src/extension/internal/filter/color.h:392
msgid "Colorize"
msgstr "EinfÀrben"
@@ -5288,7 +5284,7 @@ msgid "Colorize selected bitmap(s) with specified color, using given opacity"
msgstr "FÀrbt ausgewÀhlte Bitmap(s) mit gegebener Farbe und Deckkraft ein."
#: ../src/extension/internal/bitmap/contrast.cpp:40
-#: ../src/extension/internal/filter/color.h:1114
+#: ../src/extension/internal/filter/color.h:1189
msgid "Contrast"
msgstr "Kontrast"
@@ -5323,9 +5319,8 @@ msgid "Right (px):"
msgstr "Rechts (px):"
#: ../src/extension/internal/bitmap/crop.cpp:77
-#, fuzzy
msgid "Crop selected bitmap(s)"
-msgstr "GewÀhlte Bitmaps schneiden"
+msgstr "GewÀhlte(s) Rastergrafik(en) beschneiden"
#: ../src/extension/internal/bitmap/cycleColormap.cpp:37
msgid "Cycle Colormap"
@@ -5408,7 +5403,7 @@ msgid "Implode selected bitmap(s)"
msgstr "Implodiert ausgewÀhlte Bitmaps."
#: ../src/extension/internal/bitmap/level.cpp:41
-#: ../src/extension/internal/filter/color.h:742
+#: ../src/extension/internal/filter/color.h:817
#: ../src/extension/internal/filter/image.h:56
#: ../src/extension/internal/filter/morphology.h:66
#: ../src/extension/internal/filter/paint.h:345
@@ -5418,12 +5413,12 @@ msgstr "Ebene"
#: ../src/extension/internal/bitmap/level.cpp:43
#: ../src/extension/internal/bitmap/levelChannel.cpp:65
msgid "Black Point:"
-msgstr "Schwarzer Punkt"
+msgstr "Schwarzpunkt"
#: ../src/extension/internal/bitmap/level.cpp:44
#: ../src/extension/internal/bitmap/levelChannel.cpp:66
msgid "White Point:"
-msgstr "Weißer Punkt"
+msgstr "Weißpunkt"
#: ../src/extension/internal/bitmap/level.cpp:45
#: ../src/extension/internal/bitmap/levelChannel.cpp:67
@@ -5443,7 +5438,7 @@ msgid "Level (with Channel)"
msgstr "Ebene (mit Kanal)"
#: ../src/extension/internal/bitmap/levelChannel.cpp:54
-#: ../src/extension/internal/filter/color.h:636
+#: ../src/extension/internal/filter/color.h:711
msgid "Channel:"
msgstr "Kanal:"
@@ -5527,7 +5522,7 @@ msgstr "Deckkraft"
#: ../src/extension/internal/bitmap/opacity.cpp:40
#: ../src/ui/dialog/filter-effects-dialog.cpp:2884
-#: ../src/ui/dialog/objects.cpp:1621 ../src/widgets/dropper-toolbar.cpp:83
+#: ../src/ui/dialog/objects.cpp:1619 ../src/widgets/dropper-toolbar.cpp:83
msgid "Opacity:"
msgstr "Deckkraft:"
@@ -5602,8 +5597,8 @@ msgid "Sharpen selected bitmap(s)"
msgstr "SchÀrft ausgewÀhlte Bitmap(s)."
#: ../src/extension/internal/bitmap/solarize.cpp:39
-#: ../src/extension/internal/filter/color.h:1494
-#: ../src/extension/internal/filter/color.h:1498
+#: ../src/extension/internal/filter/color.h:1569
+#: ../src/extension/internal/filter/color.h:1573
msgid "Solarize"
msgstr "Solarisieren"
@@ -5702,106 +5697,118 @@ msgid "PostScript"
msgstr "Postscript"
#: ../src/extension/internal/cairo-ps-out.cpp:329
-#: ../src/extension/internal/cairo-ps-out.cpp:368
+#: ../src/extension/internal/cairo-ps-out.cpp:371
msgid "Restrict to PS level:"
-msgstr "Auf PostScript Level einschrÀnken"
+msgstr "PostScript Level einschrÀnken"
#: ../src/extension/internal/cairo-ps-out.cpp:330
-#: ../src/extension/internal/cairo-ps-out.cpp:369
+#: ../src/extension/internal/cairo-ps-out.cpp:372
msgid "PostScript level 3"
msgstr "PostScript Level 3"
#: ../src/extension/internal/cairo-ps-out.cpp:331
-#: ../src/extension/internal/cairo-ps-out.cpp:370
+#: ../src/extension/internal/cairo-ps-out.cpp:373
msgid "PostScript level 2"
-msgstr "Postscript Level 2"
+msgstr "PostScript Level 2"
#: ../src/extension/internal/cairo-ps-out.cpp:333
-#: ../src/extension/internal/cairo-ps-out.cpp:372
+#: ../src/extension/internal/cairo-ps-out.cpp:375
#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:250
-#: ../src/extension/internal/emf-inout.cpp:3569
-#: ../src/extension/internal/wmf-inout.cpp:3144
-msgid "Convert texts to paths"
-msgstr "Texte in Pfade umwandeln"
+#, fuzzy
+msgid "Text output options:"
+msgstr "Textausrichtung"
#: ../src/extension/internal/cairo-ps-out.cpp:334
-msgid "PS+LaTeX: Omit text in PS, and create LaTeX file"
-msgstr "PS+LaTeX: Text in PS weglassen und LaTeX Datei erstellen"
+#: ../src/extension/internal/cairo-ps-out.cpp:376
+#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:251
+#, fuzzy
+msgid "Embed fonts"
+msgstr "Alle Raster einbetten"
#: ../src/extension/internal/cairo-ps-out.cpp:335
-#: ../src/extension/internal/cairo-ps-out.cpp:374
+#: ../src/extension/internal/cairo-ps-out.cpp:377
#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:252
-msgid "Rasterize filter effects"
-msgstr "Filtereffekte in Raster umwandeln"
+#, fuzzy
+msgid "Convert text to paths"
+msgstr "Texte in Pfade umwandeln"
#: ../src/extension/internal/cairo-ps-out.cpp:336
-#: ../src/extension/internal/cairo-ps-out.cpp:375
+#: ../src/extension/internal/cairo-ps-out.cpp:378
#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:253
+#, fuzzy
+msgid "Omit text in PDF and create LaTeX file"
+msgstr "PDF+LaTeX: Text in PDF weglassen und LaTeX Datei erstellen"
+
+#: ../src/extension/internal/cairo-ps-out.cpp:338
+#: ../src/extension/internal/cairo-ps-out.cpp:380
+#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:255
+msgid "Rasterize filter effects"
+msgstr "Filtereffekte in Raster umwandeln"
+
+#: ../src/extension/internal/cairo-ps-out.cpp:339
+#: ../src/extension/internal/cairo-ps-out.cpp:381
+#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:256
msgid "Resolution for rasterization (dpi):"
msgstr "Auflösung des Rasters (dpi)"
-#: ../src/extension/internal/cairo-ps-out.cpp:337
-#: ../src/extension/internal/cairo-ps-out.cpp:376
+#: ../src/extension/internal/cairo-ps-out.cpp:340
+#: ../src/extension/internal/cairo-ps-out.cpp:382
msgid "Output page size"
msgstr "SeitengrĂ¶ĂŸe der Ausgabe"
-#: ../src/extension/internal/cairo-ps-out.cpp:338
-#: ../src/extension/internal/cairo-ps-out.cpp:377
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:255
+#: ../src/extension/internal/cairo-ps-out.cpp:341
+#: ../src/extension/internal/cairo-ps-out.cpp:383
+#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:258
msgid "Use document's page size"
msgstr "SeitengrĂ¶ĂŸe vom Dokument nutzen"
-#: ../src/extension/internal/cairo-ps-out.cpp:339
-#: ../src/extension/internal/cairo-ps-out.cpp:378
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:256
+#: ../src/extension/internal/cairo-ps-out.cpp:342
+#: ../src/extension/internal/cairo-ps-out.cpp:384
+#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:259
msgid "Use exported object's size"
msgstr "Nutze exportierte ObjektgrĂ¶ĂŸe"
-#: ../src/extension/internal/cairo-ps-out.cpp:341
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:258
+#: ../src/extension/internal/cairo-ps-out.cpp:344
+#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:261
msgid "Bleed/margin (mm):"
msgstr "Beschnitt/Umrandung (mm):"
-#: ../src/extension/internal/cairo-ps-out.cpp:342
-#: ../src/extension/internal/cairo-ps-out.cpp:381
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:259
+#: ../src/extension/internal/cairo-ps-out.cpp:345
+#: ../src/extension/internal/cairo-ps-out.cpp:387
+#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:262
msgid "Limit export to the object with ID:"
msgstr "Export einschrÀnken auf das Objekt mit ID"
-#: ../src/extension/internal/cairo-ps-out.cpp:346
+#: ../src/extension/internal/cairo-ps-out.cpp:349
#: ../share/extensions/ps_input.inx.h:2
msgid "PostScript (*.ps)"
msgstr "PostScript (*.ps)"
-#: ../src/extension/internal/cairo-ps-out.cpp:347
+#: ../src/extension/internal/cairo-ps-out.cpp:350
msgid "PostScript File"
msgstr "Postscript-Datei"
-#: ../src/extension/internal/cairo-ps-out.cpp:366
+#: ../src/extension/internal/cairo-ps-out.cpp:369
#: ../share/extensions/eps_input.inx.h:3
msgid "Encapsulated PostScript"
msgstr "Encapsulated Postscript"
-#: ../src/extension/internal/cairo-ps-out.cpp:373
-msgid "EPS+LaTeX: Omit text in EPS, and create LaTeX file"
-msgstr "EPS+LaTeX: Text in EPS weglassen und LaTeX Datei erstellen"
-
-#: ../src/extension/internal/cairo-ps-out.cpp:380
+#: ../src/extension/internal/cairo-ps-out.cpp:386
msgid "Bleed/margin (mm)"
msgstr "Beschnitt/Umrandung (mm)"
-#: ../src/extension/internal/cairo-ps-out.cpp:385
+#: ../src/extension/internal/cairo-ps-out.cpp:391
#: ../share/extensions/eps_input.inx.h:2
msgid "Encapsulated PostScript (*.eps)"
msgstr "Encapsulated Postscript (*.eps)"
-#: ../src/extension/internal/cairo-ps-out.cpp:386
+#: ../src/extension/internal/cairo-ps-out.cpp:392
msgid "Encapsulated PostScript File"
msgstr "Encapsulated-Postscript-Datei"
#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:244
msgid "Restrict to PDF version:"
-msgstr "EinschrÀnken auf PDF-Version:"
+msgstr "PDF-Version einschrÀnken:"
#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:246
msgid "PDF 1.5"
@@ -5811,11 +5818,7 @@ msgstr "PDF 1.5"
msgid "PDF 1.4"
msgstr "PDF 1.4"
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:251
-msgid "PDF+LaTeX: Omit text in PDF, and create LaTeX file"
-msgstr "PDF+LaTeX: Text in PDF weglassen und LaTeX Datei erstellen"
-
-#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:254
+#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:257
msgid "Output page size:"
msgstr "SeitengrĂ¶ĂŸe der Ausgabe:"
@@ -5889,75 +5892,80 @@ msgid "Open presentation exchange files saved in Corel DRAW"
msgstr ""
"Öffnen einer Presentation Exchange Datei, die in Corel DRAW gespeichert wurde"
-#: ../src/extension/internal/emf-inout.cpp:3553
+#: ../src/extension/internal/emf-inout.cpp:3562
msgid "EMF Input"
msgstr "EMF einlesen"
-#: ../src/extension/internal/emf-inout.cpp:3558
+#: ../src/extension/internal/emf-inout.cpp:3567
msgid "Enhanced Metafiles (*.emf)"
msgstr "Erweiterte Metadateien (*.emf)"
# !!!
-#: ../src/extension/internal/emf-inout.cpp:3559
+#: ../src/extension/internal/emf-inout.cpp:3568
msgid "Enhanced Metafiles"
msgstr "Erweiterte Metadateien"
-#: ../src/extension/internal/emf-inout.cpp:3567
+#: ../src/extension/internal/emf-inout.cpp:3576
msgid "EMF Output"
msgstr "EMF-Ausgabe"
-#: ../src/extension/internal/emf-inout.cpp:3570
-#: ../src/extension/internal/wmf-inout.cpp:3145
+#: ../src/extension/internal/emf-inout.cpp:3578
+#: ../src/extension/internal/wmf-inout.cpp:3152
+msgid "Convert texts to paths"
+msgstr "Texte in Pfade umwandeln"
+
+#: ../src/extension/internal/emf-inout.cpp:3579
+#: ../src/extension/internal/wmf-inout.cpp:3153
msgid "Map Unicode to Symbol font"
msgstr "Unicode mit Symbol Font verbinden"
-#: ../src/extension/internal/emf-inout.cpp:3571
-#: ../src/extension/internal/wmf-inout.cpp:3146
+#: ../src/extension/internal/emf-inout.cpp:3580
+#: ../src/extension/internal/wmf-inout.cpp:3154
msgid "Map Unicode to Wingdings"
msgstr "Unicode mit Wingdings Font verbinden"
-#: ../src/extension/internal/emf-inout.cpp:3572
-#: ../src/extension/internal/wmf-inout.cpp:3147
+#: ../src/extension/internal/emf-inout.cpp:3581
+#: ../src/extension/internal/wmf-inout.cpp:3155
msgid "Map Unicode to Zapf Dingbats"
msgstr "Unicode mit Zapf Dingbats Font verbinden"
-#: ../src/extension/internal/emf-inout.cpp:3573
-#: ../src/extension/internal/wmf-inout.cpp:3148
+#: ../src/extension/internal/emf-inout.cpp:3582
+#: ../src/extension/internal/wmf-inout.cpp:3156
msgid "Use MS Unicode PUA (0xF020-0xF0FF) for converted characters"
msgstr "MS Unicode PUA (0xF020-0xF0FF) fĂŒr umgewandelte Zeichen verwenden"
-#: ../src/extension/internal/emf-inout.cpp:3574
-#: ../src/extension/internal/wmf-inout.cpp:3149
+#: ../src/extension/internal/emf-inout.cpp:3583
+#: ../src/extension/internal/wmf-inout.cpp:3157
msgid "Compensate for PPT font bug"
msgstr "PPT font bug kompensieren"
-#: ../src/extension/internal/emf-inout.cpp:3575
-#: ../src/extension/internal/wmf-inout.cpp:3150
+#: ../src/extension/internal/emf-inout.cpp:3584
+#: ../src/extension/internal/wmf-inout.cpp:3158
msgid "Convert dashed/dotted lines to single lines"
msgstr "Gestrichelte/gepunktete Linien in zusammenhÀngende Linien umwandeln"
-#: ../src/extension/internal/emf-inout.cpp:3576
-#: ../src/extension/internal/wmf-inout.cpp:3151
+#: ../src/extension/internal/emf-inout.cpp:3585
+#: ../src/extension/internal/wmf-inout.cpp:3159
msgid "Convert gradients to colored polygon series"
msgstr "Farbverlauf in lineare farbige Rechtecke umwandeln"
-#: ../src/extension/internal/emf-inout.cpp:3577
+#: ../src/extension/internal/emf-inout.cpp:3586
msgid "Use native rectangular linear gradients"
msgstr "Native rechteckige lineare VerlÀufe verwenden"
-#: ../src/extension/internal/emf-inout.cpp:3578
+#: ../src/extension/internal/emf-inout.cpp:3587
msgid "Map all fill patterns to standard EMF hatches"
msgstr "Alle FĂŒllmuster als Standard EMF Muster setzen"
-#: ../src/extension/internal/emf-inout.cpp:3579
+#: ../src/extension/internal/emf-inout.cpp:3588
msgid "Ignore image rotations"
msgstr "Bilddrehung ignorieren"
-#: ../src/extension/internal/emf-inout.cpp:3583
+#: ../src/extension/internal/emf-inout.cpp:3592
msgid "Enhanced Metafile (*.emf)"
msgstr "Erweiterte Metadatei (*.emf)"
-#: ../src/extension/internal/emf-inout.cpp:3584
+#: ../src/extension/internal/emf-inout.cpp:3593
msgid "Enhanced Metafile"
msgstr "Erweiterte Metadatei"
@@ -6001,23 +6009,24 @@ msgstr "Hervorhebungsfarbe"
#: ../src/extension/internal/filter/blurs.h:350
#: ../src/extension/internal/filter/bumps.h:141
#: ../src/extension/internal/filter/bumps.h:361
-#: ../src/extension/internal/filter/color.h:81
-#: ../src/extension/internal/filter/color.h:170
-#: ../src/extension/internal/filter/color.h:261
-#: ../src/extension/internal/filter/color.h:346
-#: ../src/extension/internal/filter/color.h:436
-#: ../src/extension/internal/filter/color.h:531
-#: ../src/extension/internal/filter/color.h:653
-#: ../src/extension/internal/filter/color.h:750
-#: ../src/extension/internal/filter/color.h:829
-#: ../src/extension/internal/filter/color.h:920
-#: ../src/extension/internal/filter/color.h:1048
-#: ../src/extension/internal/filter/color.h:1118
-#: ../src/extension/internal/filter/color.h:1211
-#: ../src/extension/internal/filter/color.h:1323
-#: ../src/extension/internal/filter/color.h:1428
-#: ../src/extension/internal/filter/color.h:1504
-#: ../src/extension/internal/filter/color.h:1615
+#: ../src/extension/internal/filter/color.h:82
+#: ../src/extension/internal/filter/color.h:171
+#: ../src/extension/internal/filter/color.h:282
+#: ../src/extension/internal/filter/color.h:336
+#: ../src/extension/internal/filter/color.h:421
+#: ../src/extension/internal/filter/color.h:511
+#: ../src/extension/internal/filter/color.h:606
+#: ../src/extension/internal/filter/color.h:728
+#: ../src/extension/internal/filter/color.h:825
+#: ../src/extension/internal/filter/color.h:904
+#: ../src/extension/internal/filter/color.h:995
+#: ../src/extension/internal/filter/color.h:1123
+#: ../src/extension/internal/filter/color.h:1193
+#: ../src/extension/internal/filter/color.h:1286
+#: ../src/extension/internal/filter/color.h:1398
+#: ../src/extension/internal/filter/color.h:1503
+#: ../src/extension/internal/filter/color.h:1579
+#: ../src/extension/internal/filter/color.h:1690
#: ../src/extension/internal/filter/distort.h:95
#: ../src/extension/internal/filter/distort.h:204
#: ../src/extension/internal/filter/filter-file.cpp:151
@@ -6057,7 +6066,7 @@ msgstr "Mattes Gelee"
#: ../src/extension/internal/filter/bevels.h:136
#: ../src/extension/internal/filter/bevels.h:220
#: ../src/extension/internal/filter/blurs.h:187
-#: ../src/extension/internal/filter/color.h:74
+#: ../src/extension/internal/filter/color.h:75
msgid "Brightness"
msgstr "Glanz"
@@ -6127,11 +6136,11 @@ msgstr "Mischen:"
#: ../src/extension/internal/filter/bumps.h:131
#: ../src/extension/internal/filter/bumps.h:337
#: ../src/extension/internal/filter/bumps.h:344
-#: ../src/extension/internal/filter/color.h:329
-#: ../src/extension/internal/filter/color.h:336
-#: ../src/extension/internal/filter/color.h:1423
-#: ../src/extension/internal/filter/color.h:1596
-#: ../src/extension/internal/filter/color.h:1602
+#: ../src/extension/internal/filter/color.h:404
+#: ../src/extension/internal/filter/color.h:411
+#: ../src/extension/internal/filter/color.h:1498
+#: ../src/extension/internal/filter/color.h:1671
+#: ../src/extension/internal/filter/color.h:1677
#: ../src/extension/internal/filter/paint.h:705
#: ../src/extension/internal/filter/transparency.h:63
#: ../src/filter-enums.cpp:55
@@ -6143,12 +6152,12 @@ msgstr "Verdunkeln"
#: ../src/extension/internal/filter/bumps.h:132
#: ../src/extension/internal/filter/bumps.h:335
#: ../src/extension/internal/filter/bumps.h:342
-#: ../src/extension/internal/filter/color.h:327
-#: ../src/extension/internal/filter/color.h:332
-#: ../src/extension/internal/filter/color.h:647
-#: ../src/extension/internal/filter/color.h:1415
-#: ../src/extension/internal/filter/color.h:1420
-#: ../src/extension/internal/filter/color.h:1594
+#: ../src/extension/internal/filter/color.h:402
+#: ../src/extension/internal/filter/color.h:407
+#: ../src/extension/internal/filter/color.h:722
+#: ../src/extension/internal/filter/color.h:1490
+#: ../src/extension/internal/filter/color.h:1495
+#: ../src/extension/internal/filter/color.h:1669
#: ../src/extension/internal/filter/paint.h:703
#: ../src/extension/internal/filter/transparency.h:62
#: ../src/filter-enums.cpp:54 ../src/ui/dialog/input.cpp:382
@@ -6160,13 +6169,13 @@ msgstr "Screen"
#: ../src/extension/internal/filter/bumps.h:133
#: ../src/extension/internal/filter/bumps.h:338
#: ../src/extension/internal/filter/bumps.h:345
-#: ../src/extension/internal/filter/color.h:325
-#: ../src/extension/internal/filter/color.h:333
-#: ../src/extension/internal/filter/color.h:645
-#: ../src/extension/internal/filter/color.h:1414
-#: ../src/extension/internal/filter/color.h:1421
-#: ../src/extension/internal/filter/color.h:1595
-#: ../src/extension/internal/filter/color.h:1601
+#: ../src/extension/internal/filter/color.h:400
+#: ../src/extension/internal/filter/color.h:408
+#: ../src/extension/internal/filter/color.h:720
+#: ../src/extension/internal/filter/color.h:1489
+#: ../src/extension/internal/filter/color.h:1496
+#: ../src/extension/internal/filter/color.h:1670
+#: ../src/extension/internal/filter/color.h:1676
#: ../src/extension/internal/filter/paint.h:701
#: ../src/extension/internal/filter/transparency.h:60
#: ../src/filter-enums.cpp:53
@@ -6178,10 +6187,10 @@ msgstr "Multiplizieren"
#: ../src/extension/internal/filter/bumps.h:134
#: ../src/extension/internal/filter/bumps.h:339
#: ../src/extension/internal/filter/bumps.h:346
-#: ../src/extension/internal/filter/color.h:328
-#: ../src/extension/internal/filter/color.h:335
-#: ../src/extension/internal/filter/color.h:1422
-#: ../src/extension/internal/filter/color.h:1593
+#: ../src/extension/internal/filter/color.h:403
+#: ../src/extension/internal/filter/color.h:410
+#: ../src/extension/internal/filter/color.h:1497
+#: ../src/extension/internal/filter/color.h:1668
#: ../src/extension/internal/filter/paint.h:704
#: ../src/extension/internal/filter/transparency.h:64
#: ../src/filter-enums.cpp:56
@@ -6226,9 +6235,9 @@ msgid "Erosion"
msgstr "Erosion"
#: ../src/extension/internal/filter/blurs.h:336
-#: ../src/extension/internal/filter/color.h:1205
-#: ../src/extension/internal/filter/color.h:1317
-#: ../src/ui/dialog/document-properties.cpp:115
+#: ../src/extension/internal/filter/color.h:1280
+#: ../src/extension/internal/filter/color.h:1392
+#: ../src/ui/dialog/document-properties.cpp:122
msgid "Background color"
msgstr "Hintergrundfarbe"
@@ -6241,13 +6250,13 @@ msgstr "Misch-Typ:"
#: ../src/extension/internal/filter/bumps.h:130
#: ../src/extension/internal/filter/bumps.h:336
#: ../src/extension/internal/filter/bumps.h:343
-#: ../src/extension/internal/filter/color.h:326
-#: ../src/extension/internal/filter/color.h:334
-#: ../src/extension/internal/filter/color.h:646
-#: ../src/extension/internal/filter/color.h:1413
-#: ../src/extension/internal/filter/color.h:1419
-#: ../src/extension/internal/filter/color.h:1586
-#: ../src/extension/internal/filter/color.h:1600
+#: ../src/extension/internal/filter/color.h:401
+#: ../src/extension/internal/filter/color.h:409
+#: ../src/extension/internal/filter/color.h:721
+#: ../src/extension/internal/filter/color.h:1488
+#: ../src/extension/internal/filter/color.h:1494
+#: ../src/extension/internal/filter/color.h:1661
+#: ../src/extension/internal/filter/color.h:1675
#: ../src/extension/internal/filter/distort.h:78
#: ../src/extension/internal/filter/paint.h:702
#: ../src/extension/internal/filter/textures.h:77
@@ -6285,11 +6294,11 @@ msgstr "Stoß-Quelle"
#: ../src/extension/internal/filter/bumps.h:88
#: ../src/extension/internal/filter/bumps.h:317
-#: ../src/extension/internal/filter/color.h:157
-#: ../src/extension/internal/filter/color.h:637
-#: ../src/extension/internal/filter/color.h:821
+#: ../src/extension/internal/filter/color.h:158
+#: ../src/extension/internal/filter/color.h:712
+#: ../src/extension/internal/filter/color.h:896
#: ../src/extension/internal/filter/transparency.h:132
-#: ../src/filter-enums.cpp:128 ../src/ui/tools/flood-tool.cpp:193
+#: ../src/filter-enums.cpp:128 ../src/ui/tools/flood-tool.cpp:183
#: ../src/widgets/sp-color-icc-selector.cpp:330
#: ../src/widgets/sp-color-scales.cpp:415
#: ../src/widgets/sp-color-scales.cpp:416
@@ -6298,11 +6307,11 @@ msgstr "Rot"
#: ../src/extension/internal/filter/bumps.h:89
#: ../src/extension/internal/filter/bumps.h:318
-#: ../src/extension/internal/filter/color.h:158
-#: ../src/extension/internal/filter/color.h:638
-#: ../src/extension/internal/filter/color.h:822
+#: ../src/extension/internal/filter/color.h:159
+#: ../src/extension/internal/filter/color.h:713
+#: ../src/extension/internal/filter/color.h:897
#: ../src/extension/internal/filter/transparency.h:133
-#: ../src/filter-enums.cpp:129 ../src/ui/tools/flood-tool.cpp:194
+#: ../src/filter-enums.cpp:129 ../src/ui/tools/flood-tool.cpp:184
#: ../src/widgets/sp-color-icc-selector.cpp:331
#: ../src/widgets/sp-color-scales.cpp:418
#: ../src/widgets/sp-color-scales.cpp:419
@@ -6311,11 +6320,11 @@ msgstr "GrĂŒn"
#: ../src/extension/internal/filter/bumps.h:90
#: ../src/extension/internal/filter/bumps.h:319
-#: ../src/extension/internal/filter/color.h:159
-#: ../src/extension/internal/filter/color.h:639
-#: ../src/extension/internal/filter/color.h:823
+#: ../src/extension/internal/filter/color.h:160
+#: ../src/extension/internal/filter/color.h:714
+#: ../src/extension/internal/filter/color.h:898
#: ../src/extension/internal/filter/transparency.h:134
-#: ../src/filter-enums.cpp:130 ../src/ui/tools/flood-tool.cpp:195
+#: ../src/filter-enums.cpp:130 ../src/ui/tools/flood-tool.cpp:185
#: ../src/widgets/sp-color-icc-selector.cpp:332
#: ../src/widgets/sp-color-scales.cpp:421
#: ../src/widgets/sp-color-scales.cpp:422
@@ -6341,20 +6350,20 @@ msgstr "Diffuses Licht"
#: ../src/extension/internal/filter/bumps.h:98
#: ../src/extension/internal/filter/bumps.h:329
#: ../src/libgdl/gdl-dock-placeholder.c:175 ../src/libgdl/gdl-dock.c:199
-#: ../src/widgets/rect-toolbar.cpp:335
+#: ../src/widgets/rect-toolbar.cpp:334
#: ../share/extensions/interp_att_g.inx.h:11
msgid "Height"
msgstr "Höhe"
#: ../src/extension/internal/filter/bumps.h:99
#: ../src/extension/internal/filter/bumps.h:330
-#: ../src/extension/internal/filter/color.h:76
-#: ../src/extension/internal/filter/color.h:824
-#: ../src/extension/internal/filter/color.h:1113
+#: ../src/extension/internal/filter/color.h:77
+#: ../src/extension/internal/filter/color.h:899
+#: ../src/extension/internal/filter/color.h:1188
#: ../src/extension/internal/filter/paint.h:86
#: ../src/extension/internal/filter/paint.h:592
#: ../src/extension/internal/filter/paint.h:707
-#: ../src/ui/tools/flood-tool.cpp:198
+#: ../src/ui/tools/flood-tool.cpp:188
#: ../src/widgets/sp-color-icc-selector.cpp:341
#: ../src/widgets/sp-color-scales.cpp:447
#: ../src/widgets/sp-color-scales.cpp:448 ../src/widgets/tweak-toolbar.cpp:318
@@ -6469,7 +6478,7 @@ msgstr "Hintergrund:"
#: ../src/extension/internal/filter/bumps.h:322
#: ../src/extension/internal/filter/transparency.h:57
-#: ../src/filter-enums.cpp:30 ../src/sp-image.cpp:518
+#: ../src/filter-enums.cpp:30 ../src/sp-image.cpp:509
msgid "Image"
msgstr "Bild"
@@ -6482,7 +6491,7 @@ msgid "Background opacity"
msgstr "Hintergrund-Deckkraft"
#: ../src/extension/internal/filter/bumps.h:327
-#: ../src/extension/internal/filter/color.h:1040
+#: ../src/extension/internal/filter/color.h:1115
msgid "Lighting"
msgstr "Blitz"
@@ -6523,38 +6532,38 @@ msgstr "In"
msgid "Turns an image to jelly"
msgstr "VerÀndert ein Bild zu Gelee"
-#: ../src/extension/internal/filter/color.h:72
+#: ../src/extension/internal/filter/color.h:73
msgid "Brilliance"
msgstr "Brillianz"
-#: ../src/extension/internal/filter/color.h:75
-#: ../src/extension/internal/filter/color.h:1417
+#: ../src/extension/internal/filter/color.h:76
+#: ../src/extension/internal/filter/color.h:1492
msgid "Over-saturation"
msgstr "ÜbersĂ€ttigung"
-#: ../src/extension/internal/filter/color.h:77
-#: ../src/extension/internal/filter/color.h:161
+#: ../src/extension/internal/filter/color.h:78
+#: ../src/extension/internal/filter/color.h:162
#: ../src/extension/internal/filter/overlays.h:70
#: ../src/extension/internal/filter/paint.h:85
#: ../src/extension/internal/filter/paint.h:502
#: ../src/extension/internal/filter/transparency.h:136
#: ../src/extension/internal/filter/transparency.h:210
msgid "Inverted"
-msgstr "Invertiet"
+msgstr "Invertiert"
-#: ../src/extension/internal/filter/color.h:85
+#: ../src/extension/internal/filter/color.h:86
msgid "Brightness filter"
msgstr "Helligkeitsfilter"
-#: ../src/extension/internal/filter/color.h:152
+#: ../src/extension/internal/filter/color.h:153
msgid "Channel Painting"
msgstr "Kanalfarbe"
-#: ../src/extension/internal/filter/color.h:156
-#: ../src/extension/internal/filter/color.h:257
+#: ../src/extension/internal/filter/color.h:157
+#: ../src/extension/internal/filter/color.h:332
#: ../src/extension/internal/filter/paint.h:87 ../src/filter-enums.cpp:66
#: ../src/ui/dialog/inkscape-preferences.cpp:952
-#: ../src/ui/tools/flood-tool.cpp:197
+#: ../src/ui/tools/flood-tool.cpp:187
#: ../src/widgets/sp-color-icc-selector.cpp:337
#: ../src/widgets/sp-color-icc-selector.cpp:342
#: ../src/widgets/sp-color-scales.cpp:444
@@ -6563,133 +6572,180 @@ msgstr "Kanalfarbe"
msgid "Saturation"
msgstr "SĂ€ttigung"
-#: ../src/extension/internal/filter/color.h:160
+#: ../src/extension/internal/filter/color.h:161
#: ../src/extension/internal/filter/transparency.h:135
-#: ../src/filter-enums.cpp:131 ../src/ui/tools/flood-tool.cpp:199
+#: ../src/filter-enums.cpp:131 ../src/ui/tools/flood-tool.cpp:189
msgid "Alpha"
msgstr "Alpha"
-#: ../src/extension/internal/filter/color.h:174
+#: ../src/extension/internal/filter/color.h:175
msgid "Replace RGB by any color"
msgstr "RGB durch eine Farbe ersetzen"
#: ../src/extension/internal/filter/color.h:254
+#, fuzzy
+msgid "Color Blindness"
+msgstr "Farbige Außenlinie"
+
+#: ../src/extension/internal/filter/color.h:258
+#, fuzzy
+msgid "Blindness type:"
+msgstr "Misch-Typ:"
+
+#: ../src/extension/internal/filter/color.h:259
+msgid "Rod monochromacy (atypical achromatopsia)"
+msgstr ""
+
+#: ../src/extension/internal/filter/color.h:260
+msgid "Cone monochromacy (typical achromatopsia)"
+msgstr ""
+
+#: ../src/extension/internal/filter/color.h:261
+msgid "Geen weak (deuteranomaly)"
+msgstr ""
+
+#: ../src/extension/internal/filter/color.h:262
+msgid "Green blind (deuteranopia)"
+msgstr ""
+
+#: ../src/extension/internal/filter/color.h:263
+msgid "Red weak (protanomaly)"
+msgstr ""
+
+#: ../src/extension/internal/filter/color.h:264
+msgid "Red blind (protanopia)"
+msgstr ""
+
+#: ../src/extension/internal/filter/color.h:265
+msgid "Blue weak (tritanomaly)"
+msgstr ""
+
+#: ../src/extension/internal/filter/color.h:266
+msgid "Blue blind (tritanopia)"
+msgstr ""
+
+#: ../src/extension/internal/filter/color.h:286
+#, fuzzy
+msgid "Simulate color blindness"
+msgstr "Simuliere ÖlgemĂ€lde"
+
+#: ../src/extension/internal/filter/color.h:329
msgid "Color Shift"
msgstr "Farbverschiebung"
-#: ../src/extension/internal/filter/color.h:256
+#: ../src/extension/internal/filter/color.h:331
msgid "Shift (°)"
msgstr "Verschiebung (°)"
-#: ../src/extension/internal/filter/color.h:265
+#: ../src/extension/internal/filter/color.h:340
msgid "Rotate and desaturate hue"
msgstr "Farbton rotieren nud entsÀttigen"
-#: ../src/extension/internal/filter/color.h:321
+#: ../src/extension/internal/filter/color.h:396
msgid "Harsh light"
msgstr "Grelles Licht"
-#: ../src/extension/internal/filter/color.h:322
+#: ../src/extension/internal/filter/color.h:397
msgid "Normal light"
msgstr "Normales Licht"
-#: ../src/extension/internal/filter/color.h:323
+#: ../src/extension/internal/filter/color.h:398
msgid "Duotone"
msgstr "Zweifarbigkeit"
-#: ../src/extension/internal/filter/color.h:324
-#: ../src/extension/internal/filter/color.h:1412
+#: ../src/extension/internal/filter/color.h:399
+#: ../src/extension/internal/filter/color.h:1487
msgid "Blend 1:"
msgstr "Mischen 1:"
-#: ../src/extension/internal/filter/color.h:331
-#: ../src/extension/internal/filter/color.h:1418
+#: ../src/extension/internal/filter/color.h:406
+#: ../src/extension/internal/filter/color.h:1493
msgid "Blend 2:"
msgstr "Mischen 2:"
-#: ../src/extension/internal/filter/color.h:350
+#: ../src/extension/internal/filter/color.h:425
msgid "Blend image or object with a flood color"
msgstr "Mischt Bild oder Objekt mit einer fließenden Farbe"
-#: ../src/extension/internal/filter/color.h:424 ../src/filter-enums.cpp:23
+#: ../src/extension/internal/filter/color.h:499 ../src/filter-enums.cpp:23
msgid "Component Transfer"
msgstr "Komponenten-Übertragung"
-#: ../src/extension/internal/filter/color.h:427 ../src/filter-enums.cpp:110
+#: ../src/extension/internal/filter/color.h:502 ../src/filter-enums.cpp:110
msgid "Identity"
msgstr "IdentitÀt"
-#: ../src/extension/internal/filter/color.h:428
+#: ../src/extension/internal/filter/color.h:503
#: ../src/extension/internal/filter/paint.h:498 ../src/filter-enums.cpp:111
#: ../src/ui/dialog/filter-effects-dialog.cpp:1050
msgid "Table"
msgstr "Tabelle"
-#: ../src/extension/internal/filter/color.h:429
+#: ../src/extension/internal/filter/color.h:504
#: ../src/extension/internal/filter/paint.h:499 ../src/filter-enums.cpp:112
#: ../src/ui/dialog/filter-effects-dialog.cpp:1053
msgid "Discrete"
msgstr "Getrennt"
-#: ../src/extension/internal/filter/color.h:430 ../src/filter-enums.cpp:113
+#: ../src/extension/internal/filter/color.h:505 ../src/filter-enums.cpp:113
#: ../src/live_effects/lpe-interpolate_points.cpp:25
#: ../src/live_effects/lpe-powerstroke.cpp:194
msgid "Linear"
msgstr "Linie"
-#: ../src/extension/internal/filter/color.h:431 ../src/filter-enums.cpp:114
+#: ../src/extension/internal/filter/color.h:506 ../src/filter-enums.cpp:114
msgid "Gamma"
msgstr "Gamma"
-#: ../src/extension/internal/filter/color.h:440
+#: ../src/extension/internal/filter/color.h:515
msgid "Basic component transfer structure"
msgstr "Basis-Komponente Transferstruktur"
-#: ../src/extension/internal/filter/color.h:509
+#: ../src/extension/internal/filter/color.h:584
msgid "Duochrome"
msgstr "Duochrom"
-#: ../src/extension/internal/filter/color.h:513
+#: ../src/extension/internal/filter/color.h:588
msgid "Fluorescence level"
msgstr "Fluoreszenz-Level"
-#: ../src/extension/internal/filter/color.h:514
+#: ../src/extension/internal/filter/color.h:589
msgid "Swap:"
msgstr "Tausch:"
-#: ../src/extension/internal/filter/color.h:515
+#: ../src/extension/internal/filter/color.h:590
msgid "No swap"
msgstr "Kein Tausch"
-#: ../src/extension/internal/filter/color.h:516
+#: ../src/extension/internal/filter/color.h:591
msgid "Color and alpha"
msgstr "Farbe und Alpha"
-#: ../src/extension/internal/filter/color.h:517
+#: ../src/extension/internal/filter/color.h:592
msgid "Color only"
msgstr "nur Farbe"
-#: ../src/extension/internal/filter/color.h:518
+#: ../src/extension/internal/filter/color.h:593
msgid "Alpha only"
msgstr "nur Alpha"
-#: ../src/extension/internal/filter/color.h:522
+#: ../src/extension/internal/filter/color.h:597
msgid "Color 1"
msgstr "Farbe 1"
-#: ../src/extension/internal/filter/color.h:525
+#: ../src/extension/internal/filter/color.h:600
msgid "Color 2"
msgstr "Farbe 2"
-#: ../src/extension/internal/filter/color.h:535
+#: ../src/extension/internal/filter/color.h:610
msgid "Convert luminance values to a duochrome palette"
msgstr "Konvertiert Luminanzwerte in eine duochrome Palette"
-#: ../src/extension/internal/filter/color.h:634
+#: ../src/extension/internal/filter/color.h:709
msgid "Extract Channel"
msgstr "Kanal extrahieren"
-#: ../src/extension/internal/filter/color.h:640
+#: ../src/extension/internal/filter/color.h:715
#: ../src/widgets/sp-color-icc-selector.cpp:344
#: ../src/widgets/sp-color-icc-selector.cpp:349
#: ../src/widgets/sp-color-scales.cpp:469
@@ -6697,7 +6753,7 @@ msgstr "Kanal extrahieren"
msgid "Cyan"
msgstr "Zyan"
-#: ../src/extension/internal/filter/color.h:641
+#: ../src/extension/internal/filter/color.h:716
#: ../src/widgets/sp-color-icc-selector.cpp:345
#: ../src/widgets/sp-color-icc-selector.cpp:350
#: ../src/widgets/sp-color-scales.cpp:472
@@ -6705,7 +6761,7 @@ msgstr "Zyan"
msgid "Magenta"
msgstr "Magenta"
-#: ../src/extension/internal/filter/color.h:642
+#: ../src/extension/internal/filter/color.h:717
#: ../src/widgets/sp-color-icc-selector.cpp:346
#: ../src/widgets/sp-color-icc-selector.cpp:351
#: ../src/widgets/sp-color-scales.cpp:475
@@ -6713,27 +6769,27 @@ msgstr "Magenta"
msgid "Yellow"
msgstr "Gelb"
-#: ../src/extension/internal/filter/color.h:644
+#: ../src/extension/internal/filter/color.h:719
msgid "Background blend mode:"
msgstr "Hintergrund-Mischmodus:"
-#: ../src/extension/internal/filter/color.h:649
+#: ../src/extension/internal/filter/color.h:724
msgid "Channel to alpha"
msgstr "Kanal zu Alpha"
-#: ../src/extension/internal/filter/color.h:657
+#: ../src/extension/internal/filter/color.h:732
msgid "Extract color channel as a transparent image"
msgstr "Extrahiere Farbkanal als ein transparentes Bild"
-#: ../src/extension/internal/filter/color.h:740
+#: ../src/extension/internal/filter/color.h:815
msgid "Fade to Black or White"
msgstr "Zu Schwarz oder Weiß ausblenden"
-#: ../src/extension/internal/filter/color.h:743
+#: ../src/extension/internal/filter/color.h:818
msgid "Fade to:"
msgstr "Ausblenden zu:"
-#: ../src/extension/internal/filter/color.h:744
+#: ../src/extension/internal/filter/color.h:819
#: ../src/ui/widget/selected-style.cpp:274
#: ../src/widgets/sp-color-icc-selector.cpp:347
#: ../src/widgets/sp-color-scales.cpp:478
@@ -6741,139 +6797,139 @@ msgstr "Ausblenden zu:"
msgid "Black"
msgstr "Schwarz"
-#: ../src/extension/internal/filter/color.h:745
+#: ../src/extension/internal/filter/color.h:820
#: ../src/ui/widget/selected-style.cpp:270
msgid "White"
msgstr "Weiß"
-#: ../src/extension/internal/filter/color.h:754
+#: ../src/extension/internal/filter/color.h:829
msgid "Fade to black or white"
msgstr "Ausblenden zu Schwarz oder Weiß"
-#: ../src/extension/internal/filter/color.h:819
+#: ../src/extension/internal/filter/color.h:894
msgid "Greyscale"
msgstr "Graustufen"
-#: ../src/extension/internal/filter/color.h:825
+#: ../src/extension/internal/filter/color.h:900
#: ../src/extension/internal/filter/paint.h:83
#: ../src/extension/internal/filter/paint.h:239
msgid "Transparent"
msgstr "Transparent"
-#: ../src/extension/internal/filter/color.h:833
+#: ../src/extension/internal/filter/color.h:908
msgid "Customize greyscale components"
msgstr "Anpassen der Graustufen-Komponenten"
-#: ../src/extension/internal/filter/color.h:905
+#: ../src/extension/internal/filter/color.h:980
#: ../src/ui/widget/selected-style.cpp:266
msgid "Invert"
msgstr "Invertieren"
-#: ../src/extension/internal/filter/color.h:907
+#: ../src/extension/internal/filter/color.h:982
msgid "Invert channels:"
msgstr "KanÀle invertieren:"
-#: ../src/extension/internal/filter/color.h:908
+#: ../src/extension/internal/filter/color.h:983
msgid "No inversion"
msgstr "Keine Umkehrung"
-#: ../src/extension/internal/filter/color.h:909
+#: ../src/extension/internal/filter/color.h:984
msgid "Red and blue"
msgstr "Rot und Blau"
-#: ../src/extension/internal/filter/color.h:910
+#: ../src/extension/internal/filter/color.h:985
msgid "Red and green"
msgstr "Rot und GrĂŒn"
-#: ../src/extension/internal/filter/color.h:911
+#: ../src/extension/internal/filter/color.h:986
msgid "Green and blue"
msgstr "GrĂŒn und Blau"
-#: ../src/extension/internal/filter/color.h:913
+#: ../src/extension/internal/filter/color.h:988
msgid "Light transparency"
msgstr "Lichttransparenz:"
-#: ../src/extension/internal/filter/color.h:914
+#: ../src/extension/internal/filter/color.h:989
msgid "Invert hue"
msgstr "Farbton invertieren"
-#: ../src/extension/internal/filter/color.h:915
+#: ../src/extension/internal/filter/color.h:990
msgid "Invert lightness"
msgstr "Helligkeit invertieren"
-#: ../src/extension/internal/filter/color.h:916
+#: ../src/extension/internal/filter/color.h:991
msgid "Invert transparency"
msgstr "Transparenz invertieren"
-#: ../src/extension/internal/filter/color.h:924
+#: ../src/extension/internal/filter/color.h:999
msgid "Manage hue, lightness and transparency inversions"
msgstr "Verwalten Farbton, Helligkeit und Transparenz-Umkehrungen"
-#: ../src/extension/internal/filter/color.h:1042
+#: ../src/extension/internal/filter/color.h:1117
msgid "Lights"
msgstr "Lichter"
-#: ../src/extension/internal/filter/color.h:1043
+#: ../src/extension/internal/filter/color.h:1118
msgid "Shadows"
msgstr "Schatten"
-#: ../src/extension/internal/filter/color.h:1044
+#: ../src/extension/internal/filter/color.h:1119
#: ../src/extension/internal/filter/paint.h:356 ../src/filter-enums.cpp:33
#: ../src/live_effects/effect.cpp:110
#: ../src/ui/dialog/filter-effects-dialog.cpp:1047
-#: ../src/widgets/gradient-toolbar.cpp:1156
+#: ../src/widgets/gradient-toolbar.cpp:1159
msgid "Offset"
msgstr "Versatz"
-#: ../src/extension/internal/filter/color.h:1052
+#: ../src/extension/internal/filter/color.h:1127
msgid "Modify lights and shadows separately"
msgstr "Licht und Schatten einzeln verÀndern"
-#: ../src/extension/internal/filter/color.h:1111
+#: ../src/extension/internal/filter/color.h:1186
msgid "Lightness-Contrast"
msgstr "Helligkeit - Kontrast"
-#: ../src/extension/internal/filter/color.h:1122
+#: ../src/extension/internal/filter/color.h:1197
msgid "Modify lightness and contrast separately"
msgstr "Helligkeit und Kontrast einzeln anpassen"
-#: ../src/extension/internal/filter/color.h:1190
+#: ../src/extension/internal/filter/color.h:1265
msgid "Nudge RGB"
msgstr "PrÀzisionsausrichtung RGB"
-#: ../src/extension/internal/filter/color.h:1194
+#: ../src/extension/internal/filter/color.h:1269
msgid "Red offset"
msgstr "Rot-Versatz:"
-#: ../src/extension/internal/filter/color.h:1195
-#: ../src/extension/internal/filter/color.h:1198
-#: ../src/extension/internal/filter/color.h:1201
-#: ../src/extension/internal/filter/color.h:1307
-#: ../src/extension/internal/filter/color.h:1310
-#: ../src/extension/internal/filter/color.h:1313
+#: ../src/extension/internal/filter/color.h:1270
+#: ../src/extension/internal/filter/color.h:1273
+#: ../src/extension/internal/filter/color.h:1276
+#: ../src/extension/internal/filter/color.h:1382
+#: ../src/extension/internal/filter/color.h:1385
+#: ../src/extension/internal/filter/color.h:1388
#: ../src/ui/dialog/input.cpp:1616 ../src/ui/dialog/layers.cpp:917
msgid "X"
msgstr "X"
-#: ../src/extension/internal/filter/color.h:1196
-#: ../src/extension/internal/filter/color.h:1199
-#: ../src/extension/internal/filter/color.h:1202
-#: ../src/extension/internal/filter/color.h:1308
-#: ../src/extension/internal/filter/color.h:1311
-#: ../src/extension/internal/filter/color.h:1314
+#: ../src/extension/internal/filter/color.h:1271
+#: ../src/extension/internal/filter/color.h:1274
+#: ../src/extension/internal/filter/color.h:1277
+#: ../src/extension/internal/filter/color.h:1383
+#: ../src/extension/internal/filter/color.h:1386
+#: ../src/extension/internal/filter/color.h:1389
#: ../src/ui/dialog/input.cpp:1616
msgid "Y"
msgstr "Y:"
-#: ../src/extension/internal/filter/color.h:1197
+#: ../src/extension/internal/filter/color.h:1272
msgid "Green offset"
msgstr "GrĂŒn-Versatz:"
-#: ../src/extension/internal/filter/color.h:1200
+#: ../src/extension/internal/filter/color.h:1275
msgid "Blue offset"
msgstr "Blau-Versatz:"
-#: ../src/extension/internal/filter/color.h:1215
+#: ../src/extension/internal/filter/color.h:1290
msgid ""
"Nudge RGB channels separately and blend them to different types of "
"backgrounds"
@@ -6881,23 +6937,23 @@ msgstr ""
"PrÀzisionsausrichtung nach RGB-KanÀlen getrennt und mischt sie zu "
"verschiedenen Typen von HintergrĂŒnden"
-#: ../src/extension/internal/filter/color.h:1302
+#: ../src/extension/internal/filter/color.h:1377
msgid "Nudge CMY"
msgstr "PrÀzisionsausrichtung RGB"
-#: ../src/extension/internal/filter/color.h:1306
+#: ../src/extension/internal/filter/color.h:1381
msgid "Cyan offset"
msgstr "Blau-Versatz"
-#: ../src/extension/internal/filter/color.h:1309
+#: ../src/extension/internal/filter/color.h:1384
msgid "Magenta offset"
msgstr "Rot-Versatz"
-#: ../src/extension/internal/filter/color.h:1312
+#: ../src/extension/internal/filter/color.h:1387
msgid "Yellow offset"
msgstr "Gelb-Versatz"
-#: ../src/extension/internal/filter/color.h:1327
+#: ../src/extension/internal/filter/color.h:1402
msgid ""
"Nudge CMY channels separately and blend them to different types of "
"backgrounds"
@@ -6905,80 +6961,80 @@ msgstr ""
"PrÀzisionsausrichtung nach RGB-KanÀlen getrennt und mischt sie zu "
"verschiedenen Typen von HintergrĂŒnden"
-#: ../src/extension/internal/filter/color.h:1408
+#: ../src/extension/internal/filter/color.h:1483
msgid "Quadritone fantasy"
msgstr "Vierfarben-Fantasie"
-#: ../src/extension/internal/filter/color.h:1410
+#: ../src/extension/internal/filter/color.h:1485
msgid "Hue distribution (°)"
msgstr "Farbton Verteilung (°)"
-#: ../src/extension/internal/filter/color.h:1411
+#: ../src/extension/internal/filter/color.h:1486
#: ../share/extensions/svgcalendar.inx.h:19
msgid "Colors"
msgstr "Farben"
-#: ../src/extension/internal/filter/color.h:1432
+#: ../src/extension/internal/filter/color.h:1507
msgid "Replace hue by two colors"
msgstr "Farbwert durch zwei Farben ersetzen"
-#: ../src/extension/internal/filter/color.h:1496
+#: ../src/extension/internal/filter/color.h:1571
msgid "Hue rotation (°)"
msgstr "Farbtondrehung (°)"
-#: ../src/extension/internal/filter/color.h:1499
+#: ../src/extension/internal/filter/color.h:1574
msgid "Moonarize"
msgstr "Lunarisieren"
-#: ../src/extension/internal/filter/color.h:1508
+#: ../src/extension/internal/filter/color.h:1583
msgid "Classic photographic solarization effect"
msgstr "Klassischer fotografischer Solarisationseffekt"
-#: ../src/extension/internal/filter/color.h:1581
+#: ../src/extension/internal/filter/color.h:1656
msgid "Tritone"
msgstr "Drei-Farben-Palette"
-#: ../src/extension/internal/filter/color.h:1587
+#: ../src/extension/internal/filter/color.h:1662
msgid "Enhance hue"
msgstr "Farbton verbessern"
-#: ../src/extension/internal/filter/color.h:1588
+#: ../src/extension/internal/filter/color.h:1663
msgid "Phosphorescence"
msgstr "Phosphorisierend"
-#: ../src/extension/internal/filter/color.h:1589
+#: ../src/extension/internal/filter/color.h:1664
msgid "Colored nights"
msgstr "Farbige NĂ€chte"
-#: ../src/extension/internal/filter/color.h:1590
+#: ../src/extension/internal/filter/color.h:1665
msgid "Hue to background"
msgstr "Farbton zu Hintergrund"
-#: ../src/extension/internal/filter/color.h:1592
+#: ../src/extension/internal/filter/color.h:1667
msgid "Global blend:"
msgstr "Globales Mischen:"
-#: ../src/extension/internal/filter/color.h:1598
+#: ../src/extension/internal/filter/color.h:1673
msgid "Glow"
msgstr "GlĂŒhen"
-#: ../src/extension/internal/filter/color.h:1599
+#: ../src/extension/internal/filter/color.h:1674
msgid "Glow blend:"
msgstr "GlĂŒhend "
-#: ../src/extension/internal/filter/color.h:1604
+#: ../src/extension/internal/filter/color.h:1679
msgid "Local light"
msgstr "Lokales Licht"
-#: ../src/extension/internal/filter/color.h:1605
+#: ../src/extension/internal/filter/color.h:1680
msgid "Global light"
msgstr "Globales Licht"
-#: ../src/extension/internal/filter/color.h:1608
+#: ../src/extension/internal/filter/color.h:1683
msgid "Hue distribution (°):"
msgstr "Farbton Verteilung (°):"
-#: ../src/extension/internal/filter/color.h:1619
+#: ../src/extension/internal/filter/color.h:1694
msgid ""
"Create a custom tritone palette with additional glow, blend modes and hue "
"moving"
@@ -7151,7 +7207,7 @@ msgstr "Öffnen"
#: ../src/extension/internal/filter/morphology.h:65
#: ../src/libgdl/gdl-dock-placeholder.c:167 ../src/libgdl/gdl-dock.c:191
-#: ../src/widgets/rect-toolbar.cpp:318 ../src/widgets/spray-toolbar.cpp:116
+#: ../src/widgets/rect-toolbar.cpp:317 ../src/widgets/spray-toolbar.cpp:116
#: ../src/widgets/tweak-toolbar.cpp:128
#: ../share/extensions/interp_att_g.inx.h:10
msgid "Width"
@@ -7260,7 +7316,7 @@ msgstr "Rauschen"
#: ../src/extension/internal/filter/overlays.h:59
#: ../src/extension/internal/filter/paint.h:690
-#: ../src/extension/internal/filter/shadows.h:60 ../src/ui/dialog/find.cpp:87
+#: ../src/extension/internal/filter/shadows.h:60 ../src/ui/dialog/find.cpp:88
#: ../src/ui/dialog/tracedialog.cpp:747
#: ../share/extensions/color_HSL_adjust.inx.h:2
#: ../share/extensions/color_custom.inx.h:2
@@ -7739,7 +7795,7 @@ msgstr "%s Bitmap-Bildimport"
#: ../src/extension/internal/gdkpixbuf-input.cpp:190
msgid "Image Import Type:"
-msgstr "Bildimporttyp:"
+msgstr "Art des Bildimports:"
#: ../src/extension/internal/gdkpixbuf-input.cpp:190
msgid ""
@@ -7753,24 +7809,24 @@ msgstr ""
#: ../src/extension/internal/gdkpixbuf-input.cpp:191
#: ../src/ui/dialog/inkscape-preferences.cpp:1456
msgid "Embed"
-msgstr "<einbetten"
+msgstr "Einbetten"
-#: ../src/extension/internal/gdkpixbuf-input.cpp:192 ../src/sp-anchor.cpp:119
+#: ../src/extension/internal/gdkpixbuf-input.cpp:192 ../src/sp-anchor.cpp:105
#: ../src/ui/dialog/inkscape-preferences.cpp:1456
msgid "Link"
-msgstr "VerknĂŒpfung"
+msgstr "VerknĂŒpfen"
#: ../src/extension/internal/gdkpixbuf-input.cpp:195
msgid "Image DPI:"
-msgstr "Bild DPI:"
+msgstr "Auflösung des Bildes (DPI):"
#: ../src/extension/internal/gdkpixbuf-input.cpp:195
msgid ""
"Take information from file or use default bitmap import resolution as "
"defined in the preferences."
msgstr ""
-"Information der Datei verwenden oder die in den Einstellungen definierte "
-"Auflösung fĂŒr den Bitmap-Import verwenden."
+"Information aus Datei auslesen oder die in den Einstellungen definierte "
+"Standardauflösung fĂŒr den Bitmap-Import verwenden."
#: ../src/extension/internal/gdkpixbuf-input.cpp:196
msgid "From file"
@@ -7782,15 +7838,15 @@ msgstr "Standard-Importauflösung"
#: ../src/extension/internal/gdkpixbuf-input.cpp:200
msgid "Image Rendering Mode:"
-msgstr "Bildrendermodus:"
+msgstr "Darstellugsmethode:"
#: ../src/extension/internal/gdkpixbuf-input.cpp:200
msgid ""
"When an image is upscaled, apply smoothing or keep blocky (pixelated). (Will "
"not work in all browsers.)"
msgstr ""
-"Bei vergrĂ¶ĂŸerte Bilder Kanten glĂ€tten oder pixelig lassen. (Funktioniert "
-"nicht bei allen Browsern.)"
+"Beim VergrĂ¶ĂŸern des Bildes die Kanten glĂ€tten oder pixelig lassen. "
+"(Funktioniert nicht in allen Browsern.)"
#: ../src/extension/internal/gdkpixbuf-input.cpp:201
#: ../src/ui/dialog/inkscape-preferences.cpp:1463
@@ -7809,11 +7865,13 @@ msgstr "Pixelig (verbesserte Geschwindigkeit)"
#: ../src/extension/internal/gdkpixbuf-input.cpp:206
msgid "Hide the dialog next time and always apply the same actions."
-msgstr "Dialog nicht mehr anzeigen und immer diese Aktion ausfĂŒhren."
+msgstr ""
+"Dialog beim nÀchsten Mal nicht mehr anzeigen und immer diese Einstellungen "
+"anwenden."
#: ../src/extension/internal/gdkpixbuf-input.cpp:206
msgid "Don't ask again"
-msgstr "Nicht nochmal nachfragen"
+msgstr "Nicht wieder nachfragen"
#: ../src/extension/internal/gimpgrad.cpp:272
msgid "GIMP Gradients"
@@ -7883,9 +7941,9 @@ msgid "Render"
msgstr "Rendern"
#: ../src/extension/internal/grid.cpp:223
-#: ../src/ui/dialog/document-properties.cpp:155
+#: ../src/ui/dialog/document-properties.cpp:162
#: ../src/ui/dialog/inkscape-preferences.cpp:787
-#: ../src/widgets/toolbox.cpp:1825
+#: ../src/widgets/toolbox.cpp:1827
msgid "Grids"
msgstr "Gitter"
@@ -8175,33 +8233,33 @@ msgstr "VSDX einlesen"
msgid "Microsoft Visio 2013 drawing (*.vsdx)"
msgstr "Microsoft Visio 2013 Zeichnung (*ÂŽ.vsdx)"
-#: ../src/extension/internal/wmf-inout.cpp:3128
+#: ../src/extension/internal/wmf-inout.cpp:3136
msgid "WMF Input"
msgstr "WMF einlesen"
-#: ../src/extension/internal/wmf-inout.cpp:3133
+#: ../src/extension/internal/wmf-inout.cpp:3141
msgid "Windows Metafiles (*.wmf)"
msgstr "Windows-Metadateien (*.wmf)"
-#: ../src/extension/internal/wmf-inout.cpp:3134
+#: ../src/extension/internal/wmf-inout.cpp:3142
msgid "Windows Metafiles"
msgstr "Windows-Metadateien"
-#: ../src/extension/internal/wmf-inout.cpp:3142
+#: ../src/extension/internal/wmf-inout.cpp:3150
msgid "WMF Output"
msgstr "WMF-Ausgabe"
-#: ../src/extension/internal/wmf-inout.cpp:3152
+#: ../src/extension/internal/wmf-inout.cpp:3160
msgid "Map all fill patterns to standard WMF hatches"
msgstr "Alle FĂŒllmuster als Standard WMF-Muster verbinden"
-#: ../src/extension/internal/wmf-inout.cpp:3156
+#: ../src/extension/internal/wmf-inout.cpp:3164
#: ../share/extensions/wmf_input.inx.h:2
#: ../share/extensions/wmf_output.inx.h:2
msgid "Windows Metafile (*.wmf)"
msgstr "Windows-Metadatei (*.wmf)"
-#: ../src/extension/internal/wmf-inout.cpp:3157
+#: ../src/extension/internal/wmf-inout.cpp:3165
msgid "Windows Metafile"
msgstr "Windows-Metadatei"
@@ -8235,54 +8293,54 @@ msgstr ""
msgid "default.svg"
msgstr "default.de.svg"
-#: ../src/file.cpp:322
+#: ../src/file.cpp:328
msgid "Broken links have been changed to point to existing files."
msgstr ""
"Defekte VerknĂŒpfungen wurden geĂ€ndert, um vorhandene Dateien zu verweisen."
-#: ../src/file.cpp:333 ../src/file.cpp:1249
+#: ../src/file.cpp:339 ../src/file.cpp:1255
#, c-format
msgid "Failed to load the requested file %s"
msgstr "Laden der gewĂŒnschten Datei %s fehlgeschlagen"
-#: ../src/file.cpp:359
+#: ../src/file.cpp:365
msgid "Document not saved yet. Cannot revert."
msgstr "Dokument noch nicht gespeichtert. Kann nicht zurĂŒcksetzen."
-#: ../src/file.cpp:365
+#: ../src/file.cpp:371
msgid "Changes will be lost! Are you sure you want to reload document %1?"
msgstr ""
"Änderungen gehen verloren! Sind Sie sicher, dass Sie das Dokument %1 erneut "
"laden möchten?"
-#: ../src/file.cpp:391
+#: ../src/file.cpp:397
msgid "Document reverted."
msgstr "Dokument zurĂŒckgesetzt."
-#: ../src/file.cpp:393
+#: ../src/file.cpp:399
msgid "Document not reverted."
msgstr "Dokument nicht zurĂŒckgesetzt."
-#: ../src/file.cpp:543
+#: ../src/file.cpp:549
msgid "Select file to open"
msgstr "WÀhlen Sie die zu öffnende Datei"
-#: ../src/file.cpp:625
+#: ../src/file.cpp:631
msgid "Clean up document"
msgstr "Dokument bereinigen"
-#: ../src/file.cpp:632
+#: ../src/file.cpp:638
#, c-format
msgid "Removed <b>%i</b> unused definition in &lt;defs&gt;."
msgid_plural "Removed <b>%i</b> unused definitions in &lt;defs&gt;."
msgstr[0] "<b>%i</b> ĂŒberflĂŒssiges Element aus &lt;defs&gt; entfernt."
msgstr[1] "<b>%i</b> ĂŒberflĂŒssige Elemente aus &lt;defs&gt; entfernt."
-#: ../src/file.cpp:637
+#: ../src/file.cpp:643
msgid "No unused definitions in &lt;defs&gt;."
msgstr "Keine ĂŒberflĂŒssigen Elemente in &lt;defs&gt;."
-#: ../src/file.cpp:669
+#: ../src/file.cpp:675
#, c-format
msgid ""
"No Inkscape extension found to save document (%s). This may have been "
@@ -8291,12 +8349,12 @@ msgstr ""
"Keine vorhandene Erweiterung von Inkscape kann das Dokument (%s) sichern. "
"Dies Ursache dafĂŒr ist möglicherweise eine unbekannte Dateinamenendung."
-#: ../src/file.cpp:670 ../src/file.cpp:678 ../src/file.cpp:686
-#: ../src/file.cpp:692 ../src/file.cpp:697
+#: ../src/file.cpp:676 ../src/file.cpp:684 ../src/file.cpp:692
+#: ../src/file.cpp:698 ../src/file.cpp:703
msgid "Document not saved."
msgstr "Dokument wurde nicht gespeichert."
-#: ../src/file.cpp:677
+#: ../src/file.cpp:683
#, c-format
msgid ""
"File %s is write protected. Please remove write protection and try again."
@@ -8304,54 +8362,54 @@ msgstr ""
"Datei %s ist schreibgeschĂŒtzt! Bitte entfernen Sie den Schreibschutz und "
"versuchen es dann erneut."
-#: ../src/file.cpp:685
+#: ../src/file.cpp:691
#, c-format
msgid "File %s could not be saved."
msgstr "Datei %s konnte nicht gespeichert werden."
-#: ../src/file.cpp:715 ../src/file.cpp:717
+#: ../src/file.cpp:721 ../src/file.cpp:723
msgid "Document saved."
msgstr "Dokument wurde gespeichert."
#. We are saving for the first time; create a unique default filename
-#: ../src/file.cpp:860 ../src/file.cpp:1408
+#: ../src/file.cpp:866 ../src/file.cpp:1414
msgid "drawing"
msgstr "Zeichnung"
-#: ../src/file.cpp:865
+#: ../src/file.cpp:871
msgid "drawing-%1"
msgstr "Zeichnung-%1"
-#: ../src/file.cpp:882
+#: ../src/file.cpp:888
msgid "Select file to save a copy to"
msgstr "Datei wÀhlen, in die eine Kopie gespeichert werden soll"
-#: ../src/file.cpp:884
+#: ../src/file.cpp:890
msgid "Select file to save to"
msgstr "Datei wÀhlen, in die gespeichert werden soll"
-#: ../src/file.cpp:989 ../src/file.cpp:991
+#: ../src/file.cpp:995 ../src/file.cpp:997
msgid "No changes need to be saved."
msgstr "Es mĂŒssen keine Änderungen gespeichert werden."
-#: ../src/file.cpp:1010
+#: ../src/file.cpp:1016
msgid "Saving document..."
msgstr "Dokument wird gespeichert..."
-#: ../src/file.cpp:1246 ../src/ui/dialog/inkscape-preferences.cpp:1450
+#: ../src/file.cpp:1252 ../src/ui/dialog/inkscape-preferences.cpp:1450
#: ../src/ui/dialog/ocaldialogs.cpp:1244
msgid "Import"
msgstr "Importieren"
-#: ../src/file.cpp:1296
+#: ../src/file.cpp:1302
msgid "Select file to import"
msgstr "WĂ€hlen Sie die zu importierende Datei"
-#: ../src/file.cpp:1429
+#: ../src/file.cpp:1435
msgid "Select file to export to"
msgstr "WĂ€hlen Sie die Datei, in die exportiert werden soll"
-#: ../src/file.cpp:1682
+#: ../src/file.cpp:1688
msgid "Import Clip Art"
msgstr "Importiere Clipart"
@@ -8421,12 +8479,10 @@ msgid "Overlay"
msgstr "Überlagerung"
#: ../src/filter-enums.cpp:59
-#, fuzzy
msgid "Color Dodge"
msgstr "Farbig abwedeln"
#: ../src/filter-enums.cpp:60
-#, fuzzy
msgid "Color Burn"
msgstr "Farbig nachbelichten"
@@ -8446,7 +8502,7 @@ msgstr "Differenz"
msgid "Exclusion"
msgstr "Exklusiv-Oder (Ausschluss)"
-#: ../src/filter-enums.cpp:65 ../src/ui/tools/flood-tool.cpp:196
+#: ../src/filter-enums.cpp:65 ../src/ui/tools/flood-tool.cpp:186
#: ../src/widgets/sp-color-icc-selector.cpp:336
#: ../src/widgets/sp-color-icc-selector.cpp:340
#: ../src/widgets/sp-color-scales.cpp:441
@@ -8475,8 +8531,7 @@ msgstr "Farbton rotieren"
msgid "Luminance to Alpha"
msgstr "Leuchtkraft zu Alpha"
-#. File
-#: ../src/filter-enums.cpp:87 ../src/verbs.cpp:2431
+#: ../src/filter-enums.cpp:87
#: ../share/extensions/jessyInk_mouseHandler.inx.h:3
#: ../share/extensions/jessyInk_transitions.inx.h:7
msgid "Default"
@@ -8565,53 +8620,53 @@ msgstr "Farbverlauf invertieren"
msgid "Reverse gradient"
msgstr "Farbverlauf umkehren"
-#: ../src/gradient-chemistry.cpp:1619 ../src/widgets/gradient-selector.cpp:227
+#: ../src/gradient-chemistry.cpp:1619 ../src/widgets/gradient-selector.cpp:222
msgid "Delete swatch"
msgstr "Zwischenfarbe löschen"
-#: ../src/gradient-drag.cpp:97 ../src/ui/tools/gradient-tool.cpp:100
+#: ../src/gradient-drag.cpp:97 ../src/ui/tools/gradient-tool.cpp:90
msgid "Linear gradient <b>start</b>"
msgstr "<b>Anfang</b> des linearen Farbverlaufs"
#. POINT_LG_BEGIN
-#: ../src/gradient-drag.cpp:98 ../src/ui/tools/gradient-tool.cpp:101
+#: ../src/gradient-drag.cpp:98 ../src/ui/tools/gradient-tool.cpp:91
msgid "Linear gradient <b>end</b>"
msgstr "<b>Ende</b> des linearen Farbverlaufs"
-#: ../src/gradient-drag.cpp:99 ../src/ui/tools/gradient-tool.cpp:102
+#: ../src/gradient-drag.cpp:99 ../src/ui/tools/gradient-tool.cpp:92
msgid "Linear gradient <b>mid stop</b>"
msgstr "<b>Zwischenfarbe</b> des linearen Farbverlaufs"
-#: ../src/gradient-drag.cpp:100 ../src/ui/tools/gradient-tool.cpp:103
+#: ../src/gradient-drag.cpp:100 ../src/ui/tools/gradient-tool.cpp:93
msgid "Radial gradient <b>center</b>"
msgstr "<b>Zentrum</b> des radialen Farbverlaufs"
#: ../src/gradient-drag.cpp:101 ../src/gradient-drag.cpp:102
-#: ../src/ui/tools/gradient-tool.cpp:104 ../src/ui/tools/gradient-tool.cpp:105
+#: ../src/ui/tools/gradient-tool.cpp:94 ../src/ui/tools/gradient-tool.cpp:95
msgid "Radial gradient <b>radius</b>"
msgstr "<b>Radius</b> des radialen Farbverlaufs"
-#: ../src/gradient-drag.cpp:103 ../src/ui/tools/gradient-tool.cpp:106
+#: ../src/gradient-drag.cpp:103 ../src/ui/tools/gradient-tool.cpp:96
msgid "Radial gradient <b>focus</b>"
msgstr "<b>Fokus</b> des radialen Farbverlaufs"
#. POINT_RG_FOCUS
#: ../src/gradient-drag.cpp:104 ../src/gradient-drag.cpp:105
-#: ../src/ui/tools/gradient-tool.cpp:107 ../src/ui/tools/gradient-tool.cpp:108
+#: ../src/ui/tools/gradient-tool.cpp:97 ../src/ui/tools/gradient-tool.cpp:98
msgid "Radial gradient <b>mid stop</b>"
msgstr "<b>Zwischenfarbe</b> des radialen Farbverlaufs"
-#: ../src/gradient-drag.cpp:106 ../src/ui/tools/mesh-tool.cpp:103
+#: ../src/gradient-drag.cpp:106 ../src/ui/tools/mesh-tool.cpp:93
msgid "Mesh gradient <b>corner</b>"
-msgstr "Gitterverlauf <b>Ecke</b>"
+msgstr "Verlaufsgitter <b>Ecke</b>"
-#: ../src/gradient-drag.cpp:107 ../src/ui/tools/mesh-tool.cpp:104
+#: ../src/gradient-drag.cpp:107 ../src/ui/tools/mesh-tool.cpp:94
msgid "Mesh gradient <b>handle</b>"
-msgstr "Gitterverlauf <b>Anfasser</b>"
+msgstr "Verlaufsgitter <b>Anfasser</b>"
-#: ../src/gradient-drag.cpp:108 ../src/ui/tools/mesh-tool.cpp:105
+#: ../src/gradient-drag.cpp:108 ../src/ui/tools/mesh-tool.cpp:95
msgid "Mesh gradient <b>tensor</b>"
-msgstr "Gitterverlauf <b>Tensor</b>"
+msgstr "Verlaufsgitter <b>Tensor</b>"
#: ../src/gradient-drag.cpp:567
msgid "Added patch row or column"
@@ -8805,7 +8860,7 @@ msgid "Dockitem which 'owns' this grip"
msgstr "Dockobjekt, das diesen Griff \"besitzt\""
#. Name
-#: ../src/libgdl/gdl-dock-item.c:298 ../src/widgets/ruler.cpp:191
+#: ../src/libgdl/gdl-dock-item.c:298 ../src/widgets/ruler.cpp:192
#: ../src/widgets/text-toolbar.cpp:1405
#: ../share/extensions/gcodetools_graffiti.inx.h:9
#: ../share/extensions/gcodetools_orientation_points.inx.h:2
@@ -8952,7 +9007,7 @@ msgstr ""
#: ../src/libgdl/gdl-dock-notebook.c:132
#: ../src/ui/dialog/align-and-distribute.cpp:1002
-#: ../src/ui/dialog/document-properties.cpp:153
+#: ../src/ui/dialog/document-properties.cpp:160
#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1537
#: ../src/widgets/desktop-widget.cpp:1992
#: ../share/extensions/empty_page.inx.h:1
@@ -8968,7 +9023,7 @@ msgstr "Aktuelle Seitenzahl"
#: ../src/live_effects/parameter/originalpatharray.cpp:86
#: ../src/ui/dialog/inkscape-preferences.cpp:1511
#: ../src/ui/widget/page-sizer.cpp:258
-#: ../src/widgets/gradient-selector.cpp:140
+#: ../src/widgets/gradient-selector.cpp:150
#: ../src/widgets/sp-xmlview-attr-list.cpp:49
msgid "Name"
msgstr "Name"
@@ -9042,7 +9097,7 @@ msgstr ""
"Versuch, %p an ein schon gebundenes Objekt %p anzubinden (gehört momentan zu "
"%p)"
-#: ../src/libgdl/gdl-dock-paned.c:130 ../src/widgets/ruler.cpp:229
+#: ../src/libgdl/gdl-dock-paned.c:130 ../src/widgets/ruler.cpp:230
msgid "Position"
msgstr "Position"
@@ -9356,7 +9411,7 @@ msgstr "Stich-Pfad"
msgid "Fill between strokes"
msgstr "FĂŒllung und _Kontur"
-#: ../src/live_effects/effect.cpp:147 ../src/selection-chemistry.cpp:2926
+#: ../src/live_effects/effect.cpp:147 ../src/selection-chemistry.cpp:2916
msgid "Fill between many"
msgstr ""
@@ -9553,54 +9608,58 @@ msgstr "Visuelle Rahmen"
msgid "Uses the visual bounding box"
msgstr "Visuelle Rahmen"
-#. initialise your parameters here:
-#. testpointA(_("Test Point A"), _("Test A"), "ptA", &wr, this,
-#. Geom::Point(100,100)),
-#: ../src/live_effects/lpe-bspline.cpp:60
+#: ../src/live_effects/lpe-bspline.cpp:57
msgid "Steps with CTRL:"
msgstr ""
-#: ../src/live_effects/lpe-bspline.cpp:60
+#: ../src/live_effects/lpe-bspline.cpp:57
msgid "Change number of steps with CTRL pressed"
msgstr ""
-#: ../src/live_effects/lpe-bspline.cpp:61
+#: ../src/live_effects/lpe-bspline.cpp:58
+#: ../src/live_effects/lpe-simplify.cpp:33
+#, fuzzy
+msgid "Helper size:"
+msgstr "AnfassergrĂ¶ĂŸe:"
+
+#: ../src/live_effects/lpe-bspline.cpp:58
+#: ../src/live_effects/lpe-simplify.cpp:33
+#, fuzzy
+msgid "Helper size"
+msgstr "AnfassergrĂ¶ĂŸe:"
+
+#: ../src/live_effects/lpe-bspline.cpp:59
#, fuzzy
msgid "Ignore cusp nodes"
msgstr "An spitzen Knoten einrasten"
-#: ../src/live_effects/lpe-bspline.cpp:61
+#: ../src/live_effects/lpe-bspline.cpp:59
#, fuzzy
msgid "Change ignoring cusp nodes"
msgstr "Versatz der Zwischenfarben des Farbverlaufs Àndern"
-#: ../src/live_effects/lpe-bspline.cpp:62
+#: ../src/live_effects/lpe-bspline.cpp:60
#: ../src/live_effects/lpe-fillet-chamfer.cpp:57
#, fuzzy
msgid "Change only selected nodes"
msgstr "GewÀhlte Endknoten verbinden"
-#: ../src/live_effects/lpe-bspline.cpp:63
-#, fuzzy
-msgid "Show helper paths"
-msgstr "An Ausschneidepfaden einrasten"
-
-#: ../src/live_effects/lpe-bspline.cpp:64
+#: ../src/live_effects/lpe-bspline.cpp:61
#, fuzzy
msgid "Change weight:"
msgstr "Deckelhöhe:"
-#: ../src/live_effects/lpe-bspline.cpp:64
+#: ../src/live_effects/lpe-bspline.cpp:61
#, fuzzy
msgid "Change weight of the effect"
msgstr "Höhe des Filtereffekts"
-#: ../src/live_effects/lpe-bspline.cpp:291
+#: ../src/live_effects/lpe-bspline.cpp:290
#, fuzzy
msgid "Default weight"
msgstr "Vorgegebener Titel"
-#: ../src/live_effects/lpe-bspline.cpp:296
+#: ../src/live_effects/lpe-bspline.cpp:295
#, fuzzy
msgid "Make cusp"
msgstr "Stern erstellen"
@@ -9843,7 +9902,7 @@ msgstr "Einheit:"
#. initialise your parameters here:
#: ../src/live_effects/lpe-fillet-chamfer.cpp:60
#: ../src/live_effects/lpe-roughen.cpp:39 ../src/live_effects/lpe-ruler.cpp:42
-#: ../src/widgets/ruler.cpp:201
+#: ../src/widgets/ruler.cpp:202
msgid "Unit"
msgstr "Einheit"
@@ -10013,7 +10072,7 @@ msgstr "Gehrung"
#: ../src/live_effects/lpe-jointype.cpp:34
#: ../src/live_effects/lpe-taperstroke.cpp:65
-#: ../src/widgets/gradient-toolbar.cpp:1115
+#: ../src/widgets/gradient-toolbar.cpp:1118
msgid "Reflected"
msgstr "Reflektierend"
@@ -10167,7 +10226,8 @@ msgid "Control handle 0:"
msgstr "Control handle 0:"
#: ../src/live_effects/lpe-lattice2.cpp:47
-msgid "Control handle 0 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 0 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:48
@@ -10175,7 +10235,8 @@ msgid "Control handle 1:"
msgstr "Control handle 1:"
#: ../src/live_effects/lpe-lattice2.cpp:48
-msgid "Control handle 1 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 1 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:49
@@ -10183,7 +10244,8 @@ msgid "Control handle 2:"
msgstr "Control handle 2:"
#: ../src/live_effects/lpe-lattice2.cpp:49
-msgid "Control handle 2 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 2 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:50
@@ -10191,7 +10253,8 @@ msgid "Control handle 3:"
msgstr "Control handle 3:"
#: ../src/live_effects/lpe-lattice2.cpp:50
-msgid "Control handle 3 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 3 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:51
@@ -10199,7 +10262,8 @@ msgid "Control handle 4:"
msgstr "Control handle 4:"
#: ../src/live_effects/lpe-lattice2.cpp:51
-msgid "Control handle 4 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 4 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:52
@@ -10207,7 +10271,8 @@ msgid "Control handle 5:"
msgstr "Control handle 5:"
#: ../src/live_effects/lpe-lattice2.cpp:52
-msgid "Control handle 5 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 5 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:53
@@ -10215,7 +10280,8 @@ msgid "Control handle 6:"
msgstr "Control handle 6:"
#: ../src/live_effects/lpe-lattice2.cpp:53
-msgid "Control handle 6 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 6 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:54
@@ -10223,7 +10289,8 @@ msgid "Control handle 7:"
msgstr "Control handle 7:"
#: ../src/live_effects/lpe-lattice2.cpp:54
-msgid "Control handle 7 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 7 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:55
@@ -10232,7 +10299,9 @@ msgid "Control handle 8x9:"
msgstr "Control handle 8:"
#: ../src/live_effects/lpe-lattice2.cpp:55
-msgid "Control handle 8x9 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 8x9 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:56
@@ -10241,7 +10310,9 @@ msgid "Control handle 10x11:"
msgstr "Control handle 10:"
#: ../src/live_effects/lpe-lattice2.cpp:56
-msgid "Control handle 10x11 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 10x11 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:57
@@ -10249,7 +10320,9 @@ msgid "Control handle 12:"
msgstr "Control handle 12:"
#: ../src/live_effects/lpe-lattice2.cpp:57
-msgid "Control handle 12 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 12 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:58
@@ -10257,7 +10330,9 @@ msgid "Control handle 13:"
msgstr "Control handle 13:"
#: ../src/live_effects/lpe-lattice2.cpp:58
-msgid "Control handle 13 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 13 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:59
@@ -10265,7 +10340,9 @@ msgid "Control handle 14:"
msgstr "Control handle 14:"
#: ../src/live_effects/lpe-lattice2.cpp:59
-msgid "Control handle 14 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 14 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:60
@@ -10273,7 +10350,9 @@ msgid "Control handle 15:"
msgstr "Control handle 15:"
#: ../src/live_effects/lpe-lattice2.cpp:60
-msgid "Control handle 15 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 15 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:61
@@ -10282,7 +10361,9 @@ msgid "Control handle 16:"
msgstr "Control handle 1:"
#: ../src/live_effects/lpe-lattice2.cpp:61
-msgid "Control handle 16 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 16 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:62
@@ -10291,7 +10372,9 @@ msgid "Control handle 17:"
msgstr "Control handle 1:"
#: ../src/live_effects/lpe-lattice2.cpp:62
-msgid "Control handle 17 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 17 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:63
@@ -10300,7 +10383,9 @@ msgid "Control handle 18:"
msgstr "Control handle 1:"
#: ../src/live_effects/lpe-lattice2.cpp:63
-msgid "Control handle 18 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 18 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:64
@@ -10309,7 +10394,9 @@ msgid "Control handle 19:"
msgstr "Control handle 1:"
#: ../src/live_effects/lpe-lattice2.cpp:64
-msgid "Control handle 19 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 19 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:65
@@ -10318,7 +10405,9 @@ msgid "Control handle 20x21:"
msgstr "Control handle 2:"
#: ../src/live_effects/lpe-lattice2.cpp:65
-msgid "Control handle 20x21 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 20x21 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:66
@@ -10327,7 +10416,9 @@ msgid "Control handle 22x23:"
msgstr "Control handle 2:"
#: ../src/live_effects/lpe-lattice2.cpp:66
-msgid "Control handle 22x23 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 22x23 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:67
@@ -10336,7 +10427,9 @@ msgid "Control handle 24x26:"
msgstr "Control handle 2:"
#: ../src/live_effects/lpe-lattice2.cpp:67
-msgid "Control handle 24x26 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 24x26 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:68
@@ -10345,7 +10438,9 @@ msgid "Control handle 25x27:"
msgstr "Control handle 2:"
#: ../src/live_effects/lpe-lattice2.cpp:68
-msgid "Control handle 25x27 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 25x27 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:69
@@ -10354,7 +10449,9 @@ msgid "Control handle 28x30:"
msgstr "Control handle 2:"
#: ../src/live_effects/lpe-lattice2.cpp:69
-msgid "Control handle 28x30 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 28x30 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:70
@@ -10363,7 +10460,9 @@ msgid "Control handle 29x31:"
msgstr "Control handle 2:"
#: ../src/live_effects/lpe-lattice2.cpp:70
-msgid "Control handle 29x31 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 29x31 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
msgstr ""
#: ../src/live_effects/lpe-lattice2.cpp:71
@@ -10372,10 +10471,12 @@ msgid "Control handle 32x33x34x35:"
msgstr "Control handle 3:"
#: ../src/live_effects/lpe-lattice2.cpp:71
-msgid "Control handle 32x33x34x35 - Ctrl+Alt+Click to reset"
+msgid ""
+"Control handle 32x33x34x35 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move "
+"along axes"
msgstr ""
-#: ../src/live_effects/lpe-lattice2.cpp:221
+#: ../src/live_effects/lpe-lattice2.cpp:224
#, fuzzy
msgid "Reset grid"
msgstr "Gitter entfernen"
@@ -10505,8 +10606,11 @@ msgid "Top Left"
msgstr "Oben und Links"
#: ../src/live_effects/lpe-perspective-envelope.cpp:47
-msgid "Top Left - Ctrl+Alt+Click to reset"
+#, fuzzy
+msgid "Top Left - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
msgstr ""
+"<b>Alt</b>: AnfasserlÀnge fixieren; <b>Strg+Alt</b>: Entlang der Anfasser "
+"verschieben"
#: ../src/live_effects/lpe-perspective-envelope.cpp:48
#, fuzzy
@@ -10514,8 +10618,11 @@ msgid "Top Right"
msgstr "Oben und Rechts"
#: ../src/live_effects/lpe-perspective-envelope.cpp:48
-msgid "Top Right - Ctrl+Alt+Click to reset"
+#, fuzzy
+msgid "Top Right - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
msgstr ""
+"<b>Alt</b>: AnfasserlÀnge fixieren; <b>Strg+Alt</b>: Entlang der Anfasser "
+"verschieben"
#: ../src/live_effects/lpe-perspective-envelope.cpp:49
#, fuzzy
@@ -10523,8 +10630,11 @@ msgid "Down Left"
msgstr "Oben und Links"
#: ../src/live_effects/lpe-perspective-envelope.cpp:49
-msgid "Down Left - Ctrl+Alt+Click to reset"
+#, fuzzy
+msgid "Down Left - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
msgstr ""
+"<b>Alt</b>: AnfasserlÀnge fixieren; <b>Strg+Alt</b>: Entlang der Anfasser "
+"verschieben"
#: ../src/live_effects/lpe-perspective-envelope.cpp:50
#, fuzzy
@@ -10532,8 +10642,11 @@ msgid "Down Right"
msgstr "Rechts"
#: ../src/live_effects/lpe-perspective-envelope.cpp:50
-msgid "Down Right - Ctrl+Alt+Click to reset"
+#, fuzzy
+msgid "Down Right - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
msgstr ""
+"<b>Alt</b>: AnfasserlÀnge fixieren; <b>Strg+Alt</b>: Entlang der Anfasser "
+"verschieben"
#: ../src/live_effects/lpe-perspective-envelope.cpp:257
#, fuzzy
@@ -10990,67 +11103,66 @@ msgid ""
"you are applying it to. If this is not what you want, click Cancel."
msgstr ""
-#: ../src/live_effects/lpe-simplify.cpp:29
+#: ../src/live_effects/lpe-simplify.cpp:30
#, fuzzy
msgid "Steps:"
msgstr "Schritte:"
-#: ../src/live_effects/lpe-simplify.cpp:29
+#: ../src/live_effects/lpe-simplify.cpp:30
#, fuzzy
msgid "Change number of simplify steps "
msgstr "Stern: Anzahl der Ecken Àndern"
-#: ../src/live_effects/lpe-simplify.cpp:30
+#: ../src/live_effects/lpe-simplify.cpp:31
#, fuzzy
msgid "Roughly threshold:"
msgstr "Schwellwert:"
-#: ../src/live_effects/lpe-simplify.cpp:31
-#, fuzzy
-msgid "Helper size:"
-msgstr "AnfassergrĂ¶ĂŸe:"
-
-#: ../src/live_effects/lpe-simplify.cpp:31
+#: ../src/live_effects/lpe-simplify.cpp:32
#, fuzzy
-msgid "Helper size"
-msgstr "AnfassergrĂ¶ĂŸe:"
+msgid "Smooth angles:"
+msgstr "Glattheit:"
#: ../src/live_effects/lpe-simplify.cpp:32
+msgid "Max degree difference on handles to preform a smooth"
+msgstr ""
+
+#: ../src/live_effects/lpe-simplify.cpp:34
#, fuzzy
msgid "Helper nodes"
msgstr "Knoten löschen"
-#: ../src/live_effects/lpe-simplify.cpp:32
+#: ../src/live_effects/lpe-simplify.cpp:34
#, fuzzy
msgid "Show helper nodes"
msgstr "Knoten absenken"
-#: ../src/live_effects/lpe-simplify.cpp:34
+#: ../src/live_effects/lpe-simplify.cpp:36
#, fuzzy
msgid "Helper handles"
msgstr "Anfasser skalieren"
-#: ../src/live_effects/lpe-simplify.cpp:34
+#: ../src/live_effects/lpe-simplify.cpp:36
#, fuzzy
msgid "Show helper handles"
msgstr "Anfasser zeigen"
-#: ../src/live_effects/lpe-simplify.cpp:36
+#: ../src/live_effects/lpe-simplify.cpp:38
#, fuzzy
msgid "Paths separately"
msgstr "GrĂ¶ĂŸe getrennt einfĂŒgen"
-#: ../src/live_effects/lpe-simplify.cpp:36
+#: ../src/live_effects/lpe-simplify.cpp:38
#, fuzzy
msgid "Simplifying paths (separately)"
msgstr "Vereinfache Pfade (getrennt):"
-#: ../src/live_effects/lpe-simplify.cpp:38
+#: ../src/live_effects/lpe-simplify.cpp:40
#, fuzzy
msgid "Just coalesce"
msgstr "Nur Werkzeuge ĂŒberprĂŒfen"
-#: ../src/live_effects/lpe-simplify.cpp:38
+#: ../src/live_effects/lpe-simplify.cpp:40
#, fuzzy
msgid "Simplify just coalesce"
msgstr "Farben vereinfachen"
@@ -11368,7 +11480,7 @@ msgid "Select original"
msgstr "Original auswÀhlen"
#: ../src/live_effects/parameter/originalpatharray.cpp:94
-#: ../src/widgets/gradient-toolbar.cpp:1202
+#: ../src/widgets/gradient-toolbar.cpp:1205
msgid "Reverse"
msgstr "Umkehren"
@@ -11384,13 +11496,13 @@ msgid "Remove Path"
msgstr "Von Pfad _trennen"
#: ../src/live_effects/parameter/originalpatharray.cpp:183
-#: ../src/ui/dialog/objects.cpp:1847
+#: ../src/ui/dialog/objects.cpp:1823
#, fuzzy
msgid "Move Down"
msgstr "Verschiebungsmodus"
#: ../src/live_effects/parameter/originalpatharray.cpp:195
-#: ../src/ui/dialog/objects.cpp:1862
+#: ../src/ui/dialog/objects.cpp:1831
#, fuzzy
msgid "Move Up"
msgstr "Pfad verschieben"
@@ -11434,8 +11546,7 @@ msgstr "Mit Pfad aus der Zwischenablage verknĂŒpfen"
msgid "Paste path parameter"
msgstr "Pfadparameter einfĂŒgen"
-#: ../src/live_effects/parameter/point.cpp:89
-#: ../src/live_effects/parameter/pointreseteable.cpp:103
+#: ../src/live_effects/parameter/point.cpp:103
msgid "Change point parameter"
msgstr "Punktparameter Àndern"
@@ -11476,13 +11587,13 @@ msgstr "Einheitenparameter Àndern"
#, c-format
msgid "Unable to find verb ID '%s' specified on the command line.\n"
msgstr ""
-"Kann Verben-Kennung »%s«, die per Kommandozeile ĂŒbergeben wurde, nicht "
+"Kann Verben-Kennung „%s“, die per Kommandozeile ĂŒbergeben wurde, nicht "
"finden.\n"
#: ../src/main-cmdlineact.cpp:60
#, c-format
msgid "Unable to find node ID: '%s'\n"
-msgstr "Kann Knoten-Kennung »%s« nicht finden.\n"
+msgstr "Kann Knoten-Kennung „%s“ nicht finden.\n"
#: ../src/main.cpp:295
msgid "Print the Inkscape version number"
@@ -11496,7 +11607,7 @@ msgstr "X-Server nicht verwenden (Dateien nur mittels Konsole verarbeiten)"
msgid "Try to use X server (even if $DISPLAY is not set)"
msgstr ""
"Versuche, den X-Server zu verwenden (auch wenn die Umgebungsvariable "
-"»$DISPLAY« nicht gesetzt wurde)"
+"„$DISPLAY“ nicht gesetzt wurde)"
#: ../src/main.cpp:310
msgid "Open specified document(s) (option string may be excluded)"
@@ -11512,7 +11623,7 @@ msgstr "DATEINAME"
#: ../src/main.cpp:315
msgid "Print document(s) to specified output file (use '| program' for pipe)"
msgstr ""
-"Dokumente in angegebene Ausgabedatei drucken (verwenden Sie »| Programm« zur "
+"Dokumente in angegebene Ausgabedatei drucken (verwenden Sie „| Programm“ zur "
"Weiterleitung)"
#: ../src/main.cpp:320
@@ -11538,7 +11649,7 @@ msgid ""
"corner)"
msgstr ""
"Exportierter Bereich in SVG-Benutzereinheiten (Vorgabe: gesamte "
-"ZeichenflÀche, »0,0« ist die untere linke Ecke)"
+"ZeichenflĂ€che, „0,0“ ist die untere linke Ecke)"
#: ../src/main.cpp:331
msgid "x0:y0:x1:y1"
@@ -11805,100 +11916,95 @@ msgstr ""
msgid "_File"
msgstr "_Datei"
-#. Tag
-#: ../src/menus-skeleton.h:17 ../src/verbs.cpp:2726
-msgid "_New"
-msgstr "_Neu"
-
#. " <verb verb-id=\"FileExportToOCAL\" />\n"
#. " <verb verb-id=\"DialogMetadata\" />\n"
-#: ../src/menus-skeleton.h:43 ../src/verbs.cpp:2713 ../src/verbs.cpp:2721
+#: ../src/menus-skeleton.h:41 ../src/verbs.cpp:2713 ../src/verbs.cpp:2721
msgid "_Edit"
msgstr "_Bearbeiten"
-#: ../src/menus-skeleton.h:53 ../src/verbs.cpp:2477
+#: ../src/menus-skeleton.h:51 ../src/verbs.cpp:2477
msgid "Paste Si_ze"
msgstr "_GrĂ¶ĂŸe einfĂŒgen"
-#: ../src/menus-skeleton.h:65
+#: ../src/menus-skeleton.h:63
msgid "Clo_ne"
msgstr "_Klonen"
-#: ../src/menus-skeleton.h:79
+#: ../src/menus-skeleton.h:77
msgid "Select Sa_me"
msgstr "Das Gleiche auswÀhlen"
-#: ../src/menus-skeleton.h:97
+#: ../src/menus-skeleton.h:95
msgid "_View"
msgstr "_Ansicht"
-#: ../src/menus-skeleton.h:98
+#: ../src/menus-skeleton.h:96
msgid "_Zoom"
msgstr "_Zoomfaktor"
-#: ../src/menus-skeleton.h:114
+#: ../src/menus-skeleton.h:112
msgid "_Display mode"
msgstr "_Anzeigemodus"
#. Better location in menu needs to be found
#. " <verb verb-id=\"ViewModePrintColorsPreview\" radio=\"yes\"/>\n"
#. " <verb verb-id=\"DialogPrintColorsPreview\" />\n"
-#: ../src/menus-skeleton.h:123
+#: ../src/menus-skeleton.h:121
msgid "_Color display mode"
msgstr "Farb-Anzeigemodus"
#. Better location in menu needs to be found
#. " <verb verb-id=\"ViewColorModePrintColorsPreview\" radio=\"yes\"/>\n"
#. " <verb verb-id=\"DialogPrintColorsPreview\" />\n"
-#: ../src/menus-skeleton.h:136
+#: ../src/menus-skeleton.h:134
msgid "Sh_ow/Hide"
msgstr "Anzeigen/Ausblenden"
#. Not quite ready to be in the menus.
#. " <verb verb-id=\"FocusToggle\" />\n"
-#: ../src/menus-skeleton.h:156
+#: ../src/menus-skeleton.h:154
msgid "_Layer"
msgstr "_Ebene"
-#: ../src/menus-skeleton.h:180
+#: ../src/menus-skeleton.h:178
msgid "_Object"
msgstr "_Objekt"
-#: ../src/menus-skeleton.h:191
+#: ../src/menus-skeleton.h:189
msgid "Cli_p"
msgstr "Ausschneide_pfad"
-#: ../src/menus-skeleton.h:195
+#: ../src/menus-skeleton.h:193
msgid "Mas_k"
msgstr "_Maskierung"
-#: ../src/menus-skeleton.h:199
+#: ../src/menus-skeleton.h:197
msgid "Patter_n"
msgstr "M_uster"
-#: ../src/menus-skeleton.h:223
+#: ../src/menus-skeleton.h:221
msgid "_Path"
msgstr "_Pfad"
-#: ../src/menus-skeleton.h:251 ../src/ui/dialog/find.cpp:77
+#: ../src/menus-skeleton.h:249 ../src/ui/dialog/find.cpp:78
#: ../src/ui/dialog/text-edit.cpp:71
msgid "_Text"
msgstr "_Text"
# !!!
-#: ../src/menus-skeleton.h:269
+#: ../src/menus-skeleton.h:267
msgid "Filter_s"
msgstr "_Filter"
-#: ../src/menus-skeleton.h:275
+#: ../src/menus-skeleton.h:273
msgid "Exte_nsions"
msgstr "E_rweiterungen"
-#: ../src/menus-skeleton.h:281
+#: ../src/menus-skeleton.h:279
msgid "_Help"
msgstr "_Hilfe"
-#: ../src/menus-skeleton.h:285
+#: ../src/menus-skeleton.h:283
msgid "Tutorials"
msgstr "EinfĂŒhrungen"
@@ -11968,11 +12074,11 @@ msgstr "Pfadrichtung umkehren"
msgid "<b>No paths</b> to reverse in the selection."
msgstr "Die Auswahl enthÀlt <b>keine Pfade</b> zum Umkehren."
-#: ../src/persp3d.cpp:333
+#: ../src/persp3d.cpp:323
msgid "Toggle vanishing point"
msgstr "Fluchtpunkt umschalten"
-#: ../src/persp3d.cpp:344
+#: ../src/persp3d.cpp:334
msgid "Toggle multiple vanishing points"
msgstr "Multiple Fluchtpunkte umschalten"
@@ -12089,8 +12195,10 @@ msgstr "FreeArt"
msgid "Open Font License"
msgstr "Open-Font-Lizenz"
+#. Create the Title label and edit control
#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/linking.html#AElementXLinkTitleAttribute
-#: ../src/rdf.cpp:235 ../src/ui/dialog/object-attributes.cpp:57
+#: ../src/rdf.cpp:235 ../src/ui/dialog/filedialogimpl-win32.cpp:1952
+#: ../src/ui/dialog/object-attributes.cpp:57
msgid "Title:"
msgstr "Titel:"
@@ -12240,7 +12348,7 @@ msgstr "Fragment:"
#: ../src/rdf.cpp:296
msgid "XML fragment for the RDF 'License' section"
-msgstr "XML-Fragment fĂŒr den RDF-Abschnitt »Lizenz«"
+msgstr "XML-Fragment fĂŒr den RDF-Abschnitt „Lizenz“"
#: ../src/resource-manager.cpp:332
msgid "Fixup broken links"
@@ -12256,11 +12364,11 @@ msgstr "Es wurde <b>nichts</b> gelöscht."
#: ../src/selection-chemistry.cpp:433
#: ../src/ui/dialog/calligraphic-profile-rename.cpp:75
-#: ../src/ui/dialog/swatches.cpp:277 ../src/ui/tools/text-tool.cpp:974
+#: ../src/ui/dialog/swatches.cpp:277 ../src/ui/tools/text-tool.cpp:965
#: ../src/widgets/eraser-toolbar.cpp:93
-#: ../src/widgets/gradient-toolbar.cpp:1178
-#: ../src/widgets/gradient-toolbar.cpp:1192
-#: ../src/widgets/gradient-toolbar.cpp:1206
+#: ../src/widgets/gradient-toolbar.cpp:1181
+#: ../src/widgets/gradient-toolbar.cpp:1195
+#: ../src/widgets/gradient-toolbar.cpp:1209
#: ../src/widgets/node-toolbar.cpp:401
msgid "Delete"
msgstr "Löschen"
@@ -12291,7 +12399,7 @@ msgstr ""
msgid "<b>No groups</b> to ungroup in the selection."
msgstr "<b>Keine Gruppe</b> zum Aufheben in dieser Auswahl."
-#: ../src/selection-chemistry.cpp:874 ../src/sp-item-group.cpp:571
+#: ../src/selection-chemistry.cpp:874 ../src/sp-item-group.cpp:575
msgid "Ungroup"
msgstr "Gruppierung aufheben"
@@ -12390,145 +12498,145 @@ msgstr "GrĂ¶ĂŸe einfĂŒgen"
msgid "Paste size separately"
msgstr "GrĂ¶ĂŸe getrennt einfĂŒgen"
-#: ../src/selection-chemistry.cpp:1330
+#: ../src/selection-chemistry.cpp:1349
msgid "Select <b>object(s)</b> to move to the layer above."
msgstr ""
"<b>Objekt(e)</b> auswÀhlen, welche eine Ebene weiter nach oben verschoben "
"werden sollen."
-#: ../src/selection-chemistry.cpp:1356
+#: ../src/selection-chemistry.cpp:1376
msgid "Raise to next layer"
msgstr "Auf nÀchste Ebene anheben"
-#: ../src/selection-chemistry.cpp:1363
+#: ../src/selection-chemistry.cpp:1383
msgid "No more layers above."
msgstr "Keine weiteren Ebenen ĂŒber dieser."
-#: ../src/selection-chemistry.cpp:1375
+#: ../src/selection-chemistry.cpp:1395
msgid "Select <b>object(s)</b> to move to the layer below."
msgstr ""
"<b>Objekt(e)</b> auswÀhlen, welche in die Ebene darunter verschoben werden "
"sollen."
-#: ../src/selection-chemistry.cpp:1401
+#: ../src/selection-chemistry.cpp:1422
msgid "Lower to previous layer"
msgstr "Zur nÀchsten Ebene absenken"
-#: ../src/selection-chemistry.cpp:1408
+#: ../src/selection-chemistry.cpp:1429
msgid "No more layers below."
msgstr "Keine weiteren Ebenen unter dieser."
-#: ../src/selection-chemistry.cpp:1420
+#: ../src/selection-chemistry.cpp:1441
msgid "Select <b>object(s)</b> to move."
msgstr "<b>Objekt(e)</b> zum Verschieben auswÀhlen."
-#: ../src/selection-chemistry.cpp:1437 ../src/verbs.cpp:2656
+#: ../src/selection-chemistry.cpp:1459 ../src/verbs.cpp:2656
msgid "Move selection to layer"
msgstr "Auswahl zur Ebene verschieben"
#. An SVG element cannot have a transform. We could change 'x' and 'y' in response
#. to a translation... but leave that for another day.
-#: ../src/selection-chemistry.cpp:1527 ../src/seltrans.cpp:388
+#: ../src/selection-chemistry.cpp:1549 ../src/seltrans.cpp:388
msgid "Cannot transform an embedded SVG."
msgstr "Kann ein eingebettetes SVG nicht verÀndern."
-#: ../src/selection-chemistry.cpp:1698
+#: ../src/selection-chemistry.cpp:1720
msgid "Remove transform"
msgstr "Transformationen zurĂŒcksetzen"
-#: ../src/selection-chemistry.cpp:1805
+#: ../src/selection-chemistry.cpp:1827
msgid "Rotate 90° CCW"
msgstr "90° gegen den Uhrzeigersinn drehen"
-#: ../src/selection-chemistry.cpp:1805
+#: ../src/selection-chemistry.cpp:1827
msgid "Rotate 90° CW"
msgstr "90° im Uhrzeigersinn drehen"
-#: ../src/selection-chemistry.cpp:1826 ../src/seltrans.cpp:483
+#: ../src/selection-chemistry.cpp:1848 ../src/seltrans.cpp:483
#: ../src/ui/dialog/transformation.cpp:893
msgid "Rotate"
msgstr "Drehen"
-#: ../src/selection-chemistry.cpp:2214
+#: ../src/selection-chemistry.cpp:2204
msgid "Rotate by pixels"
msgstr "Um Pixel rotieren"
-#: ../src/selection-chemistry.cpp:2244 ../src/seltrans.cpp:480
+#: ../src/selection-chemistry.cpp:2234 ../src/seltrans.cpp:480
#: ../src/ui/dialog/transformation.cpp:868
#: ../share/extensions/interp_att_g.inx.h:12
msgid "Scale"
msgstr "Skalieren"
-#: ../src/selection-chemistry.cpp:2269
+#: ../src/selection-chemistry.cpp:2259
msgid "Scale by whole factor"
msgstr "Um einen ganzzahligen Faktor skalieren"
-#: ../src/selection-chemistry.cpp:2284
+#: ../src/selection-chemistry.cpp:2274
msgid "Move vertically"
msgstr "Vertikal verschieben"
-#: ../src/selection-chemistry.cpp:2287
+#: ../src/selection-chemistry.cpp:2277
msgid "Move horizontally"
msgstr "Horizontal verschieben"
-#: ../src/selection-chemistry.cpp:2290 ../src/selection-chemistry.cpp:2316
+#: ../src/selection-chemistry.cpp:2280 ../src/selection-chemistry.cpp:2306
#: ../src/seltrans.cpp:477 ../src/ui/dialog/transformation.cpp:806
msgid "Move"
msgstr "Verschieben"
-#: ../src/selection-chemistry.cpp:2310
+#: ../src/selection-chemistry.cpp:2300
msgid "Move vertically by pixels"
msgstr "Vertikal um einzelne Pixel verschieben"
-#: ../src/selection-chemistry.cpp:2313
+#: ../src/selection-chemistry.cpp:2303
msgid "Move horizontally by pixels"
msgstr "Horizontal um einzelne Pixel verschieben"
-#: ../src/selection-chemistry.cpp:2445
+#: ../src/selection-chemistry.cpp:2435
msgid "The selection has no applied path effect."
msgstr "Auf die Selektion ist kein Pfadeffekt angewandt."
-#: ../src/selection-chemistry.cpp:2617 ../src/ui/dialog/clonetiler.cpp:2223
+#: ../src/selection-chemistry.cpp:2607 ../src/ui/dialog/clonetiler.cpp:2223
msgid "Select an <b>object</b> to clone."
msgstr "Zu klonendes <b>Objekt</b> auswÀhlen."
-#: ../src/selection-chemistry.cpp:2653
+#: ../src/selection-chemistry.cpp:2643
msgctxt "Action"
msgid "Clone"
msgstr "Klone"
-#: ../src/selection-chemistry.cpp:2669
+#: ../src/selection-chemistry.cpp:2659
msgid "Select <b>clones</b> to relink."
msgstr "<b>Klon</b> auswĂ€hlen, um wieder zu verknĂŒpfen"
-#: ../src/selection-chemistry.cpp:2676
+#: ../src/selection-chemistry.cpp:2666
msgid "Copy an <b>object</b> to clipboard to relink clones to."
msgstr "Kopiert ein <b>Objekt</b> in die Ablage als Elter fĂŒr Klone."
-#: ../src/selection-chemistry.cpp:2699
+#: ../src/selection-chemistry.cpp:2689
msgid "<b>No clones to relink</b> in the selection."
msgstr ""
"<b>Keine Klone</b> in der Auswahl, deren VerknĂŒpfung erneut gesetzt werden "
"kann."
-#: ../src/selection-chemistry.cpp:2702
+#: ../src/selection-chemistry.cpp:2692
msgid "Relink clone"
msgstr "Klon wiederverbinden"
-#: ../src/selection-chemistry.cpp:2716
+#: ../src/selection-chemistry.cpp:2706
msgid "Select <b>clones</b> to unlink."
msgstr "<b>Klon</b> auswĂ€hlen, dessen VerknĂŒpfung aufgehoben werden soll."
-#: ../src/selection-chemistry.cpp:2772
+#: ../src/selection-chemistry.cpp:2762
msgid "<b>No clones to unlink</b> in the selection."
msgstr ""
"<b>Keine Klone</b> in der Auswahl, deren VerknĂŒpfung aufgehoben werden kann."
-#: ../src/selection-chemistry.cpp:2776
+#: ../src/selection-chemistry.cpp:2766
msgid "Unlink clone"
msgstr "Klonverbindung auftrennen"
-#: ../src/selection-chemistry.cpp:2789
+#: ../src/selection-chemistry.cpp:2779
msgid ""
"Select a <b>clone</b> to go to its original. Select a <b>linked offset</b> "
"to go to its source. Select a <b>text on path</b> to go to the path. Select "
@@ -12539,7 +12647,7 @@ msgstr ""
"den Ausgangspfad zu finden. <b>Fließtextpfad</b> auswĂ€hlen, um seinen Rahmen "
"zu finden."
-#: ../src/selection-chemistry.cpp:2837
+#: ../src/selection-chemistry.cpp:2827
msgid ""
"<b>Cannot find</b> the object to select (orphaned clone, offset, textpath, "
"flowed text?)"
@@ -12547,7 +12655,7 @@ msgstr ""
"Gesuchtes Objekt <b>nicht gefunden</b> - vielleicht ist der Klon, der "
"verbundene Versatz, der Textpfad oder der Fließtext verwaist?"
-#: ../src/selection-chemistry.cpp:2843
+#: ../src/selection-chemistry.cpp:2833
msgid ""
"The object you're trying to select is <b>not visible</b> (it is in &lt;"
"defs&gt;)"
@@ -12555,138 +12663,138 @@ msgstr ""
"Dieses Objekt kann nicht ausgewÀhlt werden - es ist <b>unsichtbar</b> und "
"befindet sich in &lt;defs&gt;"
-#: ../src/selection-chemistry.cpp:2932
+#: ../src/selection-chemistry.cpp:2922
#, fuzzy
msgid "Select path(s) to fill."
msgstr "<b>Pfad</b> zum Vereinfachen auswÀhlen."
-#: ../src/selection-chemistry.cpp:2950
+#: ../src/selection-chemistry.cpp:2940
msgid "Select <b>object(s)</b> to convert to marker."
msgstr ""
"<b>Objekt(e)</b> auswÀhlen, die in eine Knotenmarkierung umgewandelt werden "
"sollen."
-#: ../src/selection-chemistry.cpp:3025
+#: ../src/selection-chemistry.cpp:3015
msgid "Objects to marker"
msgstr "Objekte zu Knotenmarkierung"
-#: ../src/selection-chemistry.cpp:3050
+#: ../src/selection-chemistry.cpp:3040
msgid "Select <b>object(s)</b> to convert to guides."
msgstr "<b>Objekt(e)</b> auswĂ€hlen, die in FĂŒhrungs umgewandelt werden sollen."
-#: ../src/selection-chemistry.cpp:3073
+#: ../src/selection-chemistry.cpp:3063
msgid "Objects to guides"
msgstr "Objekte zu Hilfslinien"
-#: ../src/selection-chemistry.cpp:3109
+#: ../src/selection-chemistry.cpp:3099
msgid "Select <b>objects</b> to convert to symbol."
msgstr "WĂ€hlen Sie <b>Objekte</b> zum Konvertieren in ein Symbol aus."
-#: ../src/selection-chemistry.cpp:3212
+#: ../src/selection-chemistry.cpp:3202
msgid "Group to symbol"
msgstr "Gruppieren zum Symbol"
-#: ../src/selection-chemistry.cpp:3231
+#: ../src/selection-chemistry.cpp:3221
msgid "Select a <b>symbol</b> to extract objects from."
msgstr "WĂ€hlen Sie ein <b>Symbol</b>, um Objekte daraus zu entnehmen."
-#: ../src/selection-chemistry.cpp:3240
+#: ../src/selection-chemistry.cpp:3230
msgid "Select only one <b>symbol</b> in Symbol dialog to convert to group."
msgstr ""
"WĂ€hlen Sie nur ein<b>Symbol</b> aus, um es in eine Gruppe zu konvertieren."
-#: ../src/selection-chemistry.cpp:3298
+#: ../src/selection-chemistry.cpp:3288
msgid "Group from symbol"
msgstr "Gruppieren vom Symbol"
-#: ../src/selection-chemistry.cpp:3316
+#: ../src/selection-chemistry.cpp:3306
msgid "Select <b>object(s)</b> to convert to pattern."
msgstr ""
"<b>Objekt(e)</b> auswĂ€hlen, die in ein FĂŒllmuster umgewandelt werden sollen."
-#: ../src/selection-chemistry.cpp:3415
+#: ../src/selection-chemistry.cpp:3405
msgid "Objects to pattern"
msgstr "Objekte in FĂŒllmuster umwandeln"
-#: ../src/selection-chemistry.cpp:3431
+#: ../src/selection-chemistry.cpp:3421
msgid "Select an <b>object with pattern fill</b> to extract objects from."
msgstr ""
"Ein <b>Objekt mit MusterfĂŒllung</b> auswĂ€hlen, um die FĂŒllung zu extrahieren."
-#: ../src/selection-chemistry.cpp:3492
+#: ../src/selection-chemistry.cpp:3482
msgid "<b>No pattern fills</b> in the selection."
msgstr "Die Auswahl enthĂ€lt <b>keine MusterfĂŒllung</b>."
-#: ../src/selection-chemistry.cpp:3495
+#: ../src/selection-chemistry.cpp:3485
msgid "Pattern to objects"
msgstr "FĂŒllmuster in Objekte umwandeln"
-#: ../src/selection-chemistry.cpp:3586
+#: ../src/selection-chemistry.cpp:3576
msgid "Select <b>object(s)</b> to make a bitmap copy."
msgstr "<b>Objekt(e) auswÀhlen</b>, um eine Bitmap-Kopie zu erstellen."
-#: ../src/selection-chemistry.cpp:3590
+#: ../src/selection-chemistry.cpp:3580
msgid "Rendering bitmap..."
msgstr "Bitmap wird gerendert..."
-#: ../src/selection-chemistry.cpp:3777
+#: ../src/selection-chemistry.cpp:3767
msgid "Create bitmap"
msgstr "Bitmap erstellen"
-#: ../src/selection-chemistry.cpp:3802 ../src/selection-chemistry.cpp:3921
+#: ../src/selection-chemistry.cpp:3792 ../src/selection-chemistry.cpp:3911
msgid "Select <b>object(s)</b> to create clippath or mask from."
msgstr ""
"<b>Objekt(e)</b> auswÀhlen, um Ausschneidepfad oder Maskierung daraus zu "
"erzeugen."
-#: ../src/selection-chemistry.cpp:3895
+#: ../src/selection-chemistry.cpp:3885
#, fuzzy
msgid "Create Clip Group"
msgstr "_Klon erzeugen"
-#: ../src/selection-chemistry.cpp:3924
+#: ../src/selection-chemistry.cpp:3914
msgid "Select mask object and <b>object(s)</b> to apply clippath or mask to."
msgstr ""
"Maskierungsobjekt und <b>Objekt(e)</b> auswÀhlen, um Ausschneidepfad oder "
"Maskierung darauf anzuwenden."
-#: ../src/selection-chemistry.cpp:4105
+#: ../src/selection-chemistry.cpp:4095
msgid "Set clipping path"
msgstr "Ausschneidepfad setzen"
-#: ../src/selection-chemistry.cpp:4107
+#: ../src/selection-chemistry.cpp:4097
msgid "Set mask"
msgstr "Maskierung setzen"
-#: ../src/selection-chemistry.cpp:4122
+#: ../src/selection-chemistry.cpp:4112
msgid "Select <b>object(s)</b> to remove clippath or mask from."
msgstr ""
"<b>Objekt(e)</b> auswÀhlen, um Ausschneidepfad oder Maskierung davon zu "
"entfernen."
-#: ../src/selection-chemistry.cpp:4242
+#: ../src/selection-chemistry.cpp:4232
msgid "Release clipping path"
msgstr "Ausschneidepfad entfernen"
-#: ../src/selection-chemistry.cpp:4244
+#: ../src/selection-chemistry.cpp:4234
msgid "Release mask"
msgstr "Maskierung entfernen"
-#: ../src/selection-chemistry.cpp:4263
+#: ../src/selection-chemistry.cpp:4253
msgid "Select <b>object(s)</b> to fit canvas to."
msgstr ""
"<b>Objekt(e)</b> auswÀhlen, auf die die ArbeitsflÀche angepasst werden soll."
#. Fit Page
-#: ../src/selection-chemistry.cpp:4283 ../src/verbs.cpp:2992
+#: ../src/selection-chemistry.cpp:4273 ../src/verbs.cpp:2992
msgid "Fit Page to Selection"
msgstr "Seite in Auswahl einpassen"
-#: ../src/selection-chemistry.cpp:4312 ../src/verbs.cpp:2994
+#: ../src/selection-chemistry.cpp:4302 ../src/verbs.cpp:2994
msgid "Fit Page to Drawing"
msgstr "Seite in ZeichnungsgrĂ¶ĂŸe einpassen"
-#: ../src/selection-chemistry.cpp:4333 ../src/verbs.cpp:2996
+#: ../src/selection-chemistry.cpp:4323 ../src/verbs.cpp:2996
msgid "Fit Page to Selection or Drawing"
msgstr "Seite in Auswahl oder ganze Zeichnung einpassen"
@@ -12771,10 +12879,10 @@ msgstr "<b>Umschalt+D</b> zum Finden des Rahmens verwenden"
#: ../src/selection-describer.cpp:236
#, c-format
-msgid "<b>%i</b> objects selected of type %s"
-msgid_plural "<b>%i</b> objects selected of types %s"
-msgstr[0] "<b>%i</b> Objekte des Typs %s ausgewÀhlt"
-msgstr[1] "<b>%i</b> Objekte der Typen %s ausgewÀhlt"
+msgid "<b>%1$i</b> objects selected of type %2$s"
+msgid_plural "<b>%1$i</b> objects selected of types %2$s"
+msgstr[0] "<b>%1$i</b> Objekte des Typs %2$s ausgewÀhlt"
+msgstr[1] "<b>%1$i</b> Objekte der Typen %2$s ausgewÀhlt"
#: ../src/selection-describer.cpp:246
#, c-format
@@ -12889,36 +12997,36 @@ msgstr "WĂ€hlen Sie einen Namen fĂŒr die zu exportierende Datei"
msgid "Select a file to import"
msgstr "WĂ€hlen Sie die zu importierende Datei"
-#: ../src/sp-anchor.cpp:125
+#: ../src/sp-anchor.cpp:111
#, c-format
msgid "to %s"
msgstr "zu %s"
-#: ../src/sp-anchor.cpp:129
+#: ../src/sp-anchor.cpp:115
msgid "without URI"
msgstr "ohne URI"
-#: ../src/sp-ellipse.cpp:373
+#: ../src/sp-ellipse.cpp:344
msgid "Segment"
msgstr "Segment"
-#: ../src/sp-ellipse.cpp:375
+#: ../src/sp-ellipse.cpp:346
msgid "Arc"
msgstr "Bogen"
#. Ellipse
-#: ../src/sp-ellipse.cpp:378 ../src/sp-ellipse.cpp:385
+#: ../src/sp-ellipse.cpp:349 ../src/sp-ellipse.cpp:356
#: ../src/ui/dialog/inkscape-preferences.cpp:412
#: ../src/widgets/pencil-toolbar.cpp:163
msgid "Ellipse"
msgstr "Ellipse"
-#: ../src/sp-ellipse.cpp:382
+#: ../src/sp-ellipse.cpp:353
msgid "Circle"
msgstr "Kreis"
#. TRANSLATORS: "Flow region" is an area where text is allowed to flow
-#: ../src/sp-flowregion.cpp:195
+#: ../src/sp-flowregion.cpp:181
msgid "Flow Region"
msgstr "Fließtextbereich"
@@ -12926,44 +13034,44 @@ msgstr "Fließtextbereich"
#. * flow excluded region. flowRegionExclude in SVG 1.2: see
#. * http://www.w3.org/TR/2004/WD-SVG12-20041027/flow.html#flowRegion-elem and
#. * http://www.w3.org/TR/2004/WD-SVG12-20041027/flow.html#flowRegionExclude-elem.
-#: ../src/sp-flowregion.cpp:348
+#: ../src/sp-flowregion.cpp:334
msgid "Flow Excluded Region"
msgstr "Ausgeschlossenen Bereich umfließen"
-#: ../src/sp-flowtext.cpp:290
+#: ../src/sp-flowtext.cpp:280
msgid "Flowed Text"
msgstr "Fließtext"
-#: ../src/sp-flowtext.cpp:292
+#: ../src/sp-flowtext.cpp:282
msgid "Linked Flowed Text"
msgstr "VerknĂŒpfter Fließtext"
-#: ../src/sp-flowtext.cpp:298 ../src/sp-text.cpp:381
-#: ../src/ui/tools/text-tool.cpp:1566
+#: ../src/sp-flowtext.cpp:288 ../src/sp-text.cpp:367
+#: ../src/ui/tools/text-tool.cpp:1557
msgid " [truncated]"
msgstr "[abgestumpft}"
-#: ../src/sp-flowtext.cpp:300
+#: ../src/sp-flowtext.cpp:290
#, c-format
msgid "(%d character%s)"
msgid_plural "(%d characters%s)"
msgstr[0] "(%d Zeichen%s)"
msgstr[1] "(%d Zeichen%s)"
-#: ../src/sp-guide.cpp:249
+#: ../src/sp-guide.cpp:246
msgid "Create Guides Around the Page"
-msgstr "FĂŒhrungslinien an SeitenrĂ€ndern erstellen"
+msgstr "Hilfslinien an SeitenrÀndern erstellen"
-#: ../src/sp-guide.cpp:261 ../src/verbs.cpp:2549
+#: ../src/sp-guide.cpp:258 ../src/verbs.cpp:2549
msgid "Delete All Guides"
-msgstr "FĂŒhrungslinien löschen"
+msgstr "Hilfslinien löschen"
#. Guide has probably been deleted and no longer has an attached namedview.
-#: ../src/sp-guide.cpp:448
+#: ../src/sp-guide.cpp:445
msgid "Deleted"
msgstr "Gelöscht"
-#: ../src/sp-guide.cpp:457
+#: ../src/sp-guide.cpp:454
msgid ""
"<b>Shift+drag</b> to rotate, <b>Ctrl+drag</b> to move origin, <b>Del</b> to "
"delete"
@@ -12971,48 +13079,48 @@ msgstr ""
"<b>Umschalt+Ziehen</b> rotiert, <b>Strg+Ziehen</b> bewegt Ursprung, <b>Entf</"
"b> löscht."
-#: ../src/sp-guide.cpp:461
+#: ../src/sp-guide.cpp:458
#, c-format
msgid "vertical, at %s"
-msgstr "Vertikale FĂŒhrungslinie bei %s"
+msgstr "Vertikale Hilfslinie bei %s"
-#: ../src/sp-guide.cpp:464
+#: ../src/sp-guide.cpp:461
#, c-format
msgid "horizontal, at %s"
-msgstr "Horizontale FĂŒhrungslinie bei %s"
+msgstr "Horizontale Hilfslinie bei %s"
-#: ../src/sp-guide.cpp:469
+#: ../src/sp-guide.cpp:466
#, c-format
msgid "at %d degrees, through (%s,%s)"
msgstr "bei %d Grad, durch (%s, %s)"
-#: ../src/sp-image.cpp:526
+#: ../src/sp-image.cpp:517
msgid "embedded"
msgstr "eingebettet"
-#: ../src/sp-image.cpp:534
+#: ../src/sp-image.cpp:525
#, c-format
msgid "[bad reference]: %s"
msgstr "[falsche Referenz]: %s"
-#: ../src/sp-image.cpp:535
+#: ../src/sp-image.cpp:526
#, c-format
msgid "%d &#215; %d: %s"
msgstr "%d &#215; %d: %s"
-#: ../src/sp-item-group.cpp:332
+#: ../src/sp-item-group.cpp:322
msgid "Group"
-msgstr "Gruppieren"
+msgstr "Gruppe"
-#: ../src/sp-item-group.cpp:338 ../src/sp-switch.cpp:82
+#: ../src/sp-item-group.cpp:328 ../src/sp-switch.cpp:68
#, c-format
msgid "of <b>%d</b> object"
-msgstr "von <b>%d</b> Objekt"
+msgstr "aus <b>%d</b> Objekt"
-#: ../src/sp-item-group.cpp:338 ../src/sp-switch.cpp:82
+#: ../src/sp-item-group.cpp:328 ../src/sp-switch.cpp:68
#, c-format
msgid "of <b>%d</b> objects"
-msgstr "von <b>%d</b> Objekten"
+msgstr "aus <b>%d</b> Objekten"
#: ../src/sp-item.cpp:1051 ../src/verbs.cpp:214
msgid "Object"
@@ -13038,7 +13146,7 @@ msgstr "%s; <i>gefiltert (%s)</i>"
msgid "%s; <i>filtered</i>"
msgstr "%s; <i>gefiltert</i>"
-#: ../src/sp-line.cpp:126
+#: ../src/sp-line.cpp:113
msgid "Line"
msgstr "Linie"
@@ -13046,103 +13154,103 @@ msgstr "Linie"
msgid "An exception occurred during execution of the Path Effect."
msgstr "Beim ausfĂŒhren des Pfadeffektes ist ein Fehler aufgetreten."
-#: ../src/sp-offset.cpp:339
+#: ../src/sp-offset.cpp:329
msgid "Linked Offset"
msgstr "Verbundener Versatz"
-#: ../src/sp-offset.cpp:341
+#: ../src/sp-offset.cpp:331
msgid "Dynamic Offset"
msgstr "Dynamischer Versatz"
#. TRANSLATORS COMMENT: %s is either "outset" or "inset" depending on sign
-#: ../src/sp-offset.cpp:347
+#: ../src/sp-offset.cpp:337
#, c-format
msgid "%s by %f pt"
msgstr "%s von %f Pkt."
-#: ../src/sp-offset.cpp:348
+#: ../src/sp-offset.cpp:338
msgid "outset"
msgstr "erweitert"
-#: ../src/sp-offset.cpp:348
+#: ../src/sp-offset.cpp:338
msgid "inset"
msgstr "geschrumpft"
-#: ../src/sp-path.cpp:70
+#: ../src/sp-path.cpp:60
msgid "Path"
msgstr "Pfad"
-#: ../src/sp-path.cpp:95
+#: ../src/sp-path.cpp:85
#, c-format
msgid ", path effect: %s"
msgstr ", Pfadeffekt: %s"
-#: ../src/sp-path.cpp:98
+#: ../src/sp-path.cpp:88
#, c-format
msgid "%i node%s"
msgstr "%i Knoten%s"
-#: ../src/sp-path.cpp:98
+#: ../src/sp-path.cpp:88
#, c-format
msgid "%i nodes%s"
msgstr "%i Knoten%s"
# !!!
-#: ../src/sp-polygon.cpp:185
+#: ../src/sp-polygon.cpp:173
msgid "<b>Polygon</b>"
msgstr "<b>Polygon</b>"
# !!!
-#: ../src/sp-polyline.cpp:131
+#: ../src/sp-polyline.cpp:121
msgid "<b>Polyline</b>"
msgstr "<b>Linienzug</b>"
#. Rectangle
-#: ../src/sp-rect.cpp:163 ../src/ui/dialog/inkscape-preferences.cpp:402
+#: ../src/sp-rect.cpp:153 ../src/ui/dialog/inkscape-preferences.cpp:402
msgid "Rectangle"
msgstr "Rechteck"
#. Spiral
-#: ../src/sp-spiral.cpp:230 ../src/ui/dialog/inkscape-preferences.cpp:420
+#: ../src/sp-spiral.cpp:220 ../src/ui/dialog/inkscape-preferences.cpp:420
#: ../share/extensions/gcodetools_area.inx.h:11
msgid "Spiral"
msgstr "Spirale"
#. TRANSLATORS: since turn count isn't an integer, please adjust the
#. string as needed to deal with an localized plural forms.
-#: ../src/sp-spiral.cpp:236
+#: ../src/sp-spiral.cpp:226
#, c-format
msgid "with %3f turns"
msgstr "mit %3f Windungen"
#. Star
-#: ../src/sp-star.cpp:256 ../src/ui/dialog/inkscape-preferences.cpp:416
+#: ../src/sp-star.cpp:246 ../src/ui/dialog/inkscape-preferences.cpp:416
#: ../src/widgets/star-toolbar.cpp:471
msgid "Star"
msgstr "Stern"
-#: ../src/sp-star.cpp:257 ../src/widgets/star-toolbar.cpp:464
+#: ../src/sp-star.cpp:247 ../src/widgets/star-toolbar.cpp:464
msgid "Polygon"
msgstr "Polygon"
#. while there will never be less than 3 vertices, we still need to
#. make calls to ngettext because the pluralization may be different
#. for various numbers >=3. The singular form is used as the index.
-#: ../src/sp-star.cpp:264
+#: ../src/sp-star.cpp:254
#, c-format
msgid "with %d vertex"
msgstr "mit %d Eckpunkt"
-#: ../src/sp-star.cpp:264
+#: ../src/sp-star.cpp:254
#, c-format
msgid "with %d vertices"
msgstr "mit %d Eckpunkten"
-#: ../src/sp-switch.cpp:76
+#: ../src/sp-switch.cpp:62
msgid "Conditional Group"
msgstr "Bedingte Gruppe"
-#: ../src/sp-text.cpp:365 ../src/verbs.cpp:348
+#: ../src/sp-text.cpp:351 ../src/verbs.cpp:348
#: ../share/extensions/lorem_ipsum.inx.h:8
#: ../share/extensions/replace_font.inx.h:11
#: ../share/extensions/split.inx.h:10 ../share/extensions/text_braille.inx.h:2
@@ -13157,56 +13265,56 @@ msgstr "Bedingte Gruppe"
msgid "Text"
msgstr "Text"
-#: ../src/sp-text.cpp:385
+#: ../src/sp-text.cpp:371
#, c-format
msgid "on path%s (%s, %s)"
msgstr "an Pfad%s (%s, %s)"
-#: ../src/sp-text.cpp:386
+#: ../src/sp-text.cpp:372
#, c-format
msgid "%s (%s, %s)"
msgstr "%s (%s, %s)"
-#: ../src/sp-tref.cpp:230
+#: ../src/sp-tref.cpp:218
msgid "Cloned Character Data"
msgstr "Geklonte Zeichendaten"
-#: ../src/sp-tref.cpp:246
+#: ../src/sp-tref.cpp:234
msgid " from "
msgstr " von "
-#: ../src/sp-tref.cpp:252 ../src/sp-use.cpp:281
+#: ../src/sp-tref.cpp:240 ../src/sp-use.cpp:269
msgid "[orphaned]"
msgstr "[verwaist]"
-#: ../src/sp-tspan.cpp:218
+#: ../src/sp-tspan.cpp:203
msgid "Text Span"
msgstr "Textspanne"
-#: ../src/sp-use.cpp:244
+#: ../src/sp-use.cpp:232
msgid "Symbol"
msgstr "Symbol"
-#: ../src/sp-use.cpp:246
+#: ../src/sp-use.cpp:234
msgid "Clone"
msgstr "Klone"
-#: ../src/sp-use.cpp:254 ../src/sp-use.cpp:256 ../src/sp-use.cpp:258
+#: ../src/sp-use.cpp:242 ../src/sp-use.cpp:244 ../src/sp-use.cpp:246
#, c-format
msgid "called %s"
msgstr "%s aufgerufen"
-#: ../src/sp-use.cpp:258
+#: ../src/sp-use.cpp:246
msgid "Unnamed Symbol"
msgstr "Unbenanntes Symbol"
#. TRANSLATORS: Used for statusbar description for long <use> chains:
#. * "Clone of: Clone of: ... in Layer 1".
-#: ../src/sp-use.cpp:267
+#: ../src/sp-use.cpp:255
msgid "..."
msgstr "..."
-#: ../src/sp-use.cpp:276
+#: ../src/sp-use.cpp:264
#, c-format
msgid "of: %s"
msgstr "von: %s"
@@ -13638,7 +13746,7 @@ msgid "Rearrange"
msgstr "Anordnen"
#: ../src/ui/dialog/align-and-distribute.cpp:855
-#: ../src/widgets/toolbox.cpp:1727
+#: ../src/widgets/toolbox.cpp:1729
msgid "Nodes"
msgstr "Knoten"
@@ -14547,19 +14655,19 @@ msgstr ""
msgid "<small>Creating tiled clones...</small>"
msgstr "<small>Geschachtelte Klone erstellen...</small>"
-#: ../src/ui/dialog/clonetiler.cpp:2651
+#: ../src/ui/dialog/clonetiler.cpp:2654
msgid "Create tiled clones"
msgstr "Gekachelte Klone erzeugen"
-#: ../src/ui/dialog/clonetiler.cpp:2884
+#: ../src/ui/dialog/clonetiler.cpp:2887
msgid "<small>Per row:</small>"
msgstr "<small>Pro Reihe:</small>"
-#: ../src/ui/dialog/clonetiler.cpp:2902
+#: ../src/ui/dialog/clonetiler.cpp:2905
msgid "<small>Per column:</small>"
msgstr "<small>Pro Spalte:</small>"
-#: ../src/ui/dialog/clonetiler.cpp:2910
+#: ../src/ui/dialog/clonetiler.cpp:2913
msgid "<small>Randomize:</small>"
msgstr "<small>Zufallsfaktor:</small>"
@@ -14616,66 +14724,66 @@ msgid "Release log messages"
msgstr "Fehlerprotokoll verwerfen"
#: ../src/ui/dialog/document-metadata.cpp:88
-#: ../src/ui/dialog/document-properties.cpp:159
+#: ../src/ui/dialog/document-properties.cpp:166
msgid "Metadata"
msgstr "Metadaten"
#: ../src/ui/dialog/document-metadata.cpp:89
-#: ../src/ui/dialog/document-properties.cpp:160
+#: ../src/ui/dialog/document-properties.cpp:167
msgid "License"
msgstr "Nutzungsbedingungen - Lizenz"
# !!!
#: ../src/ui/dialog/document-metadata.cpp:126
-#: ../src/ui/dialog/document-properties.cpp:1007
+#: ../src/ui/dialog/document-properties.cpp:978
msgid "<b>Dublin Core Entities</b>"
msgstr "<b>Dublin-Core-Entities</b>"
#: ../src/ui/dialog/document-metadata.cpp:168
-#: ../src/ui/dialog/document-properties.cpp:1069
+#: ../src/ui/dialog/document-properties.cpp:1040
msgid "<b>License</b>"
msgstr "<b>Lizenz</b>"
#. ---------------------------------------------------------------
-#: ../src/ui/dialog/document-properties.cpp:111
+#: ../src/ui/dialog/document-properties.cpp:118
msgid "Use antialiasing"
msgstr "KantenglÀttung verwenden"
-#: ../src/ui/dialog/document-properties.cpp:111
+#: ../src/ui/dialog/document-properties.cpp:118
msgid "If unset, no antialiasing will be done on the drawing"
msgstr "Wenn abgewÀhlt, erfolgt keine KantenglÀttung"
-#: ../src/ui/dialog/document-properties.cpp:112
+#: ../src/ui/dialog/document-properties.cpp:119
msgid "Show page _border"
msgstr "_Rand der Seite anzeigen"
-#: ../src/ui/dialog/document-properties.cpp:112
+#: ../src/ui/dialog/document-properties.cpp:119
msgid "If set, rectangular page border is shown"
msgstr "Wenn gesetzt, dann wird ein rechteckiger Seitenrand gezeigt"
-#: ../src/ui/dialog/document-properties.cpp:113
+#: ../src/ui/dialog/document-properties.cpp:120
msgid "Border on _top of drawing"
msgstr "Rand im _Vordergrund anzeigen"
-#: ../src/ui/dialog/document-properties.cpp:113
+#: ../src/ui/dialog/document-properties.cpp:120
msgid "If set, border is always on top of the drawing"
msgstr "Wenn gesetzt, dann ist der Rand immmer im Vordergrund"
-#: ../src/ui/dialog/document-properties.cpp:114
+#: ../src/ui/dialog/document-properties.cpp:121
msgid "_Show border shadow"
msgstr "Rand_schatten anzeigen"
-#: ../src/ui/dialog/document-properties.cpp:114
+#: ../src/ui/dialog/document-properties.cpp:121
msgid "If set, page border shows a shadow on its right and lower side"
msgstr ""
"Wenn gesetzt, dann zeigt der Seitenrand einen Schatten an der rechten und "
"unteren Seite"
-#: ../src/ui/dialog/document-properties.cpp:115
+#: ../src/ui/dialog/document-properties.cpp:122
msgid "Back_ground color:"
msgstr "Hintergrundfarbe:"
-#: ../src/ui/dialog/document-properties.cpp:115
+#: ../src/ui/dialog/document-properties.cpp:122
msgid ""
"Color of the page background. Note: transparency setting ignored while "
"editing but used when exporting to bitmap."
@@ -14684,83 +14792,82 @@ msgstr ""
"wÀhrend der Bearbeitung ignoriert, aber genutzt, wenn es als Bitmap "
"exportiert wird."
-#: ../src/ui/dialog/document-properties.cpp:116
+#: ../src/ui/dialog/document-properties.cpp:123
msgid "Border _color:"
msgstr "_Randfarbe:"
-#: ../src/ui/dialog/document-properties.cpp:116
+#: ../src/ui/dialog/document-properties.cpp:123
msgid "Page border color"
msgstr "Randfarbe der ZeichenflÀche"
-#: ../src/ui/dialog/document-properties.cpp:116
+#: ../src/ui/dialog/document-properties.cpp:123
msgid "Color of the page border"
msgstr "Randfarbe der ZeichenflÀche"
-#: ../src/ui/dialog/document-properties.cpp:117
-#, fuzzy
+#: ../src/ui/dialog/document-properties.cpp:124
msgid "Display _units:"
-msgstr "Gitter-Raster_einheiten:"
+msgstr "Anzeigeeinheiten:"
#. ---------------------------------------------------------------
#. General snap options
-#: ../src/ui/dialog/document-properties.cpp:121
+#: ../src/ui/dialog/document-properties.cpp:128
msgid "Show _guides"
-msgstr "_FĂŒhrungslinien anzeigen"
+msgstr "_Hilfslinien anzeigen"
-#: ../src/ui/dialog/document-properties.cpp:121
+#: ../src/ui/dialog/document-properties.cpp:128
msgid "Show or hide guides"
-msgstr "FĂŒhrungslinien anzeigen oder ausblenden"
+msgstr "Hilfslinien anzeigen oder ausblenden"
-#: ../src/ui/dialog/document-properties.cpp:122
+#: ../src/ui/dialog/document-properties.cpp:129
msgid "Guide co_lor:"
-msgstr "F_arbe der FĂŒhrungslinien:"
+msgstr "F_arbe der Hilfslinien:"
-#: ../src/ui/dialog/document-properties.cpp:122
+#: ../src/ui/dialog/document-properties.cpp:129
msgid "Guideline color"
-msgstr "Farbe der FĂŒhrungslinien"
+msgstr "Farbe der Hilfslinien"
-#: ../src/ui/dialog/document-properties.cpp:122
+#: ../src/ui/dialog/document-properties.cpp:129
msgid "Color of guidelines"
-msgstr "Farbe der FĂŒhrungslinien"
+msgstr "Farbe der Hilfslinien"
-#: ../src/ui/dialog/document-properties.cpp:123
+#: ../src/ui/dialog/document-properties.cpp:130
msgid "_Highlight color:"
msgstr "_Hervorhebungsfarbe:"
-#: ../src/ui/dialog/document-properties.cpp:123
+#: ../src/ui/dialog/document-properties.cpp:130
msgid "Highlighted guideline color"
-msgstr "Farbe der hervorgehobenen FĂŒhrungslinien"
+msgstr "Farbe der hervorgehobenen Hilfslinien"
-#: ../src/ui/dialog/document-properties.cpp:123
+#: ../src/ui/dialog/document-properties.cpp:130
msgid "Color of a guideline when it is under mouse"
-msgstr "Farbe der FĂŒhrungslinie falls unter dem Mauszeiger"
+msgstr "Farbe der Hilfslinie falls unter dem Mauszeiger"
#. ---------------------------------------------------------------
-#: ../src/ui/dialog/document-properties.cpp:125
+#: ../src/ui/dialog/document-properties.cpp:132
msgid "Snap _distance"
msgstr "Einrastabstand"
-#: ../src/ui/dialog/document-properties.cpp:125
+#: ../src/ui/dialog/document-properties.cpp:132
msgid "Snap only when _closer than:"
msgstr "Nur einrasten, wenn _nÀher als:"
-#: ../src/ui/dialog/document-properties.cpp:125
-#: ../src/ui/dialog/document-properties.cpp:130
-#: ../src/ui/dialog/document-properties.cpp:135
+#: ../src/ui/dialog/document-properties.cpp:132
+#: ../src/ui/dialog/document-properties.cpp:137
+#: ../src/ui/dialog/document-properties.cpp:142
msgid "Always snap"
msgstr "Immer einrasten"
-#: ../src/ui/dialog/document-properties.cpp:126
+#: ../src/ui/dialog/document-properties.cpp:133
msgid "Snapping distance, in screen pixels, for snapping to objects"
msgstr "Einrastabstand in Bildschirmpixeln, um an Objekten einzurasten"
-#: ../src/ui/dialog/document-properties.cpp:126
+#: ../src/ui/dialog/document-properties.cpp:133
msgid "Always snap to objects, regardless of their distance"
msgstr ""
"Wenn gesetzt, dann rasten Objekte am nahesten Objekt ein, unabhÀngig von der "
"Entfernung"
-#: ../src/ui/dialog/document-properties.cpp:127
+#: ../src/ui/dialog/document-properties.cpp:134
msgid ""
"If set, objects only snap to another object when it's within the range "
"specified below"
@@ -14769,25 +14876,25 @@ msgstr ""
"definierten Reichweite sind."
#. Options for snapping to grids
-#: ../src/ui/dialog/document-properties.cpp:130
+#: ../src/ui/dialog/document-properties.cpp:137
msgid "Snap d_istance"
msgstr "Einrastabstand:"
-#: ../src/ui/dialog/document-properties.cpp:130
+#: ../src/ui/dialog/document-properties.cpp:137
msgid "Snap only when c_loser than:"
msgstr "Nur einrasten, wenn _nÀher als:"
-#: ../src/ui/dialog/document-properties.cpp:131
+#: ../src/ui/dialog/document-properties.cpp:138
msgid "Snapping distance, in screen pixels, for snapping to grid"
msgstr "Einrastabstand in Bildschirmpixeln, um in das Gitter einzurasten"
-#: ../src/ui/dialog/document-properties.cpp:131
+#: ../src/ui/dialog/document-properties.cpp:138
msgid "Always snap to grids, regardless of the distance"
msgstr ""
"Wenn gesetzt, dann rasten Objekte an der nahesten Gitterslinie ein, "
"unabhÀngig von der Entfernung"
-#: ../src/ui/dialog/document-properties.cpp:132
+#: ../src/ui/dialog/document-properties.cpp:139
msgid ""
"If set, objects only snap to a grid line when it's within the range "
"specified below"
@@ -14796,138 +14903,138 @@ msgstr ""
"Reichweite sind."
#. Options for snapping to guides
-#: ../src/ui/dialog/document-properties.cpp:135
+#: ../src/ui/dialog/document-properties.cpp:142
msgid "Snap dist_ance"
msgstr "Einrastabstand"
-#: ../src/ui/dialog/document-properties.cpp:135
+#: ../src/ui/dialog/document-properties.cpp:142
msgid "Snap only when close_r than:"
msgstr "Nur einrasten, wenn _nÀher als:"
-#: ../src/ui/dialog/document-properties.cpp:136
+#: ../src/ui/dialog/document-properties.cpp:143
msgid "Snapping distance, in screen pixels, for snapping to guides"
-msgstr "Einrastabstand in Bildschirmpixeln, um an FĂŒhrungslinien einzurasten"
+msgstr "Einrastabstand in Bildschirmpixeln, um an Hilfslinien einzurasten"
-#: ../src/ui/dialog/document-properties.cpp:136
+#: ../src/ui/dialog/document-properties.cpp:143
msgid "Always snap to guides, regardless of the distance"
msgstr ""
-"Objekte rasten immer an der nĂ€chsten FĂŒhrungslinie ein, unabhĂ€ngig von der "
+"Objekte rasten immer an der nÀchsten Hilfslinie ein, unabhÀngig von der "
"Entfernung"
-#: ../src/ui/dialog/document-properties.cpp:137
+#: ../src/ui/dialog/document-properties.cpp:144
msgid ""
"If set, objects only snap to a guide when it's within the range specified "
"below"
msgstr ""
-"Nur an FĂŒhrungslinien einrasten, wenn diese innerhalb der unten definierten "
+"Nur an Hilfslinien einrasten, wenn diese innerhalb der unten definierten "
"Reichweite sind."
#. ---------------------------------------------------------------
-#: ../src/ui/dialog/document-properties.cpp:140
+#: ../src/ui/dialog/document-properties.cpp:147
msgid "Snap to clip paths"
msgstr "An Ausschneidepfaden einrasten"
-#: ../src/ui/dialog/document-properties.cpp:140
+#: ../src/ui/dialog/document-properties.cpp:147
msgid "When snapping to paths, then also try snapping to clip paths"
msgstr ""
"Neben dem Einrasten an Pfaden, auch versuchen an Ausschbeidepfaden "
"einzurasten"
-#: ../src/ui/dialog/document-properties.cpp:141
+#: ../src/ui/dialog/document-properties.cpp:148
msgid "Snap to mask paths"
msgstr "An Maskierungspfaden einrasten"
-#: ../src/ui/dialog/document-properties.cpp:141
+#: ../src/ui/dialog/document-properties.cpp:148
msgid "When snapping to paths, then also try snapping to mask paths"
msgstr ""
"Neben dem Einrasten an Pfaden, auch versuchen an Maskierungspfaden "
"einzurasten"
-#: ../src/ui/dialog/document-properties.cpp:142
+#: ../src/ui/dialog/document-properties.cpp:149
msgid "Snap perpendicularly"
msgstr "Senkrecht einrasten"
-#: ../src/ui/dialog/document-properties.cpp:142
+#: ../src/ui/dialog/document-properties.cpp:149
msgid ""
"When snapping to paths or guides, then also try snapping perpendicularly"
msgstr ""
-"Neben dem Einrasten an Pfaden oder FĂŒhrungslinien, auch versuchen senkrecht "
+"Neben dem Einrasten an Pfaden oder Hilfslinien, auch versuchen senkrecht "
"einzurasten"
-#: ../src/ui/dialog/document-properties.cpp:143
+#: ../src/ui/dialog/document-properties.cpp:150
msgid "Snap tangentially"
msgstr "Tangential einrasten"
-#: ../src/ui/dialog/document-properties.cpp:143
+#: ../src/ui/dialog/document-properties.cpp:150
msgid "When snapping to paths or guides, then also try snapping tangentially"
msgstr ""
-"Neben dem Einrasten an Pfaden oder FĂŒhrungslinien, auch versuchen tangential "
+"Neben dem Einrasten an Pfaden oder Hilfslinien, auch versuchen tangential "
"einzurasten"
-#: ../src/ui/dialog/document-properties.cpp:146
+#: ../src/ui/dialog/document-properties.cpp:153
msgctxt "Grid"
msgid "_New"
msgstr "_Neu"
-#: ../src/ui/dialog/document-properties.cpp:146
+#: ../src/ui/dialog/document-properties.cpp:153
msgid "Create new grid."
msgstr "Neues Gitter erzeugen."
-#: ../src/ui/dialog/document-properties.cpp:147
+#: ../src/ui/dialog/document-properties.cpp:154
msgctxt "Grid"
msgid "_Remove"
msgstr "_Entfernen"
-#: ../src/ui/dialog/document-properties.cpp:147
+#: ../src/ui/dialog/document-properties.cpp:154
msgid "Remove selected grid."
msgstr "AusgewÀhltes Gitter entfernen."
-#: ../src/ui/dialog/document-properties.cpp:154
-#: ../src/widgets/toolbox.cpp:1834
+#: ../src/ui/dialog/document-properties.cpp:161
+#: ../src/widgets/toolbox.cpp:1836
msgid "Guides"
-msgstr "FĂŒhrungslinien"
+msgstr "Hilfslinien"
-#: ../src/ui/dialog/document-properties.cpp:156 ../src/verbs.cpp:2827
+#: ../src/ui/dialog/document-properties.cpp:163 ../src/verbs.cpp:2827
msgid "Snap"
msgstr "Einrasten"
-#: ../src/ui/dialog/document-properties.cpp:158
+#: ../src/ui/dialog/document-properties.cpp:165
msgid "Scripting"
msgstr "Skripte"
# !!!
-#: ../src/ui/dialog/document-properties.cpp:322
+#: ../src/ui/dialog/document-properties.cpp:329
msgid "<b>General</b>"
msgstr "<b>Allgemein</b>"
# !!!
-#: ../src/ui/dialog/document-properties.cpp:324
+#: ../src/ui/dialog/document-properties.cpp:331
msgid "<b>Page Size</b>"
msgstr "<b>SeitengrĂ¶ĂŸe</b>"
# !!!
-#: ../src/ui/dialog/document-properties.cpp:326
+#: ../src/ui/dialog/document-properties.cpp:333
msgid "<b>Display</b>"
msgstr "<b>Anzeige</b>"
# !!!
-#: ../src/ui/dialog/document-properties.cpp:361
+#: ../src/ui/dialog/document-properties.cpp:368
msgid "<b>Guides</b>"
-msgstr "<b>FĂŒhrungslinien</b>"
+msgstr "<b>Hilfslinien</b>"
-#: ../src/ui/dialog/document-properties.cpp:379
+#: ../src/ui/dialog/document-properties.cpp:386
msgid "<b>Snap to objects</b>"
msgstr "<b>An Objekten einrasten</b>"
-#: ../src/ui/dialog/document-properties.cpp:381
+#: ../src/ui/dialog/document-properties.cpp:388
msgid "<b>Snap to grids</b>"
msgstr "<b>Am Gitter einrasten</b>"
-#: ../src/ui/dialog/document-properties.cpp:383
+#: ../src/ui/dialog/document-properties.cpp:390
msgid "<b>Snap to guides</b>"
-msgstr "<b>An FĂŒhrungslinien einrasten</b>"
+msgstr "<b>An Hilfslinien einrasten</b>"
-#: ../src/ui/dialog/document-properties.cpp:385
+#: ../src/ui/dialog/document-properties.cpp:392
msgid "<b>Miscellaneous</b>"
msgstr "<b>Verschiedenes</b>"
@@ -14935,136 +15042,136 @@ msgstr "<b>Verschiedenes</b>"
#. Inkscape::GC::release(defsRepr);
#. inform the document, so we can undo
#. Color Management
-#: ../src/ui/dialog/document-properties.cpp:498 ../src/verbs.cpp:3008
+#: ../src/ui/dialog/document-properties.cpp:505 ../src/verbs.cpp:3008
msgid "Link Color Profile"
msgstr "Farb-Profil verknĂŒpfen"
-#: ../src/ui/dialog/document-properties.cpp:599
+#: ../src/ui/dialog/document-properties.cpp:606
msgid "Remove linked color profile"
msgstr "VerknĂŒpftes Farb-Profil entfernen"
-#: ../src/ui/dialog/document-properties.cpp:613
+#: ../src/ui/dialog/document-properties.cpp:620
msgid "<b>Linked Color Profiles:</b>"
msgstr "<b>VerknĂŒpfte Farb-Profile:</b>"
-#: ../src/ui/dialog/document-properties.cpp:615
+#: ../src/ui/dialog/document-properties.cpp:622
msgid "<b>Available Color Profiles:</b>"
msgstr "<b>VerfĂŒgbare Farb-Profile:</b>"
-#: ../src/ui/dialog/document-properties.cpp:617
+#: ../src/ui/dialog/document-properties.cpp:624
msgid "Link Profile"
msgstr "Profil verknĂŒpfen"
-#: ../src/ui/dialog/document-properties.cpp:626
+#: ../src/ui/dialog/document-properties.cpp:627
msgid "Unlink Profile"
msgstr "Profil entknĂŒpfen"
-#: ../src/ui/dialog/document-properties.cpp:710
+#: ../src/ui/dialog/document-properties.cpp:705
msgid "Profile Name"
msgstr "Profil-Name"
-#: ../src/ui/dialog/document-properties.cpp:746
+#: ../src/ui/dialog/document-properties.cpp:741
msgid "External scripts"
msgstr "Externe Scripte"
-#: ../src/ui/dialog/document-properties.cpp:747
+#: ../src/ui/dialog/document-properties.cpp:742
msgid "Embedded scripts"
msgstr "Eingebettete Scripte"
-#: ../src/ui/dialog/document-properties.cpp:752
+#: ../src/ui/dialog/document-properties.cpp:747
msgid "<b>External script files:</b>"
msgstr "<b>Externe Script-Dateien:</b>"
-#: ../src/ui/dialog/document-properties.cpp:754
+#: ../src/ui/dialog/document-properties.cpp:749
msgid "Add the current file name or browse for a file"
msgstr ""
"FĂŒgen Sie den aktuellen Dateinamen hinzu oder suchen Sie nach einer Datei"
-#: ../src/ui/dialog/document-properties.cpp:763
-#: ../src/ui/dialog/document-properties.cpp:852
+#: ../src/ui/dialog/document-properties.cpp:752
+#: ../src/ui/dialog/document-properties.cpp:829
#: ../src/ui/widget/selected-style.cpp:356
msgid "Remove"
msgstr "Entfernen"
-#: ../src/ui/dialog/document-properties.cpp:833
+#: ../src/ui/dialog/document-properties.cpp:816
msgid "Filename"
msgstr "Dateiname"
-#: ../src/ui/dialog/document-properties.cpp:841
+#: ../src/ui/dialog/document-properties.cpp:824
msgid "<b>Embedded script files:</b>"
msgstr "<b>Eingebettete Script-Dateien:</b>"
-#: ../src/ui/dialog/document-properties.cpp:843
+#: ../src/ui/dialog/document-properties.cpp:826
msgid "New"
msgstr "Neu"
-#: ../src/ui/dialog/document-properties.cpp:922
+#: ../src/ui/dialog/document-properties.cpp:893
msgid "Script id"
msgstr "Skript id"
-#: ../src/ui/dialog/document-properties.cpp:928
+#: ../src/ui/dialog/document-properties.cpp:899
msgid "<b>Content:</b>"
msgstr "<b>Inhalt:</b>"
-#: ../src/ui/dialog/document-properties.cpp:1045
+#: ../src/ui/dialog/document-properties.cpp:1016
msgid "_Save as default"
msgstr "Zur Vorgabe machen"
-#: ../src/ui/dialog/document-properties.cpp:1046
+#: ../src/ui/dialog/document-properties.cpp:1017
msgid "Save this metadata as the default metadata"
msgstr "Metadaten als Standard-Metadaten abspeichern"
-#: ../src/ui/dialog/document-properties.cpp:1047
+#: ../src/ui/dialog/document-properties.cpp:1018
msgid "Use _default"
msgstr "Standardeinstellungen benutzen"
-#: ../src/ui/dialog/document-properties.cpp:1048
+#: ../src/ui/dialog/document-properties.cpp:1019
msgid "Use the previously saved default metadata here"
msgstr "Verwenden Sie hier die zuvor gespeicherte Standardmetadaten"
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1121
+#: ../src/ui/dialog/document-properties.cpp:1092
msgid "Add external script..."
msgstr "FĂŒge externes Script hinzu..."
-#: ../src/ui/dialog/document-properties.cpp:1160
+#: ../src/ui/dialog/document-properties.cpp:1131
msgid "Select a script to load"
msgstr "Skript zum Laden auswÀhlen"
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1188
+#: ../src/ui/dialog/document-properties.cpp:1159
msgid "Add embedded script..."
msgstr "FĂŒge eingebettetes Script hinzu..."
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1219
+#: ../src/ui/dialog/document-properties.cpp:1190
msgid "Remove external script"
msgstr "Lösche externes Script"
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1249
+#: ../src/ui/dialog/document-properties.cpp:1220
msgid "Remove embedded script"
msgstr "Eingebettetes Script entfernen"
#. TODO repr->set_content(_EmbeddedContent.get_buffer()->get_text());
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1346
+#: ../src/ui/dialog/document-properties.cpp:1317
msgid "Edit embedded script"
msgstr "Eingebettetes Script bearbeiten"
-#: ../src/ui/dialog/document-properties.cpp:1434
+#: ../src/ui/dialog/document-properties.cpp:1405
msgid "<b>Creation</b>"
msgstr "<b>Erzeugen</b>"
-#: ../src/ui/dialog/document-properties.cpp:1435
+#: ../src/ui/dialog/document-properties.cpp:1406
msgid "<b>Defined grids</b>"
msgstr "<b>Definierte Gitter</b>"
-#: ../src/ui/dialog/document-properties.cpp:1682
+#: ../src/ui/dialog/document-properties.cpp:1653
msgid "Remove grid"
msgstr "Gitter entfernen"
-#: ../src/ui/dialog/document-properties.cpp:1770
+#: ../src/ui/dialog/document-properties.cpp:1741
#, fuzzy
msgid "Changed default display unit"
msgstr "GeÀnderte Dokumenteneinheit"
@@ -15478,7 +15585,7 @@ msgstr "Keine Datei ausgewÀhlt"
#: ../src/ui/dialog/fill-and-stroke.cpp:62
msgid "_Fill"
-msgstr "_FĂŒllen"
+msgstr "_FĂŒllung"
#: ../src/ui/dialog/fill-and-stroke.cpp:63
msgid "Stroke _paint"
@@ -15499,7 +15606,7 @@ msgstr ""
"Diese Matrix definiert eine lineare Transformation im Farbraum. Jede Zeile "
"wirkt auf eine der Farbkomponenten des Ausgangs, jede Spalte bestimmt den "
"Einfluß der jeweiligen Eingangskomponente. Die letzte Spalte gibt einen "
-"konstanten Grundwert der Ausgangskomponenten vor. "
+"konstanten Grundwert der Ausgangskomponenten vor."
# CHECK
#: ../src/ui/dialog/filter-effects-dialog.cpp:549
@@ -15530,12 +15637,10 @@ msgid "This SVG filter effect is not yet implemented in Inkscape."
msgstr "Dieser SVG-Filtereffekt ist noch nicht in Inkscape implementiert."
#: ../src/ui/dialog/filter-effects-dialog.cpp:1041
-#, fuzzy
msgid "Slope"
-msgstr "UmhĂŒllung"
+msgstr "Steigung"
#: ../src/ui/dialog/filter-effects-dialog.cpp:1042
-#, fuzzy
msgid "Intercept"
msgstr "Schnittpunkt"
@@ -16065,7 +16170,7 @@ msgstr ""
"Der Filterbaustein <b>Komponententransfer</b> beeinflusst die "
"Farbkomponenten des Eingangs (rot, grĂŒn, blau und alpha) gemĂ€ĂŸ "
"festzulegender Transferfunktionen. Dies erlaubt Operationen wie Helligkeits- "
-"und Kontrasteinstellung, Farbbalance und Schwellenwerte."
+"und Kontrasteinstellung, Farbbalance und Schwellwerte."
#: ../src/ui/dialog/filter-effects-dialog.cpp:2960
msgid ""
@@ -16216,313 +16321,313 @@ msgstr "Filterbaustein duplizieren"
msgid "Set filter primitive attribute"
msgstr "Attribut fĂŒr Filterbaustein setzen"
-#: ../src/ui/dialog/find.cpp:71
+#: ../src/ui/dialog/find.cpp:72
msgid "F_ind:"
msgstr "Finden:"
-#: ../src/ui/dialog/find.cpp:71
+#: ../src/ui/dialog/find.cpp:72
msgid "Find objects by their content or properties (exact or partial match)"
msgstr ""
"Objekte nach ihrem Inhalt oder Eigenschaften finden (exakte oder partielle "
"Übereinstimmung)"
-#: ../src/ui/dialog/find.cpp:72
+#: ../src/ui/dialog/find.cpp:73
msgid "R_eplace:"
msgstr "Ersetzen:"
-#: ../src/ui/dialog/find.cpp:72
+#: ../src/ui/dialog/find.cpp:73
msgid "Replace match with this value"
msgstr "Übereinstimmung mit diesem Wert ersetzen"
-#: ../src/ui/dialog/find.cpp:74
+#: ../src/ui/dialog/find.cpp:75
msgid "_All"
msgstr "_Alles"
-#: ../src/ui/dialog/find.cpp:74
+#: ../src/ui/dialog/find.cpp:75
msgid "Search in all layers"
msgstr "In allen Ebenen suchen"
-#: ../src/ui/dialog/find.cpp:75
+#: ../src/ui/dialog/find.cpp:76
msgid "Current _layer"
msgstr "Aktuelle Ebene"
-#: ../src/ui/dialog/find.cpp:75
+#: ../src/ui/dialog/find.cpp:76
msgid "Limit search to the current layer"
msgstr "Suche auf aktuelle Ebene beschrÀnken"
-#: ../src/ui/dialog/find.cpp:76
+#: ../src/ui/dialog/find.cpp:77
msgid "Sele_ction"
msgstr "Auswahl"
-#: ../src/ui/dialog/find.cpp:76
+#: ../src/ui/dialog/find.cpp:77
msgid "Limit search to the current selection"
msgstr "Suche auf aktuelle Auswahl beschrÀnken"
-#: ../src/ui/dialog/find.cpp:77
+#: ../src/ui/dialog/find.cpp:78
msgid "Search in text objects"
msgstr "Textobjekte durchsuchen"
-#: ../src/ui/dialog/find.cpp:78
+#: ../src/ui/dialog/find.cpp:79
msgid "_Properties"
msgstr "Eigenschaften"
-#: ../src/ui/dialog/find.cpp:78
+#: ../src/ui/dialog/find.cpp:79
msgid "Search in object properties, styles, attributes and IDs"
msgstr "Suche in Objekt-Eigenschaften, Stilen, Attributen und IDs"
-#: ../src/ui/dialog/find.cpp:80
+#: ../src/ui/dialog/find.cpp:81
msgid "Search in"
msgstr "Suchen in"
-#: ../src/ui/dialog/find.cpp:81
+#: ../src/ui/dialog/find.cpp:82
msgid "Scope"
msgstr "Umfang"
-#: ../src/ui/dialog/find.cpp:83
+#: ../src/ui/dialog/find.cpp:84
msgid "Case sensiti_ve"
msgstr "schreibungsabhÀngig"
-#: ../src/ui/dialog/find.cpp:83
+#: ../src/ui/dialog/find.cpp:84
msgid "Match upper/lower case"
msgstr "Entspricht Groß-/ Kleinschreibung"
-#: ../src/ui/dialog/find.cpp:84
+#: ../src/ui/dialog/find.cpp:85
msgid "E_xact match"
msgstr "Exakte Übereinstimmung"
-#: ../src/ui/dialog/find.cpp:84
+#: ../src/ui/dialog/find.cpp:85
msgid "Match whole objects only"
msgstr "Übereinstimmung nur mit kompletten Objekten"
-#: ../src/ui/dialog/find.cpp:85
+#: ../src/ui/dialog/find.cpp:86
msgid "Include _hidden"
msgstr "Einschließlich _Ausgeblendete"
-#: ../src/ui/dialog/find.cpp:85
+#: ../src/ui/dialog/find.cpp:86
msgid "Include hidden objects in search"
msgstr "Ausgeblendete Objekte bei Suche berĂŒcksichtigen"
-#: ../src/ui/dialog/find.cpp:86
+#: ../src/ui/dialog/find.cpp:87
msgid "Include loc_ked"
msgstr "Einschließlich _Gesperrte"
-#: ../src/ui/dialog/find.cpp:86
+#: ../src/ui/dialog/find.cpp:87
msgid "Include locked objects in search"
msgstr "Gesperrte Objekte bei der Suche berĂŒcksichtigen"
# !!!
-#: ../src/ui/dialog/find.cpp:88
+#: ../src/ui/dialog/find.cpp:89
msgid "General"
msgstr "Allgemein"
-#: ../src/ui/dialog/find.cpp:90
+#: ../src/ui/dialog/find.cpp:91
msgid "_ID"
msgstr "_ID"
-#: ../src/ui/dialog/find.cpp:90
+#: ../src/ui/dialog/find.cpp:91
msgid "Search id name"
msgstr "Suche nach id Name"
-#: ../src/ui/dialog/find.cpp:91
+#: ../src/ui/dialog/find.cpp:92
msgid "Attribute _name"
msgstr "Attributname"
-#: ../src/ui/dialog/find.cpp:91
+#: ../src/ui/dialog/find.cpp:92
msgid "Search attribute name"
msgstr "Attributnamen suchen"
-#: ../src/ui/dialog/find.cpp:92
+#: ../src/ui/dialog/find.cpp:93
msgid "Attri_bute value"
msgstr "Attributwert"
-#: ../src/ui/dialog/find.cpp:92
+#: ../src/ui/dialog/find.cpp:93
msgid "Search attribute value"
msgstr "Attributwert suchen"
-#: ../src/ui/dialog/find.cpp:93
+#: ../src/ui/dialog/find.cpp:94
msgid "_Style"
msgstr "_Stil"
-#: ../src/ui/dialog/find.cpp:93
+#: ../src/ui/dialog/find.cpp:94
msgid "Search style"
msgstr "Suchstil"
-#: ../src/ui/dialog/find.cpp:94
+#: ../src/ui/dialog/find.cpp:95
msgid "F_ont"
msgstr "Schrift"
-#: ../src/ui/dialog/find.cpp:94
+#: ../src/ui/dialog/find.cpp:95
msgid "Search fonts"
msgstr "Schriftarten suchen"
-#: ../src/ui/dialog/find.cpp:95
+#: ../src/ui/dialog/find.cpp:96
msgid "Properties"
msgstr "Eigenschaften"
-#: ../src/ui/dialog/find.cpp:97
+#: ../src/ui/dialog/find.cpp:98
msgid "All types"
msgstr "Alle Typen"
-#: ../src/ui/dialog/find.cpp:97
+#: ../src/ui/dialog/find.cpp:98
msgid "Search all object types"
msgstr "Alle Objekttypen durchsuchen"
-#: ../src/ui/dialog/find.cpp:98
+#: ../src/ui/dialog/find.cpp:99
msgid "Rectangles"
msgstr "Rechtecke"
-#: ../src/ui/dialog/find.cpp:98
+#: ../src/ui/dialog/find.cpp:99
msgid "Search rectangles"
msgstr "Rechtecke durchsuchen"
-#: ../src/ui/dialog/find.cpp:99
+#: ../src/ui/dialog/find.cpp:100
msgid "Ellipses"
msgstr "Ellipsen"
-#: ../src/ui/dialog/find.cpp:99
+#: ../src/ui/dialog/find.cpp:100
msgid "Search ellipses, arcs, circles"
msgstr "Ellipsen, Bögen und Kreise durchsuchen"
-#: ../src/ui/dialog/find.cpp:100
+#: ../src/ui/dialog/find.cpp:101
msgid "Stars"
msgstr "Sterne"
-#: ../src/ui/dialog/find.cpp:100
+#: ../src/ui/dialog/find.cpp:101
msgid "Search stars and polygons"
msgstr "Sterne und Polygone suchen"
-#: ../src/ui/dialog/find.cpp:101
+#: ../src/ui/dialog/find.cpp:102
msgid "Spirals"
msgstr "Spiralen"
-#: ../src/ui/dialog/find.cpp:101
+#: ../src/ui/dialog/find.cpp:102
msgid "Search spirals"
msgstr "Spiralen durchsuchen"
-#: ../src/ui/dialog/find.cpp:102 ../src/widgets/toolbox.cpp:1735
+#: ../src/ui/dialog/find.cpp:103 ../src/widgets/toolbox.cpp:1737
msgid "Paths"
msgstr "Pfade"
-#: ../src/ui/dialog/find.cpp:102
+#: ../src/ui/dialog/find.cpp:103
msgid "Search paths, lines, polylines"
msgstr "Pfade, Linien oder LinienzĂŒge suchen"
-#: ../src/ui/dialog/find.cpp:103
+#: ../src/ui/dialog/find.cpp:104
msgid "Texts"
msgstr "Texte"
-#: ../src/ui/dialog/find.cpp:103
+#: ../src/ui/dialog/find.cpp:104
msgid "Search text objects"
msgstr "Textobjekte durchsuchen"
-#: ../src/ui/dialog/find.cpp:104
+#: ../src/ui/dialog/find.cpp:105
msgid "Groups"
msgstr "Gruppen"
-#: ../src/ui/dialog/find.cpp:104
+#: ../src/ui/dialog/find.cpp:105
msgid "Search groups"
msgstr "Gruppen durchsuchen"
#. TRANSLATORS: "Clones" is a noun indicating type of object to find
-#: ../src/ui/dialog/find.cpp:107
+#: ../src/ui/dialog/find.cpp:108
msgctxt "Find dialog"
msgid "Clones"
msgstr "Klone"
-#: ../src/ui/dialog/find.cpp:107
+#: ../src/ui/dialog/find.cpp:108
msgid "Search clones"
msgstr "Klone durchsuchen"
-#: ../src/ui/dialog/find.cpp:109 ../share/extensions/embedimage.inx.h:3
+#: ../src/ui/dialog/find.cpp:110 ../share/extensions/embedimage.inx.h:3
#: ../share/extensions/extractimage.inx.h:5
msgid "Images"
msgstr "Bilder"
-#: ../src/ui/dialog/find.cpp:109
+#: ../src/ui/dialog/find.cpp:110
msgid "Search images"
msgstr "Bilder durchsuchen"
-#: ../src/ui/dialog/find.cpp:110
+#: ../src/ui/dialog/find.cpp:111
msgid "Offsets"
msgstr "Versatz"
-#: ../src/ui/dialog/find.cpp:110
+#: ../src/ui/dialog/find.cpp:111
msgid "Search offset objects"
msgstr "Objekte mit Versatz finden"
-#: ../src/ui/dialog/find.cpp:111
+#: ../src/ui/dialog/find.cpp:112
msgid "Object types"
msgstr "Objekttypen"
-#: ../src/ui/dialog/find.cpp:114
+#: ../src/ui/dialog/find.cpp:115
msgid "_Find"
msgstr "_Suchen"
-#: ../src/ui/dialog/find.cpp:114
+#: ../src/ui/dialog/find.cpp:115
msgid "Select all objects matching the selection criteria"
msgstr "WĂ€hle Objekte aus, die zu allen angegebene Feldern passen"
-#: ../src/ui/dialog/find.cpp:115
+#: ../src/ui/dialog/find.cpp:116
msgid "_Replace All"
msgstr "Alles e_rsetzen"
-#: ../src/ui/dialog/find.cpp:115
+#: ../src/ui/dialog/find.cpp:116
msgid "Replace all matches"
msgstr "Ersetze alle Übereinstimmungen"
# # !!! just make the menu item insensitive
-#: ../src/ui/dialog/find.cpp:797
+#: ../src/ui/dialog/find.cpp:801
msgid "Nothing to replace"
msgstr "Es gibt nichts zu ersetzen"
#. TRANSLATORS: "%s" is replaced with "exact" or "partial" when this string is displayed
-#: ../src/ui/dialog/find.cpp:838
+#: ../src/ui/dialog/find.cpp:842
#, c-format
msgid "<b>%d</b> object found (out of <b>%d</b>), %s match."
msgid_plural "<b>%d</b> objects found (out of <b>%d</b>), %s match."
msgstr[0] "<b>%d</b> (von <b>%d</b>) Objekt gefunden, %s passend."
msgstr[1] "<b>%d</b> (von <b>%d</b>) Objekten gefunden, %s passend."
-#: ../src/ui/dialog/find.cpp:841
+#: ../src/ui/dialog/find.cpp:845
msgid "exact"
msgstr "exakt"
-#: ../src/ui/dialog/find.cpp:841
+#: ../src/ui/dialog/find.cpp:845
msgid "partial"
msgstr "teilweise"
#. TRANSLATORS: "%1" is replaced with the number of matches
-#: ../src/ui/dialog/find.cpp:844
+#: ../src/ui/dialog/find.cpp:848
msgid "%1 match replaced"
msgid_plural "%1 matches replaced"
msgstr[0] "%1 Übereinstimmung ersetzt"
msgstr[1] "%1 Übereinstimmungen ersetzt"
#. TRANSLATORS: "%1" is replaced with the number of matches
-#: ../src/ui/dialog/find.cpp:848
+#: ../src/ui/dialog/find.cpp:852
msgid "%1 object found"
msgid_plural "%1 objects found"
msgstr[0] "%1 Objekt gefunden"
msgstr[1] "%1 Objekte gefunden"
-#: ../src/ui/dialog/find.cpp:862
+#: ../src/ui/dialog/find.cpp:866
msgid "Replace text or property"
msgstr "Text oder Eigenschaft ersetzen"
# !!! just make the menu item insensitive
-#: ../src/ui/dialog/find.cpp:866
+#: ../src/ui/dialog/find.cpp:870
msgid "Nothing found"
msgstr "Nichts gefunden"
-#: ../src/ui/dialog/find.cpp:871
+#: ../src/ui/dialog/find.cpp:875
msgid "No objects found"
msgstr "Keine Objekte gefunden"
-#: ../src/ui/dialog/find.cpp:892
+#: ../src/ui/dialog/find.cpp:896
msgid "Select an object type"
msgstr "WĂ€hlen Sie ein Objekttyp"
-#: ../src/ui/dialog/find.cpp:910
+#: ../src/ui/dialog/find.cpp:914
msgid "Select a property"
msgstr "WĂ€hlen Sie eine Eigenschaft aus"
@@ -17365,12 +17470,12 @@ msgstr "Hilfslinien relativ zur aktuellen Position verschieben/drehen"
#: ../src/ui/dialog/guides.cpp:48
msgctxt "Guides"
msgid "_X:"
-msgstr "_X: [FĂŒhrungslinien]"
+msgstr "_X: [Hilfslinien]"
#: ../src/ui/dialog/guides.cpp:49
msgctxt "Guides"
msgid "_Y:"
-msgstr "_Y: [FĂŒhrungslinien]"
+msgstr "_Y: [Hilfslinien]"
#: ../src/ui/dialog/guides.cpp:50 ../src/ui/dialog/object-properties.cpp:59
msgid "_Label:"
@@ -17378,7 +17483,7 @@ msgstr "_Bezeichner:"
#: ../src/ui/dialog/guides.cpp:50
msgid "Optionally give this guideline a name"
-msgstr "Vergeben Sie optional einen Namen fĂŒr die FĂŒhrungslinie"
+msgstr "Vergeben Sie optional einen Namen fĂŒr die Hilfslinie"
#: ../src/ui/dialog/guides.cpp:51
msgid "_Angle:"
@@ -17386,16 +17491,16 @@ msgstr "Winkel:"
#: ../src/ui/dialog/guides.cpp:130
msgid "Set guide properties"
-msgstr "FĂŒhrungslinien-Eigenschaften setzen"
+msgstr "Hilfslinien-Eigenschaften setzen"
#: ../src/ui/dialog/guides.cpp:160
msgid "Guideline"
-msgstr "FĂŒhrungslinien"
+msgstr "Hilfslinien"
#: ../src/ui/dialog/guides.cpp:311
#, c-format
msgid "Guideline ID: %s"
-msgstr "FĂŒhrungslinien ID: %s"
+msgstr "Hilfslinien ID: %s"
#: ../src/ui/dialog/guides.cpp:317
#, c-format
@@ -17446,14 +17551,14 @@ msgstr "AusgewÀhlten Objekte zeigen Farbverlaufs-Anfasser an"
#: ../src/ui/dialog/inkscape-preferences.cpp:196
msgid "Conversion to guides uses edges instead of bounding box"
-msgstr "Umwandlung zu FĂŒhrungslinien nutzt Ecken anstelle von Umrandungsboxen"
+msgstr "Umwandlung zu Hilfslinien nutzt Ecken anstelle von Umrandungsboxen"
#: ../src/ui/dialog/inkscape-preferences.cpp:197
msgid ""
"Converting an object to guides places these along the object's true edges "
"(imitating the object's shape), not along the bounding box"
msgstr ""
-"Wird ein Objekt zu FĂŒhrungslinien umgewandelt, so gelten die tatsĂ€chlichen "
+"Wird ein Objekt zu Hilfslinien umgewandelt, so gelten die tatsÀchlichen "
"Umrisse des Objekts, nicht die rechteckige Umrandung."
#: ../src/ui/dialog/inkscape-preferences.cpp:204
@@ -17504,7 +17609,7 @@ msgid ""
"the button below to set it."
msgstr ""
"Werkzeuge können eigene Stilvorgaben behalten, die auf neu erzeugte Objekte "
-"angewendet werden. Stilvorgabe mit dem unteren Knopf festlegen."
+"angewendet werden. Stilvorgabe mit der unteren SchaltflÀche festlegen."
#. style swatch
#: ../src/ui/dialog/inkscape-preferences.cpp:282
@@ -17549,17 +17654,17 @@ msgstr "Dieser Rahmen berĂŒcksichtigt nur den reinen Pfad"
#: ../src/ui/dialog/inkscape-preferences.cpp:314
msgid "Conversion to guides"
-msgstr "Umwandlung in FĂŒhrungslinien"
+msgstr "Umwandlung in Hilfslinien"
#: ../src/ui/dialog/inkscape-preferences.cpp:315
msgid "Keep objects after conversion to guides"
-msgstr "Behalte Objekte nach Umwandlung in FĂŒhrungslinien"
+msgstr "Behalte Objekte nach Umwandlung in Hilfslinien"
#: ../src/ui/dialog/inkscape-preferences.cpp:317
msgid ""
"When converting an object to guides, don't delete the object after the "
"conversion"
-msgstr "Objekt bleibt erhalten, wenn es in FĂŒhrungslinien umgewandelt wird."
+msgstr "Objekt bleibt erhalten, wenn es in Hilfslinien umgewandelt wird."
#: ../src/ui/dialog/inkscape-preferences.cpp:318
msgid "Treat groups as a single object"
@@ -17570,7 +17675,7 @@ msgid ""
"Treat groups as a single object during conversion to guides rather than "
"converting each child separately"
msgstr ""
-"Gruppen werden als Ganzes (statt der Einzelteile) zu FĂŒhrungslinien "
+"Gruppen werden als Ganzes (statt der Einzelteile) zu Hilfslinien "
"umgewandelt."
#: ../src/ui/dialog/inkscape-preferences.cpp:322
@@ -17937,8 +18042,8 @@ msgstr "Farbeimer"
#. Gradient
#: ../src/ui/dialog/inkscape-preferences.cpp:487
-#: ../src/widgets/gradient-selector.cpp:134
-#: ../src/widgets/gradient-selector.cpp:302
+#: ../src/widgets/gradient-selector.cpp:144
+#: ../src/widgets/gradient-selector.cpp:295
msgid "Gradient"
msgstr "Farbverlauf"
@@ -18159,6 +18264,10 @@ msgid "Indonesian (id)"
msgstr "Indonesisch (id)"
#: ../src/ui/dialog/inkscape-preferences.cpp:532
+msgid "Icelandic (is)"
+msgstr ""
+
+#: ../src/ui/dialog/inkscape-preferences.cpp:532
msgid "Italian (it)"
msgstr "Italienisch (it)"
@@ -18357,7 +18466,7 @@ msgid ""
"Set the maximum length of the Open Recent list in the File menu, or clear "
"the list"
msgstr ""
-"Die maximale LĂ€nge der Liste zuletzt geöffneter Dokumente im MenĂŒ »Datei«"
+"Die maximale LĂ€nge der Liste zuletzt geöffneter Dokumente im MenĂŒ „Datei“"
#: ../src/ui/dialog/inkscape-preferences.cpp:602
msgid "_Zoom correction factor (in %):"
@@ -18485,7 +18594,7 @@ msgstr "ZeichnungsgrĂ¶ĂŸe Ă€ndern, wenn die FenstergrĂ¶ĂŸe verĂ€ndert wird"
#: ../src/ui/dialog/inkscape-preferences.cpp:651
msgid "Show close button on dialogs"
-msgstr "Schließknöpfe in Dialogen zeigen"
+msgstr "SchaltflĂ€chen zum Schließen von Dialogen zeigen"
# CHECK
#: ../src/ui/dialog/inkscape-preferences.cpp:652
@@ -18535,7 +18644,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:673
msgid "Saving dialogs status"
-msgstr "Speichere Dialogstatud"
+msgstr "Dialogstatus speichern"
#: ../src/ui/dialog/inkscape-preferences.cpp:677
msgid ""
@@ -18576,27 +18685,27 @@ msgstr "Dialoge bleiben vor Dokumentenfenstern"
#: ../src/ui/dialog/inkscape-preferences.cpp:702
msgid "Same as Normal but may work better with some window managers"
msgstr ""
-"Wie »Normal«, aber funktioniert evtl. besser mit manchen Fenstermanagern"
+"Wie „Normal“, aber funktioniert evtl. besser mit manchen Fenstermanagern"
#: ../src/ui/dialog/inkscape-preferences.cpp:705
msgid "Dialog Transparency"
-msgstr "Dialog Transparenz:"
+msgstr "Dialog Transparenz"
#: ../src/ui/dialog/inkscape-preferences.cpp:707
msgid "_Opacity when focused:"
-msgstr "Deckkraft bei Focus:"
+msgstr "Deckkraft wenn fokussiert:"
#: ../src/ui/dialog/inkscape-preferences.cpp:709
msgid "Opacity when _unfocused:"
-msgstr "TrĂŒbung wenn nicht fokussiert:"
+msgstr "Deckkraft wenn nicht fokussiert:"
#: ../src/ui/dialog/inkscape-preferences.cpp:711
msgid "_Time of opacity change animation:"
-msgstr "Zeit fĂŒr Deckkraft-Änderungsanimation"
+msgstr "Zeit der Animation beim Ändern der Deckkraft:"
#: ../src/ui/dialog/inkscape-preferences.cpp:714
msgid "Miscellaneous"
-msgstr "Verschiedenes:"
+msgstr "Verschiedenes"
#: ../src/ui/dialog/inkscape-preferences.cpp:717
msgid "Whether dialog windows are to be hidden in the window manager taskbar"
@@ -18608,9 +18717,9 @@ msgid ""
"(this is the default which can be changed in any window using the button "
"above the right scrollbar)"
msgstr ""
-"DarstellungsgrĂ¶ĂŸe des Dokuments anpassen, wenn sich die FenstergrĂ¶ĂŸe Ă€ndert "
-"- der selbe Bereich bleibt sichtbar (Vorgabe, die in jedem Fenster mit dem "
-"Knopf ĂŒber dem rechten Rollbalken geĂ€ndert wird)"
+"DarstellungsgrĂ¶ĂŸe des Dokuments anpassen, wenn sich die FenstergrĂ¶ĂŸe Ă€ndert, "
+"damit der selbe Bereich sichtbar bleibt (Vorgabe, die in jedem Fenster mit "
+"der SchaltflĂ€che ĂŒber dem rechten Rollbalken geĂ€ndert werden kann)"
#: ../src/ui/dialog/inkscape-preferences.cpp:722
msgid ""
@@ -18623,7 +18732,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:724
msgid "Whether dialog windows have a close button (requires restart)"
-msgstr "Dialogfenster haben Knöpfe zum Schließen (erfordert Neustart)"
+msgstr "Dialogfenster haben SchaltflĂ€chen zum Schließen (erfordert Neustart)"
#: ../src/ui/dialog/inkscape-preferences.cpp:725
msgid "Windows"
@@ -19492,7 +19601,7 @@ msgid ""
"acceleration)"
msgstr ""
"DrĂŒcken von Strg+Pfeiltaste erhöht zunehmend die Rollgeschwindigkeit (0 "
-"bedeutet »keine Beschleunigung«)"
+"bedeutet „keine Beschleunigung“)"
#: ../src/ui/dialog/inkscape-preferences.cpp:1214
msgid "Autoscrolling"
@@ -19513,7 +19622,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1219
#: ../src/ui/dialog/tracedialog.cpp:522 ../src/ui/dialog/tracedialog.cpp:721
msgid "_Threshold:"
-msgstr "Schwellwert:"
+msgstr "Schwellwer_t:"
#: ../src/ui/dialog/inkscape-preferences.cpp:1220
msgid ""
@@ -19690,7 +19799,7 @@ msgid ""
"When on, the snap angles when rotating a guideline will be relative to the "
"original angle"
msgstr ""
-"Wenn eingeschaltet, wird der Einrastwinkel beim Drehen einer FĂŒhrungslinie "
+"Wenn eingeschaltet, wird der Einrastwinkel beim Drehen einer Hilfslinie "
"relativ zum ursprĂŒnglichen Winkel"
#: ../src/ui/dialog/inkscape-preferences.cpp:1280
@@ -19698,7 +19807,7 @@ msgid "_Zoom in/out by:"
msgstr "Zoomfaktor vergrĂ¶ĂŸern/verkleinern um:"
#: ../src/ui/dialog/inkscape-preferences.cpp:1280
-#: ../src/ui/dialog/objects.cpp:1622
+#: ../src/ui/dialog/objects.cpp:1620
#: ../src/ui/widget/filter-effect-chooser.cpp:27
msgid "%"
msgstr "%"
@@ -19998,7 +20107,7 @@ msgstr "Effekt-QualitĂ€t fĂŒr Anzeige:"
#. build custom preferences tab
#: ../src/ui/dialog/inkscape-preferences.cpp:1428
-#: ../src/ui/dialog/print.cpp:232
+#: ../src/ui/dialog/print.cpp:215
msgid "Rendering"
msgstr "Rendern"
@@ -20021,7 +20130,7 @@ msgid "_Bitmap editor:"
msgstr "_Bitmap-Editor:"
#: ../src/ui/dialog/inkscape-preferences.cpp:1441
-#: ../share/extensions/guillotine.inx.h:5 ../share/extensions/plotter.inx.h:55
+#: ../share/extensions/guillotine.inx.h:5 ../share/extensions/plotter.inx.h:57
#: ../share/extensions/print_win32_vector.inx.h:2
msgid "Export"
msgstr "Exportieren"
@@ -20036,7 +20145,7 @@ msgstr ""
"Bevorzugte Auflösung der Bitmap (Punkte pro Zoll) im Exportieren-Dialog"
#: ../src/ui/dialog/inkscape-preferences.cpp:1445
-#: ../src/ui/dialog/xml-tree.cpp:912
+#: ../src/ui/dialog/xml-tree.cpp:920
msgid "Create"
msgstr "Erstellen"
@@ -20101,9 +20210,10 @@ msgid "Bitmaps"
msgstr "Bitmaps"
#: ../src/ui/dialog/inkscape-preferences.cpp:1494
+#, fuzzy
msgid ""
"Select a file of predefined shortcuts to use. Any customized shortcuts you "
-"create will be added seperately to "
+"create will be added separately to "
msgstr ""
"WĂ€hlen Sie eine Datei mit vorderfinierten TastenkĂŒrzeln. Jeder "
"benutzerdefinierte KĂŒrzel der erstellt wird, wird separat hinzugefĂŒgt zu"
@@ -20513,12 +20623,12 @@ msgstr "Ebene sperren"
msgid "Unlock layer"
msgstr "Ebene entsperren"
-#: ../src/ui/dialog/layers.cpp:624 ../src/ui/dialog/objects.cpp:845
+#: ../src/ui/dialog/layers.cpp:624 ../src/ui/dialog/objects.cpp:843
#: ../src/verbs.cpp:1438
msgid "Toggle layer solo"
msgstr "Sichbarkeit der aktuellen Ebene umschalten"
-#: ../src/ui/dialog/layers.cpp:627 ../src/ui/dialog/objects.cpp:848
+#: ../src/ui/dialog/layers.cpp:627 ../src/ui/dialog/objects.cpp:846
#: ../src/verbs.cpp:1462
msgid "Lock other layers"
msgstr "Andere Ebenen sperren"
@@ -20556,73 +20666,73 @@ msgstr "Oben"
msgid "Add Path Effect"
msgstr "Pfadeffekt hinzufĂŒgen"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:109
+#: ../src/ui/dialog/livepatheffect-editor.cpp:119
msgid "Add path effect"
msgstr "Pfadeffekt hinzufĂŒgen"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:119
+#: ../src/ui/dialog/livepatheffect-editor.cpp:123
msgid "Delete current path effect"
msgstr "Aktuellen Pfadeffekt löschen"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:129
+#: ../src/ui/dialog/livepatheffect-editor.cpp:127
msgid "Raise the current path effect"
msgstr "Aktuellen Pfadeffekt vergrĂ¶ĂŸern"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:139
+#: ../src/ui/dialog/livepatheffect-editor.cpp:131
msgid "Lower the current path effect"
msgstr "Aktuellen Pfadeffekt verringern"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:312
+#: ../src/ui/dialog/livepatheffect-editor.cpp:298
msgid "Unknown effect is applied"
msgstr "Unbekannter Effekt wurde angewendet"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:315
+#: ../src/ui/dialog/livepatheffect-editor.cpp:301
msgid "Click button to add an effect"
msgstr "SchaltflĂ€che klicken, um Effekt hinzuzufĂŒgen"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:330
+#: ../src/ui/dialog/livepatheffect-editor.cpp:316
msgid "Click add button to convert clone"
msgstr "Klicken Sie auf HinzufĂŒgen, um Klon zu konvertieren"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:335
-#: ../src/ui/dialog/livepatheffect-editor.cpp:339
-#: ../src/ui/dialog/livepatheffect-editor.cpp:348
+#: ../src/ui/dialog/livepatheffect-editor.cpp:321
+#: ../src/ui/dialog/livepatheffect-editor.cpp:325
+#: ../src/ui/dialog/livepatheffect-editor.cpp:334
msgid "Select a path or shape"
msgstr "WĂ€hle einen Pfad oder Form"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:344
+#: ../src/ui/dialog/livepatheffect-editor.cpp:330
msgid "Only one item can be selected"
msgstr "Nur ein Element kann ausgewÀhlt werden"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:376
+#: ../src/ui/dialog/livepatheffect-editor.cpp:362
msgid "Unknown effect"
msgstr "Unbekannter Effekt wurde angewendet"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:452
+#: ../src/ui/dialog/livepatheffect-editor.cpp:438
msgid "Create and apply path effect"
msgstr "Pfadeffekt erstellen und anwenden"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:492
+#: ../src/ui/dialog/livepatheffect-editor.cpp:478
msgid "Create and apply Clone original path effect"
msgstr "Erstellen und Anwenden des Klon-Original-Pfadeffekts"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:514
+#: ../src/ui/dialog/livepatheffect-editor.cpp:500
msgid "Remove path effect"
msgstr "Pfadeffekt entfernen"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:532
+#: ../src/ui/dialog/livepatheffect-editor.cpp:518
msgid "Move path effect up"
msgstr "Pfadeffekt nach oben verschieben"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:549
+#: ../src/ui/dialog/livepatheffect-editor.cpp:535
msgid "Move path effect down"
msgstr "Pfadeffekt nach unten verschieben"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:588
+#: ../src/ui/dialog/livepatheffect-editor.cpp:574
msgid "Activate path effect"
msgstr "Pfadeffekt aktivieren"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:588
+#: ../src/ui/dialog/livepatheffect-editor.cpp:574
msgid "Deactivate path effect"
msgstr "Pfadeffekt deaktivieren"
@@ -20886,93 +20996,93 @@ msgstr "Objekte ausblenden"
msgid "Unhide object"
msgstr "Ausgeblendete Objekte anzeigen"
-#: ../src/ui/dialog/objects.cpp:875
+#: ../src/ui/dialog/objects.cpp:873
#, fuzzy
msgid "Unhide objects"
msgstr "Ausgeblendete Objekte anzeigen"
-#: ../src/ui/dialog/objects.cpp:875
+#: ../src/ui/dialog/objects.cpp:873
#, fuzzy
msgid "Hide objects"
msgstr "Objekte ausblenden"
-#: ../src/ui/dialog/objects.cpp:895
+#: ../src/ui/dialog/objects.cpp:893
#, fuzzy
msgid "Lock objects"
msgstr "Objekt sperren"
-#: ../src/ui/dialog/objects.cpp:895
+#: ../src/ui/dialog/objects.cpp:893
#, fuzzy
msgid "Unlock objects"
msgstr "Objektsperrung aufheben"
-#: ../src/ui/dialog/objects.cpp:907
+#: ../src/ui/dialog/objects.cpp:905
#, fuzzy
msgid "Layer to group"
msgstr "Ebene nach ganz oben"
-#: ../src/ui/dialog/objects.cpp:907
+#: ../src/ui/dialog/objects.cpp:905
#, fuzzy
msgid "Group to layer"
msgstr "Gruppieren zum Symbol"
-#: ../src/ui/dialog/objects.cpp:1105
+#: ../src/ui/dialog/objects.cpp:1103
#, fuzzy
msgid "Moved objects"
msgstr "Keine Objekte"
-#: ../src/ui/dialog/objects.cpp:1354 ../src/ui/dialog/tags.cpp:875
-#: ../src/ui/dialog/tags.cpp:882
+#: ../src/ui/dialog/objects.cpp:1352 ../src/ui/dialog/tags.cpp:856
+#: ../src/ui/dialog/tags.cpp:863
#, fuzzy
msgid "Rename object"
msgstr "Objekte drehen"
-#: ../src/ui/dialog/objects.cpp:1461
+#: ../src/ui/dialog/objects.cpp:1459
#, fuzzy
msgid "Set object highlight color"
msgstr "Objekttitel setzen"
-#: ../src/ui/dialog/objects.cpp:1471
+#: ../src/ui/dialog/objects.cpp:1469
#, fuzzy
msgid "Set object opacity"
msgstr "Objekttitel setzen"
-#: ../src/ui/dialog/objects.cpp:1504
+#: ../src/ui/dialog/objects.cpp:1502
#, fuzzy
msgid "Set object blend mode"
msgstr "Objektbezeichner setzen"
-#: ../src/ui/dialog/objects.cpp:1560
+#: ../src/ui/dialog/objects.cpp:1558
#, fuzzy
msgid "Set object blur"
msgstr "Objektbezeichner setzen"
-#: ../src/ui/dialog/objects.cpp:1802
+#: ../src/ui/dialog/objects.cpp:1800
#, fuzzy
msgid "Add layer..."
msgstr "Ebene _hinzufĂŒgen..."
-#: ../src/ui/dialog/objects.cpp:1817
+#: ../src/ui/dialog/objects.cpp:1807
#, fuzzy
msgid "Remove object"
msgstr "Schrift entfernen"
-#: ../src/ui/dialog/objects.cpp:1832
+#: ../src/ui/dialog/objects.cpp:1815
#, fuzzy
msgid "Move To Bottom"
msgstr "Nach ganz u_nten absenken"
-#: ../src/ui/dialog/objects.cpp:1877
+#: ../src/ui/dialog/objects.cpp:1839
#, fuzzy
msgid "Move To Top"
msgstr "Verschiebungsmodus"
-#: ../src/ui/dialog/objects.cpp:1892
+#: ../src/ui/dialog/objects.cpp:1847
#, fuzzy
msgid "Collapse All"
msgstr "Alles l_eeren"
-#: ../src/ui/dialog/objects.cpp:1974
+#: ../src/ui/dialog/objects.cpp:1922
#, fuzzy
msgid "Select Highlight Color"
msgstr "_Hervorhebungsfarbe:"
@@ -21050,9 +21160,8 @@ msgid "Avoid single disconnected pixels"
msgstr "Vermeidet einzelne unverbundene Pixel"
#: ../src/ui/dialog/pixelartdialog.cpp:209
-#, fuzzy
msgid "A constant vote value"
-msgstr "Eine konstante Stimmgewichtung"
+msgstr "Eine konstante Stimmenzahl"
#: ../src/ui/dialog/pixelartdialog.cpp:219
msgid "Sparse pixels (window _radius):"
@@ -21060,7 +21169,7 @@ msgstr "Verstreute Pixel (Fenster _Radius):"
#: ../src/ui/dialog/pixelartdialog.cpp:228
msgid "The radius of the window analyzed"
-msgstr "Der Radius des Fensters wird analysiert"
+msgstr "Der Radius des Bildausschnitts welcher analysiert wird"
#: ../src/ui/dialog/pixelartdialog.cpp:229
msgid "Sparse pixels (_multiplier):"
@@ -21071,9 +21180,9 @@ msgid "Favors connections that are part of foreground color"
msgstr "Bevorzugt Verbindungen die Teil der Vordergrundfarbe sind"
#: ../src/ui/dialog/pixelartdialog.cpp:246
-#, fuzzy
msgid "The heuristic computed vote will be multiplied by this value"
-msgstr "Die heuristisch berechnete Quote wird mit diesem Wert multipliziert"
+msgstr ""
+"Die heuristisch berechnete Stimmenzahl wird mit diesem Wert multipliziert"
#: ../src/ui/dialog/pixelartdialog.cpp:259
msgid "Heuristics"
@@ -21085,7 +21194,7 @@ msgstr "_Voronoi-Diagramm"
#: ../src/ui/dialog/pixelartdialog.cpp:267
msgid "Output composed of straight lines"
-msgstr "Ausgabe als gerade Linien"
+msgstr "Ausgabe bestehend aus geraden Linien"
#: ../src/ui/dialog/pixelartdialog.cpp:273
msgid "Convert to _B-spline curves"
@@ -21093,7 +21202,7 @@ msgstr "Umwandeln in _B-Spline-Kurven"
#: ../src/ui/dialog/pixelartdialog.cpp:274
msgid "Preserve staircasing artifacts"
-msgstr "Treppenbildungsartefakte beibehalten"
+msgstr "GeglÀtte Ausgabe (mit Treppenartefakten)"
#: ../src/ui/dialog/pixelartdialog.cpp:281
msgid "_Smooth curves"
@@ -21110,7 +21219,7 @@ msgstr "Ausgabe"
#: ../src/ui/dialog/pixelartdialog.cpp:297
#: ../src/ui/dialog/tracedialog.cpp:814
msgid "Reset all settings to defaults"
-msgstr "Alle Einstellungen auf Standardeinstellungen zurĂŒcksetzen"
+msgstr "Alle Einstellungen auf Standard zurĂŒcksetzen"
#: ../src/ui/dialog/pixelartdialog.cpp:302
#: ../src/ui/dialog/tracedialog.cpp:819
@@ -21120,7 +21229,7 @@ msgstr "Nachzeichnen abbrechen"
#: ../src/ui/dialog/pixelartdialog.cpp:306
#: ../src/ui/dialog/tracedialog.cpp:823
msgid "Execute the trace"
-msgstr "Nachzeichnen ausfĂŒhren"
+msgstr "Nachzeichnen starten"
#: ../src/ui/dialog/pixelartdialog.cpp:388
#: ../src/ui/dialog/pixelartdialog.cpp:422
@@ -21130,8 +21239,8 @@ msgid ""
"\n"
"Continue the procedure (without saving)?"
msgstr ""
-"Bild erscheint zu groß. Die Bearbeitung wird lĂ€nger dauern und es empfiehlt "
-"sich, das Dokument vorher zu speichern. \n"
+"Bild erscheint zu groß. Der Vorgang kann einige Zeit in Anspruch nehmen und "
+"es empfiehlt sich, das Dokument zunÀchst zu speichern.\n"
"\n"
"Verarbeitung fortsetzen (ohne zu speichern)?"
@@ -21242,21 +21351,21 @@ msgstr "Auf Ellipse anordnen"
msgid "Could not open temporary PNG for bitmap printing"
msgstr "Konnte temporĂ€res PNG fĂŒr Rasterdruck nicht öffnen"
-#: ../src/ui/dialog/print.cpp:155
+#: ../src/ui/dialog/print.cpp:138
msgid "Could not set up Document"
msgstr "Dokument konnte nicht eingerichtet werden"
# CairoRenderContext ist Eigenname?
-#: ../src/ui/dialog/print.cpp:159
+#: ../src/ui/dialog/print.cpp:142
msgid "Failed to set CairoRenderContext"
msgstr "Fehler beim Setzen von CairoRenderContext"
#. set up dialog title, based on document name
-#: ../src/ui/dialog/print.cpp:197
+#: ../src/ui/dialog/print.cpp:180
msgid "SVG Document"
msgstr "SVG-Dokument"
-#: ../src/ui/dialog/print.cpp:198
+#: ../src/ui/dialog/print.cpp:181
msgid "Print"
msgstr "Drucken"
@@ -21497,8 +21606,8 @@ msgstr "Beispieltext"
msgid "Preview Text:"
msgstr "Textvorschau:"
-#: ../src/ui/dialog/swatches.cpp:202 ../src/ui/tools/gradient-tool.cpp:370
-#: ../src/ui/tools/gradient-tool.cpp:468
+#: ../src/ui/dialog/swatches.cpp:202 ../src/ui/tools/gradient-tool.cpp:360
+#: ../src/ui/tools/gradient-tool.cpp:458
#: ../src/widgets/gradient-vector.cpp:794
msgid "Add gradient stop"
msgstr "Zwischenfarbe zum Farbverlauf hinzufĂŒgen"
@@ -21548,15 +21657,15 @@ msgstr "Symbol vom aktuellen Dokument entfernen."
#: ../src/ui/dialog/symbols.cpp:239
msgid "Display more icons in row."
-msgstr "Mehr Symbole in Reihe anzeigen."
+msgstr "Mehr Symbole in einer Reihe anzeigen."
#: ../src/ui/dialog/symbols.cpp:248
msgid "Display fewer icons in row."
-msgstr "Weniger Symbole in Reihe anzeigen."
+msgstr "Weniger Symbole in einer Reihe anzeigen."
#: ../src/ui/dialog/symbols.cpp:258
msgid "Toggle 'fit' symbols in icon space."
-msgstr "\"Einpassen\" der Symbole im Symbolbereich umschalten."
+msgstr "\"Einpassen\" der Symbole im Symbolbereich."
#: ../src/ui/dialog/symbols.cpp:270
msgid "Make symbols smaller by zooming out."
@@ -21570,32 +21679,32 @@ msgstr "Symbole durch Hineinzoomen vergrĂ¶ĂŸern."
msgid "Unnamed Symbols"
msgstr "Unbenannte Symbole"
-#: ../src/ui/dialog/tags.cpp:293 ../src/ui/dialog/tags.cpp:591
-#: ../src/ui/dialog/tags.cpp:705
+#: ../src/ui/dialog/tags.cpp:274 ../src/ui/dialog/tags.cpp:572
+#: ../src/ui/dialog/tags.cpp:686
#, fuzzy
msgid "Remove from selection set"
msgstr "Maskierung von Auswahl entfernen"
-#: ../src/ui/dialog/tags.cpp:449
+#: ../src/ui/dialog/tags.cpp:430
msgid "Items"
msgstr ""
-#: ../src/ui/dialog/tags.cpp:688
+#: ../src/ui/dialog/tags.cpp:669
#, fuzzy
msgid "Add selection to set"
msgstr "Die gewÀhlten Objekte nach ganz oben anheben"
-#: ../src/ui/dialog/tags.cpp:846
+#: ../src/ui/dialog/tags.cpp:827
#, fuzzy
msgid "Moved sets"
msgstr "Bewegungen"
-#: ../src/ui/dialog/tags.cpp:1016
+#: ../src/ui/dialog/tags.cpp:997
#, fuzzy
msgid "Add a new selection set"
msgstr "Neuer Verbindungspunkt"
-#: ../src/ui/dialog/tags.cpp:1025
+#: ../src/ui/dialog/tags.cpp:1006
#, fuzzy
msgid "Remove Item/Set"
msgstr "Effekte entfernen"
@@ -21670,7 +21779,7 @@ msgid "Text path offset"
msgstr "Text-Pfad-Versatz"
#: ../src/ui/dialog/text-edit.cpp:586 ../src/ui/dialog/text-edit.cpp:660
-#: ../src/ui/tools/text-tool.cpp:1455
+#: ../src/ui/tools/text-tool.cpp:1446
msgid "Set text style"
msgstr "Textstil setzen"
@@ -21700,19 +21809,19 @@ msgstr "GewÀhlte Objekte anordnen"
#. brightness
#: ../src/ui/dialog/tracedialog.cpp:508
msgid "_Brightness cutoff"
-msgstr "_Helligkeit ausschalten"
+msgstr "_Helligkeitsschwellwert"
#: ../src/ui/dialog/tracedialog.cpp:512
msgid "Trace by a given brightness level"
-msgstr "AbhÀngig vom angegebenen Helligkeitswert nachzeichnen"
+msgstr "Entlang eines angegebenen Helligkeitswerts nachzeichnen"
#: ../src/ui/dialog/tracedialog.cpp:519
msgid "Brightness cutoff for black/white"
-msgstr "Helligkeitsschwellwerte fĂŒr Schwarz/Weiß"
+msgstr "Helligkeitsschwellwert fĂŒr Schwarz/Weiß"
#: ../src/ui/dialog/tracedialog.cpp:529
msgid "Single scan: creates a path"
-msgstr "Einzelner Scan: einen Pfad erzeugen"
+msgstr "Einzelne Abtastung: Einen Pfad erzeugen"
#. canny edge detection
#. TRANSLATORS: "Canny" is the name of the inventor of this edge detection method
@@ -21722,18 +21831,15 @@ msgstr "Kanten_erkennung"
#: ../src/ui/dialog/tracedialog.cpp:538
msgid "Trace with optimal edge detection by J. Canny's algorithm"
-msgstr ""
-"Mit optimaler Kantenerkennung durch J. Canny's Algorithmus nachzeichnen"
+msgstr "Mit optimaler Kantenerkennung nach J. Canny's Algorithmus nachzeichnen"
#: ../src/ui/dialog/tracedialog.cpp:556
msgid "Brightness cutoff for adjacent pixels (determines edge thickness)"
-msgstr ""
-"Schwellwert des Helligkeitswerts bei angrenzenden Pixeln (bestimmt "
-"Kantenbreite)"
+msgstr "Helligkeitsschwellwert fĂŒr angrenzende Pixel (bestimmt Kantenbreite)"
#: ../src/ui/dialog/tracedialog.cpp:559
msgid "T_hreshold:"
-msgstr "Sc_hwellenwert:"
+msgstr "Sc_hwellwert:"
#. quantization
#. TRANSLATORS: Color Quantization: the process of reducing the number
@@ -21745,11 +21851,11 @@ msgstr "Farb_quantisierung"
#: ../src/ui/dialog/tracedialog.cpp:575
msgid "Trace along the boundaries of reduced colors"
-msgstr "Entlang der reduzierten Farbbegrenzungen nachzeichnen"
+msgstr "Entlang der FarbrÀnder bei reduzierter Farbtiefe nachzeichnen."
#: ../src/ui/dialog/tracedialog.cpp:583
msgid "The number of reduced colors"
-msgstr "Anzahl der reduzierten Farben"
+msgstr "Anzahl der Farben"
#: ../src/ui/dialog/tracedialog.cpp:586
msgid "_Colors:"
@@ -21776,11 +21882,11 @@ msgstr "Angegebene Anzahl von Helligkeitsstufen nachzeichnen"
#: ../src/ui/dialog/tracedialog.cpp:621
msgid "Sc_ans:"
-msgstr "Sc_andurchgÀnge:"
+msgstr "_Abtastungen:"
#: ../src/ui/dialog/tracedialog.cpp:625
msgid "The desired number of scans"
-msgstr "GewĂŒnschte Anzahl von ScandurchgĂ€ngen"
+msgstr "GewĂŒnschte Anzahl von Abtastungen"
#: ../src/ui/dialog/tracedialog.cpp:630
msgid "Co_lors"
@@ -21788,7 +21894,7 @@ msgstr "_Farben"
#: ../src/ui/dialog/tracedialog.cpp:634
msgid "Trace the given number of reduced colors"
-msgstr "Nachzeichnen auf angegebene Anzahl von Farben beschrÀnken"
+msgstr "Angegebene Anzahl von Farben nachzeichnen"
#: ../src/ui/dialog/tracedialog.cpp:639
msgid "_Grays"
@@ -21796,7 +21902,7 @@ msgstr "_Graustufen"
#: ../src/ui/dialog/tracedialog.cpp:643
msgid "Same as Colors, but the result is converted to grayscale"
-msgstr "Wie bei »Farben«, aber Ergebnis in Graustufen konvertieren"
+msgstr "Wie „Farben“, jedoch wird das Ergebnis in Graustufen konvertiert"
#. TRANSLATORS: "Smooth" is a verb here
#: ../src/ui/dialog/tracedialog.cpp:649
@@ -21810,15 +21916,15 @@ msgstr "Gaußschen Weichzeichner vor dem Nachzeichnen anwenden"
#. TRANSLATORS: "Stack" is a verb here
#: ../src/ui/dialog/tracedialog.cpp:657
msgid "Stac_k scans"
-msgstr "S_cans stapeln"
+msgstr "Abtastungen stapeln"
#: ../src/ui/dialog/tracedialog.cpp:661
msgid ""
"Stack scans on top of one another (no gaps) instead of tiling (usually with "
"gaps)"
msgstr ""
-"Scans ĂŒbereinander stapeln (ohne ZwischenrĂ€ume) anstatt zu kacheln (meist "
-"mit ZwischenrÀumen)"
+"Abtastungen ĂŒbereinander stapeln (keine LĂŒcken) anstatt zu kacheln (meist "
+"mit LĂŒcken)"
#: ../src/ui/dialog/tracedialog.cpp:665
msgid "Remo_ve background"
@@ -21831,13 +21937,13 @@ msgstr "Unterste Ebene (Hintergrund) nach Fertigstellung entfernen"
#: ../src/ui/dialog/tracedialog.cpp:675
msgid "Multiple scans: creates a group of paths"
-msgstr "Mehrfache Scans: Gruppen von Pfaden erzeugen"
+msgstr "Mehrfache Abtastungen: Gruppen von Pfaden erzeugen"
#. # end multiple scan
#. ## end mode page
#: ../src/ui/dialog/tracedialog.cpp:684
msgid "_Mode"
-msgstr "_Modus"
+msgstr "_Methode"
#. ## begin option page
#. # potrace parameters
@@ -21867,7 +21973,7 @@ msgstr "Scharfe Ecken der Nachzeichnung glÀtten"
#: ../src/ui/dialog/tracedialog.cpp:719
msgid "Increase this to smooth corners more"
-msgstr "Erhöhen, um Ecken zu glÀtten"
+msgstr "Erhöhen, um Ecken stÀrker zu glÀtten"
#: ../src/ui/dialog/tracedialog.cpp:726
msgid "Optimize p_aths"
@@ -21876,7 +21982,8 @@ msgstr "Pf_ade optimieren"
#: ../src/ui/dialog/tracedialog.cpp:729
msgid "Try to optimize paths by joining adjacent Bezier curve segments"
msgstr ""
-"Versuchen, Pfade durch Verbinden von Bézierkurvenabschnitten zu optimieren"
+"Versuchen, Pfade durch Verbinden von benachbarten Abschnitten der "
+"Bézierkurve zu optimieren"
#: ../src/ui/dialog/tracedialog.cpp:737
msgid ""
@@ -21905,7 +22012,7 @@ msgid ""
"\n"
"http://potrace.sourceforge.net"
msgstr ""
-"Inkscapes Vektorrasterisierung\n"
+"Inkscapes Rastervektorisierung\n"
"basiert auf Potrace,\n"
"entwickelt von Peter Selinger\n"
"\n"
@@ -22129,12 +22236,12 @@ msgid "nodeAsInXMLdialogTooltip|Delete node"
msgstr "Knoten löschen"
#: ../src/ui/dialog/xml-tree.cpp:73 ../src/ui/dialog/xml-tree.cpp:138
-#: ../src/ui/dialog/xml-tree.cpp:977
+#: ../src/ui/dialog/xml-tree.cpp:985
msgid "Duplicate node"
msgstr "Knoten duplizieren"
-#: ../src/ui/dialog/xml-tree.cpp:79 ../src/ui/dialog/xml-tree.cpp:191
-#: ../src/ui/dialog/xml-tree.cpp:1013
+#: ../src/ui/dialog/xml-tree.cpp:79 ../src/ui/dialog/xml-tree.cpp:199
+#: ../src/ui/dialog/xml-tree.cpp:1021
msgid "Delete attribute"
msgstr "Attribut löschen"
@@ -22146,43 +22253,43 @@ msgstr "Setzen"
msgid "Drag to reorder nodes"
msgstr "Ziehen, um die Knoten neu zu sortieren"
-#: ../src/ui/dialog/xml-tree.cpp:152 ../src/ui/dialog/xml-tree.cpp:153
-#: ../src/ui/dialog/xml-tree.cpp:1135
+#: ../src/ui/dialog/xml-tree.cpp:154 ../src/ui/dialog/xml-tree.cpp:155
+#: ../src/ui/dialog/xml-tree.cpp:1143
msgid "Unindent node"
msgstr "EinrĂŒckung des Knotens verringern"
-#: ../src/ui/dialog/xml-tree.cpp:157 ../src/ui/dialog/xml-tree.cpp:158
-#: ../src/ui/dialog/xml-tree.cpp:1113
+#: ../src/ui/dialog/xml-tree.cpp:161 ../src/ui/dialog/xml-tree.cpp:162
+#: ../src/ui/dialog/xml-tree.cpp:1121
msgid "Indent node"
msgstr "Knoten einrĂŒcken"
-#: ../src/ui/dialog/xml-tree.cpp:162 ../src/ui/dialog/xml-tree.cpp:163
-#: ../src/ui/dialog/xml-tree.cpp:1064
+#: ../src/ui/dialog/xml-tree.cpp:168 ../src/ui/dialog/xml-tree.cpp:169
+#: ../src/ui/dialog/xml-tree.cpp:1072
msgid "Raise node"
msgstr "Knoten anheben"
-#: ../src/ui/dialog/xml-tree.cpp:167 ../src/ui/dialog/xml-tree.cpp:168
-#: ../src/ui/dialog/xml-tree.cpp:1082
+#: ../src/ui/dialog/xml-tree.cpp:175 ../src/ui/dialog/xml-tree.cpp:176
+#: ../src/ui/dialog/xml-tree.cpp:1090
msgid "Lower node"
msgstr "Knoten absenken"
-#: ../src/ui/dialog/xml-tree.cpp:208
+#: ../src/ui/dialog/xml-tree.cpp:216
msgid "Attribute name"
msgstr "Attributname"
-#: ../src/ui/dialog/xml-tree.cpp:223
+#: ../src/ui/dialog/xml-tree.cpp:231
msgid "Attribute value"
msgstr "Attributwert"
-#: ../src/ui/dialog/xml-tree.cpp:311
+#: ../src/ui/dialog/xml-tree.cpp:319
msgid "<b>Click</b> to select nodes, <b>drag</b> to rearrange."
msgstr "<b>Klick</b> wÀhlt Knoten aus, <b>Ziehen</b> ordnet neu an."
-#: ../src/ui/dialog/xml-tree.cpp:322
+#: ../src/ui/dialog/xml-tree.cpp:330
msgid "<b>Click</b> attribute to edit."
msgstr "<b>Klick</b> auf Attribut zum Bearbeiten."
-#: ../src/ui/dialog/xml-tree.cpp:326
+#: ../src/ui/dialog/xml-tree.cpp:334
#, c-format
msgid ""
"Attribute <b>%s</b> selected. Press <b>Ctrl+Enter</b> when done editing to "
@@ -22191,31 +22298,31 @@ msgstr ""
"Attribut <b>%s</b> ausgewĂ€hlt. <b>Strg+Eingabe</b> schließt ab und ĂŒbernimmt "
"Änderungen."
-#: ../src/ui/dialog/xml-tree.cpp:566
+#: ../src/ui/dialog/xml-tree.cpp:574
msgid "Drag XML subtree"
msgstr "XML-Unterbaum ziehen"
-#: ../src/ui/dialog/xml-tree.cpp:868
+#: ../src/ui/dialog/xml-tree.cpp:876
msgid "New element node..."
msgstr "Neuer Elementknoten..."
-#: ../src/ui/dialog/xml-tree.cpp:906
+#: ../src/ui/dialog/xml-tree.cpp:914
msgid "Cancel"
msgstr "Abbrechen"
-#: ../src/ui/dialog/xml-tree.cpp:943
+#: ../src/ui/dialog/xml-tree.cpp:951
msgid "Create new element node"
msgstr "Neuen Elementknoten erzeugen"
-#: ../src/ui/dialog/xml-tree.cpp:959
+#: ../src/ui/dialog/xml-tree.cpp:967
msgid "Create new text node"
msgstr "Neuen Textknoten erzeugen"
-#: ../src/ui/dialog/xml-tree.cpp:994
+#: ../src/ui/dialog/xml-tree.cpp:1002
msgid "nodeAsInXMLinHistoryDialog|Delete node"
msgstr "Knoten löschen"
-#: ../src/ui/dialog/xml-tree.cpp:1038
+#: ../src/ui/dialog/xml-tree.cpp:1046
msgid "Change attribute"
msgstr "Attribut Àndern"
@@ -22289,10 +22396,10 @@ msgid ""
"\n"
"The file already exists in \"%s\". Replacing it will overwrite its contents."
msgstr ""
-"<span weight=\"bold\" size=\"larger\">Eine Datei namens »%s« existiert "
+"<span weight=\"bold\" size=\"larger\">Eine Datei namens „%s“ existiert "
"bereits. Soll sie ersetzt werden?</span>\n"
"\n"
-"Die Datei existiert bereits in »%s«. Sie zu ersetzen wird ihren Inhalt "
+"Die Datei existiert bereits in „%s“. Sie zu ersetzen wird ihren Inhalt "
"ĂŒberschreiben."
#: ../src/ui/interface.cpp:1393 ../share/extensions/web-set-att.inx.h:21
@@ -22464,7 +22571,7 @@ msgstr "_Text und Schriftart..."
msgid "Check Spellin_g..."
msgstr "RechtschreibprĂŒfun_g..."
-#: ../src/ui/object-edit.cpp:456
+#: ../src/ui/object-edit.cpp:464
msgid ""
"Adjust the <b>horizontal rounding</b> radius; with <b>Ctrl</b> to make the "
"vertical radius the same"
@@ -22472,7 +22579,7 @@ msgstr ""
"Radius der <b>horizontalen Rundung</b> anpassen; <b>Strg</b> setzt vertikale "
"und horizontale Rundung gleich"
-#: ../src/ui/object-edit.cpp:461
+#: ../src/ui/object-edit.cpp:469
msgid ""
"Adjust the <b>vertical rounding</b> radius; with <b>Ctrl</b> to make the "
"horizontal radius the same"
@@ -22480,7 +22587,7 @@ msgstr ""
"Radius der <b>vertikalen Rundung</b> anpassen; <b>Strg</b> setzt vertikale "
"und horizontale Rundung gleich"
-#: ../src/ui/object-edit.cpp:466 ../src/ui/object-edit.cpp:471
+#: ../src/ui/object-edit.cpp:474 ../src/ui/object-edit.cpp:479
msgid ""
"Adjust the <b>width and height</b> of the rectangle; with <b>Ctrl</b> to "
"lock ratio or stretch in one dimension only"
@@ -22488,8 +22595,8 @@ msgstr ""
"<b>Höhe/Breite</b> des Rechtecks anpassen; <b>Strg</b> um SeitenverhÀltnis "
"bei zu behalten oder nur in eine Richtung zu strecken"
-#: ../src/ui/object-edit.cpp:718 ../src/ui/object-edit.cpp:722
#: ../src/ui/object-edit.cpp:726 ../src/ui/object-edit.cpp:730
+#: ../src/ui/object-edit.cpp:734 ../src/ui/object-edit.cpp:738
msgid ""
"Resize box in X/Y direction; with <b>Shift</b> along the Z axis; with "
"<b>Ctrl</b> to constrain to the directions of edges or diagonals"
@@ -22497,8 +22604,8 @@ msgstr ""
"GrĂ¶ĂŸe der Box in X/Y-Richtung Ă€ndern; mit <b>Umschalt</b> entlang der Z-"
"Achse; Mit <b>Strg</b> auf Richtung der Seiten oder Diagonalen beschrÀnkt"
-#: ../src/ui/object-edit.cpp:734 ../src/ui/object-edit.cpp:738
#: ../src/ui/object-edit.cpp:742 ../src/ui/object-edit.cpp:746
+#: ../src/ui/object-edit.cpp:750 ../src/ui/object-edit.cpp:754
msgid ""
"Resize box along the Z axis; with <b>Shift</b> in X/Y direction; with "
"<b>Ctrl</b> to constrain to the directions of edges or diagonals"
@@ -22506,20 +22613,20 @@ msgstr ""
"GrĂ¶ĂŸe der Box entlang der Z-Achse Ă€ndern; mit <b>Umschalt</b> in X/Y-"
"Richtung; Mit <b>Strg</b> auf Richtung der Seiten und Diagonalen beschrÀnkt"
-#: ../src/ui/object-edit.cpp:750
+#: ../src/ui/object-edit.cpp:758
msgid "Move the box in perspective"
msgstr "Bewegen der Box in der Perspektive"
-#: ../src/ui/object-edit.cpp:989
+#: ../src/ui/object-edit.cpp:997
msgid "Adjust ellipse <b>width</b>, with <b>Ctrl</b> to make circle"
msgstr ""
"<b>Höhe/Breite</b> der Ellipse anpassen; <b>Strg</b> erzeugt einen Kreis"
-#: ../src/ui/object-edit.cpp:993
+#: ../src/ui/object-edit.cpp:1001
msgid "Adjust ellipse <b>height</b>, with <b>Ctrl</b> to make circle"
msgstr "<b>Höhe</b> der Ellipse anpassen; <b>Strg</b> erzeugt einen Kreis"
-#: ../src/ui/object-edit.cpp:997
+#: ../src/ui/object-edit.cpp:1005
msgid ""
"Position the <b>start point</b> of the arc or segment; with <b>Ctrl</b> to "
"snap angle; drag <b>inside</b> the ellipse for arc, <b>outside</b> for "
@@ -22529,7 +22636,7 @@ msgstr ""
"den Winkel ein; ziehen <b>innerhalb</b> der Ellipse erzeugt einen Kreisbogen "
"- <b>außerhalb</b> ein Kreissegment"
-#: ../src/ui/object-edit.cpp:1002
+#: ../src/ui/object-edit.cpp:1010
msgid ""
"Position the <b>end point</b> of the arc or segment; with <b>Ctrl</b> to "
"snap angle; drag <b>inside</b> the ellipse for arc, <b>outside</b> for "
@@ -22539,7 +22646,7 @@ msgstr ""
"ein; Ziehen <b>innerhalb</b> der Ellipse erzeugt einen Kreisbogen - "
"<b>außerhalb</b> ein Kreissegment"
-#: ../src/ui/object-edit.cpp:1148
+#: ../src/ui/object-edit.cpp:1156
msgid ""
"Adjust the <b>tip radius</b> of the star or polygon; with <b>Shift</b> to "
"round; with <b>Alt</b> to randomize"
@@ -22547,7 +22654,7 @@ msgstr ""
"<b>Spitzen</b> des Sterns oder Polygons anpassen; <b>Umschalt</b> rundet ab; "
"<b>Alt</b> verÀndert nach Zufall"
-#: ../src/ui/object-edit.cpp:1156
+#: ../src/ui/object-edit.cpp:1164
msgid ""
"Adjust the <b>base radius</b> of the star; with <b>Ctrl</b> to keep star "
"rays radial (no skew); with <b>Shift</b> to round; with <b>Alt</b> to "
@@ -22557,7 +22664,7 @@ msgstr ""
"Ausrichtung der Spitzen; <b>Umschalt</b> rundet; <b>Alt</b> verÀndert "
"zufÀllig"
-#: ../src/ui/object-edit.cpp:1351
+#: ../src/ui/object-edit.cpp:1359
msgid ""
"Roll/unroll the spiral from <b>inside</b>; with <b>Ctrl</b> to snap angle; "
"with <b>Alt</b> to converge/diverge"
@@ -22565,7 +22672,7 @@ msgstr ""
"Spirale von <b>innen</b> einrollen/ausrollen; Winkel mit <b>Strg</b> "
"einrasten; <b>Alt</b> konvergiert/divergiert"
-#: ../src/ui/object-edit.cpp:1355
+#: ../src/ui/object-edit.cpp:1363
msgid ""
"Roll/unroll the spiral from <b>outside</b>; with <b>Ctrl</b> to snap angle; "
"with <b>Shift</b> to scale/rotate; with <b>Alt</b> to lock radius"
@@ -22573,11 +22680,11 @@ msgstr ""
"Spirale von <b>außen</b> ausrollen/einrollen; Winkel mit <b>Strg</b> "
"einrasten; <b>Umschalt</b> skaliert/rotiert; mit <b>Alt</b> Radius sperren"
-#: ../src/ui/object-edit.cpp:1402
+#: ../src/ui/object-edit.cpp:1410
msgid "Adjust the <b>offset distance</b>"
msgstr "<b>Versatz-Abstand</b> anpassen"
-#: ../src/ui/object-edit.cpp:1439
+#: ../src/ui/object-edit.cpp:1447
msgid "Drag to resize the <b>flowed text frame</b>"
msgstr "Ziehen, um die GrĂ¶ĂŸe des <b>Fließtext-Rahmens</b> zu Ă€ndern"
@@ -23146,7 +23253,7 @@ msgstr ""
"FĂŒhrungspfad. <b>Pfeiltasten</b> verĂ€ndern Breite (links/rechts) und Winkel "
"(hoch/runter)."
-#: ../src/ui/tools-switch.cpp:107 ../src/ui/tools/text-tool.cpp:1593
+#: ../src/ui/tools-switch.cpp:107 ../src/ui/tools/text-tool.cpp:1584
msgid ""
"<b>Click</b> to select or create text, <b>drag</b> to create flowed text; "
"then type."
@@ -23182,7 +23289,7 @@ msgstr ""
msgid "<b>Drag</b> to measure the dimensions of objects."
msgstr "<b>Ziehen</b> um die Dimensionen von Objekten zu messen."
-#: ../src/ui/tools-switch.cpp:112 ../src/ui/tools/dropper-tool.cpp:285
+#: ../src/ui/tools-switch.cpp:112 ../src/ui/tools/dropper-tool.cpp:275
msgid ""
"<b>Click</b> to set fill, <b>Shift+click</b> to set stroke; <b>drag</b> to "
"average color in area; with <b>Alt</b> to pick inverse color; <b>Ctrl+C</b> "
@@ -23215,18 +23322,18 @@ msgstr "<b>Ziehen</b> zum Radieren."
msgid "Choose a subtool from the toolbar"
msgstr "WĂ€hlen Sie ein Werkzeug aus der Werkzeugleiste"
-#: ../src/ui/tools/arc-tool.cpp:252
+#: ../src/ui/tools/arc-tool.cpp:242
msgid ""
"<b>Ctrl</b>: make circle or integer-ratio ellipse, snap arc/segment angle"
msgstr ""
"<b>Strg</b>: Kreis oder Ellipse mit ganzzahligem Höhen-/BreitenverhÀltnis "
"erzeugen, Winkel vom Bogen/Kreissegment einrasten"
-#: ../src/ui/tools/arc-tool.cpp:253 ../src/ui/tools/rect-tool.cpp:289
+#: ../src/ui/tools/arc-tool.cpp:243 ../src/ui/tools/rect-tool.cpp:279
msgid "<b>Shift</b>: draw around the starting point"
msgstr "<b>Umschalt</b>: Um Mittelpunkt zeichnen"
-#: ../src/ui/tools/arc-tool.cpp:422
+#: ../src/ui/tools/arc-tool.cpp:412
#, c-format
msgid ""
"<b>Ellipse</b>: %s &#215; %s (constrained to ratio %d:%d); with <b>Shift</b> "
@@ -23235,7 +23342,7 @@ msgstr ""
"<b>Ellipse</b>: %s &#215; %s (festes AchsenverhÀltnis %d:%d); <b>Umschalt</"
"b> zeichnet um Startpunkt"
-#: ../src/ui/tools/arc-tool.cpp:424
+#: ../src/ui/tools/arc-tool.cpp:414
#, c-format
msgid ""
"<b>Ellipse</b>: %s &#215; %s; with <b>Ctrl</b> to make square or integer-"
@@ -23244,157 +23351,157 @@ msgstr ""
"<b>Ellipse</b>: %s &#215; %s; <b>Strg</b> drĂŒcken fĂŒr ganzzahliges "
"VerhÀltnis der Radien; <b>Umschalt</b> zeichnet um Startpunkt"
-#: ../src/ui/tools/arc-tool.cpp:447
+#: ../src/ui/tools/arc-tool.cpp:437
msgid "Create ellipse"
msgstr "Ellipse erzeugen"
-#: ../src/ui/tools/box3d-tool.cpp:370 ../src/ui/tools/box3d-tool.cpp:377
-#: ../src/ui/tools/box3d-tool.cpp:384 ../src/ui/tools/box3d-tool.cpp:391
-#: ../src/ui/tools/box3d-tool.cpp:398 ../src/ui/tools/box3d-tool.cpp:405
+#: ../src/ui/tools/box3d-tool.cpp:360 ../src/ui/tools/box3d-tool.cpp:367
+#: ../src/ui/tools/box3d-tool.cpp:374 ../src/ui/tools/box3d-tool.cpp:381
+#: ../src/ui/tools/box3d-tool.cpp:388 ../src/ui/tools/box3d-tool.cpp:395
msgid "Change perspective (angle of PLs)"
msgstr "Perspektive Àndern (Winkel der Perspektivlinien)"
#. status text
-#: ../src/ui/tools/box3d-tool.cpp:583
+#: ../src/ui/tools/box3d-tool.cpp:573
msgid "<b>3D Box</b>; with <b>Shift</b> to extrude along the Z axis"
msgstr "<b>3D Box</b>; <b>Umschalt</b> um in Z-Richtung zu vergrĂ¶ĂŸern"
-#: ../src/ui/tools/box3d-tool.cpp:609
+#: ../src/ui/tools/box3d-tool.cpp:599
msgid "Create 3D box"
msgstr "3D-Quader erzeugen"
-#: ../src/ui/tools/calligraphic-tool.cpp:536
+#: ../src/ui/tools/calligraphic-tool.cpp:526
msgid ""
"<b>Guide path selected</b>; start drawing along the guide with <b>Ctrl</b>"
msgstr ""
"<b>FĂŒhrungspfad ausgewĂ€hlt</b>; starte Zeichnen entlang der FĂŒhrung mit "
"<b>Strg</b>"
-#: ../src/ui/tools/calligraphic-tool.cpp:538
+#: ../src/ui/tools/calligraphic-tool.cpp:528
msgid "<b>Select a guide path</b> to track with <b>Ctrl</b>"
msgstr "<b>FĂŒhrungspfad auswĂ€hlen</b> mit <b>Strg</b>"
-#: ../src/ui/tools/calligraphic-tool.cpp:673
+#: ../src/ui/tools/calligraphic-tool.cpp:663
msgid "Tracking: <b>connection to guide path lost!</b>"
msgstr "Verfolgen: <b>Verbindung zum FĂŒhrungspfad verloren!</b>"
-#: ../src/ui/tools/calligraphic-tool.cpp:673
+#: ../src/ui/tools/calligraphic-tool.cpp:663
msgid "<b>Tracking</b> a guide path"
msgstr "<b>Verfolge</b> einen FĂŒhrungspfad"
-#: ../src/ui/tools/calligraphic-tool.cpp:676
+#: ../src/ui/tools/calligraphic-tool.cpp:666
msgid "<b>Drawing</b> a calligraphic stroke"
msgstr "<b>Zeichne</b> einen kalligrafischen Strich"
-#: ../src/ui/tools/calligraphic-tool.cpp:977
+#: ../src/ui/tools/calligraphic-tool.cpp:967
msgid "Draw calligraphic stroke"
msgstr "Kalligrafischen Strich zeichnen"
-#: ../src/ui/tools/connector-tool.cpp:499
+#: ../src/ui/tools/connector-tool.cpp:489
msgid "Creating new connector"
msgstr "Einen neuen Objektverbinder erzeugen"
-#: ../src/ui/tools/connector-tool.cpp:740
+#: ../src/ui/tools/connector-tool.cpp:730
msgid "Connector endpoint drag cancelled."
msgstr "Ziehen von Verbinder-Endpunkten abgebrochen."
-#: ../src/ui/tools/connector-tool.cpp:783
+#: ../src/ui/tools/connector-tool.cpp:773
msgid "Reroute connector"
msgstr "Objektverbinder neu verlegen"
-#: ../src/ui/tools/connector-tool.cpp:936
+#: ../src/ui/tools/connector-tool.cpp:926
msgid "Create connector"
msgstr "Objektverbinder erzeugen"
# !!!
-#: ../src/ui/tools/connector-tool.cpp:953
+#: ../src/ui/tools/connector-tool.cpp:943
msgid "Finishing connector"
msgstr "Beende Objektverbinder"
-#: ../src/ui/tools/connector-tool.cpp:1191
+#: ../src/ui/tools/connector-tool.cpp:1181
msgid "<b>Connector endpoint</b>: drag to reroute or connect to new shapes"
msgstr ""
"<b>Objektverbinder-Endpunkt</b>: ziehen, um neu zu verlegen oder mit neuen "
"Formen zu verbinden"
-#: ../src/ui/tools/connector-tool.cpp:1336
+#: ../src/ui/tools/connector-tool.cpp:1326
msgid "Select <b>at least one non-connector object</b>."
msgstr "<b>Mindestens ein Objekt</b> auswÀhlen, das kein Objektverbinder ist."
-#: ../src/ui/tools/connector-tool.cpp:1341
+#: ../src/ui/tools/connector-tool.cpp:1331
#: ../src/widgets/connector-toolbar.cpp:314
msgid "Make connectors avoid selected objects"
msgstr "Objektverbinder weichen den ausgewÀhlten Objekten aus"
-#: ../src/ui/tools/connector-tool.cpp:1342
+#: ../src/ui/tools/connector-tool.cpp:1332
#: ../src/widgets/connector-toolbar.cpp:324
msgid "Make connectors ignore selected objects"
msgstr "Objektverbinder ignorieren die ausgewÀhlten Objekte"
#. alpha of color under cursor, to show in the statusbar
#. locale-sensitive printf is OK, since this goes to the UI, not into SVG
-#: ../src/ui/tools/dropper-tool.cpp:281
+#: ../src/ui/tools/dropper-tool.cpp:271
#, c-format
msgid " alpha %.3g"
msgstr " Alpha %.3g"
#. where the color is picked, to show in the statusbar
-#: ../src/ui/tools/dropper-tool.cpp:283
+#: ../src/ui/tools/dropper-tool.cpp:273
#, c-format
msgid ", averaged with radius %d"
msgstr ", gemittelt mit Radius %d"
-#: ../src/ui/tools/dropper-tool.cpp:283
+#: ../src/ui/tools/dropper-tool.cpp:273
msgid " under cursor"
msgstr " unter Mauszeiger"
#. message, to show in the statusbar
-#: ../src/ui/tools/dropper-tool.cpp:285
+#: ../src/ui/tools/dropper-tool.cpp:275
msgid "<b>Release mouse</b> to set color."
msgstr "<b>Maustaste loslassen</b>, um die Farbe zu ĂŒbernehmen."
-#: ../src/ui/tools/dropper-tool.cpp:333
+#: ../src/ui/tools/dropper-tool.cpp:323
msgid "Set picked color"
msgstr "Übernommene Farbe setzen"
-#: ../src/ui/tools/eraser-tool.cpp:437
+#: ../src/ui/tools/eraser-tool.cpp:427
msgid "<b>Drawing</b> an eraser stroke"
msgstr "<b>Zeichne</b> einen Löschstrich"
-#: ../src/ui/tools/eraser-tool.cpp:770
+#: ../src/ui/tools/eraser-tool.cpp:760
msgid "Draw eraser stroke"
msgstr "Radierer-Pfad zeichnen"
-#: ../src/ui/tools/flood-tool.cpp:192
+#: ../src/ui/tools/flood-tool.cpp:182
msgid "Visible Colors"
msgstr "Sichtbare Farben"
# CHECK
-#: ../src/ui/tools/flood-tool.cpp:210
+#: ../src/ui/tools/flood-tool.cpp:200
msgctxt "Flood autogap"
msgid "None"
msgstr "Keine"
-#: ../src/ui/tools/flood-tool.cpp:211
+#: ../src/ui/tools/flood-tool.cpp:201
msgctxt "Flood autogap"
msgid "Small"
msgstr "Klein"
-#: ../src/ui/tools/flood-tool.cpp:212
+#: ../src/ui/tools/flood-tool.cpp:202
msgctxt "Flood autogap"
msgid "Medium"
msgstr "Mittel"
-#: ../src/ui/tools/flood-tool.cpp:213
+#: ../src/ui/tools/flood-tool.cpp:203
msgctxt "Flood autogap"
msgid "Large"
msgstr "Groß"
-#: ../src/ui/tools/flood-tool.cpp:435
+#: ../src/ui/tools/flood-tool.cpp:425
msgid "<b>Too much inset</b>, the result is empty."
msgstr "<b>Zu viel Schrumpfung</b>, das Ergebnis ist leer."
-#: ../src/ui/tools/flood-tool.cpp:476
+#: ../src/ui/tools/flood-tool.cpp:466
#, c-format
msgid ""
"Area filled, path with <b>%d</b> node created and unioned with selection."
@@ -23407,18 +23514,18 @@ msgstr[1] ""
"Gebiet gefĂŒllt, Pfad mit <b>%d</b> Knoten erzeugt und mit der Auswahl "
"vereinigt."
-#: ../src/ui/tools/flood-tool.cpp:482
+#: ../src/ui/tools/flood-tool.cpp:472
#, c-format
msgid "Area filled, path with <b>%d</b> node created."
msgid_plural "Area filled, path with <b>%d</b> nodes created."
msgstr[0] "Gebiet gefĂŒllt, Pfad mit <b>%d</b> Knoten erzeugt."
msgstr[1] "Gebiet gefĂŒllt, Pfad mit <b>%d</b> Knoten erzeugt."
-#: ../src/ui/tools/flood-tool.cpp:750 ../src/ui/tools/flood-tool.cpp:1060
+#: ../src/ui/tools/flood-tool.cpp:740 ../src/ui/tools/flood-tool.cpp:1050
msgid "<b>Area is not bounded</b>, cannot fill."
msgstr "<b>Gebiet ist nicht abgegrenzt</b>, kann nicht fĂŒllen."
-#: ../src/ui/tools/flood-tool.cpp:1065
+#: ../src/ui/tools/flood-tool.cpp:1055
msgid ""
"<b>Only the visible part of the bounded area was filled.</b> If you want to "
"fill all of the area, undo, zoom out, and fill again."
@@ -23427,15 +23534,15 @@ msgstr ""
"Sie das gesamte Gebiet fĂŒllen wollen, dann machen Sie rĂŒckgĂ€ngig, zoomen "
"heraus, und fĂŒllen Sie noch einmal."
-#: ../src/ui/tools/flood-tool.cpp:1083 ../src/ui/tools/flood-tool.cpp:1234
+#: ../src/ui/tools/flood-tool.cpp:1073 ../src/ui/tools/flood-tool.cpp:1224
msgid "Fill bounded area"
msgstr "FĂŒlle abgegrenztes Gebiet"
-#: ../src/ui/tools/flood-tool.cpp:1099
+#: ../src/ui/tools/flood-tool.cpp:1089
msgid "Set style on object"
msgstr "Stil auf Objekte anwenden"
-#: ../src/ui/tools/flood-tool.cpp:1159
+#: ../src/ui/tools/flood-tool.cpp:1149
msgid "<b>Draw over</b> areas to add to fill, hold <b>Alt</b> for touch fill"
msgstr ""
"<b>Zeichne ĂŒber</b> FlĂ€chen um zur FĂŒllung hinzuzufĂŒgen, <b>Alt</b> fĂŒr "
@@ -23464,31 +23571,31 @@ msgid "Create single dot"
msgstr "Einen einzelnen Punkt erzeugen"
#. TRANSLATORS: %s will be substituted with the point name (see previous messages); This is part of a compound message
-#: ../src/ui/tools/gradient-tool.cpp:131 ../src/ui/tools/mesh-tool.cpp:130
+#: ../src/ui/tools/gradient-tool.cpp:121 ../src/ui/tools/mesh-tool.cpp:120
#, c-format
msgid "%s selected"
msgstr "%s ausgewÀhlt"
#. TRANSLATORS: Mind the space in front. This is part of a compound message
-#: ../src/ui/tools/gradient-tool.cpp:133 ../src/ui/tools/gradient-tool.cpp:142
+#: ../src/ui/tools/gradient-tool.cpp:123 ../src/ui/tools/gradient-tool.cpp:132
#, c-format
msgid " out of %d gradient handle"
msgid_plural " out of %d gradient handles"
-msgstr[0] " von %d Farbverlaufs-Anfasser gewÀhlt"
-msgstr[1] " von %d Farbverlaufs-Anfassern gewÀhlt"
+msgstr[0] " von %d Farbverlaufs-Anfasser"
+msgstr[1] " von %d Farbverlaufs-Anfassern"
#. TRANSLATORS: Mind the space in front. (Refers to gradient handles selected). This is part of a compound message
-#: ../src/ui/tools/gradient-tool.cpp:134 ../src/ui/tools/gradient-tool.cpp:143
-#: ../src/ui/tools/gradient-tool.cpp:150 ../src/ui/tools/mesh-tool.cpp:133
-#: ../src/ui/tools/mesh-tool.cpp:144 ../src/ui/tools/mesh-tool.cpp:152
+#: ../src/ui/tools/gradient-tool.cpp:124 ../src/ui/tools/gradient-tool.cpp:133
+#: ../src/ui/tools/gradient-tool.cpp:140 ../src/ui/tools/mesh-tool.cpp:123
+#: ../src/ui/tools/mesh-tool.cpp:134 ../src/ui/tools/mesh-tool.cpp:142
#, c-format
msgid " on %d selected object"
msgid_plural " on %d selected objects"
-msgstr[0] "auf %d gewÀhltes Objekt"
-msgstr[1] "auf %d gewÀhlte Objekte"
+msgstr[0] " auf %d ausgewÀhlten Objekt"
+msgstr[1] " auf %d ausgewÀhlten Objekten"
#. TRANSLATORS: This is a part of a compound message (out of two more indicating: grandint handle count & object count)
-#: ../src/ui/tools/gradient-tool.cpp:140 ../src/ui/tools/mesh-tool.cpp:140
+#: ../src/ui/tools/gradient-tool.cpp:130 ../src/ui/tools/mesh-tool.cpp:130
#, c-format
msgid ""
"One handle merging %d stop (drag with <b>Shift</b> to separate) selected"
@@ -23500,121 +23607,122 @@ msgstr[1] ""
"trennt)"
#. TRANSLATORS: The plural refers to number of selected gradient handles. This is part of a compound message (part two indicates selected object count)
-#: ../src/ui/tools/gradient-tool.cpp:148
+#: ../src/ui/tools/gradient-tool.cpp:138
#, c-format
msgid "<b>%d</b> gradient handle selected out of %d"
msgid_plural "<b>%d</b> gradient handles selected out of %d"
-msgstr[0] "<b>%d</b> Verlaufs-Handle von %d ausgewÀhlt"
-msgstr[1] "<b>%d</b> Verlaufs-Handles von %d ausgewÀhlt"
+msgstr[0] "<b>%d</b> Verlaufs-Anfasser von %d ausgewÀhlt"
+msgstr[1] "<b>%d</b> Verlaufs-Anfasser von %d ausgewÀhlt"
#. TRANSLATORS: The plural refers to number of selected objects
-#: ../src/ui/tools/gradient-tool.cpp:155
+#: ../src/ui/tools/gradient-tool.cpp:145
#, c-format
msgid "<b>No</b> gradient handles selected out of %d on %d selected object"
msgid_plural ""
"<b>No</b> gradient handles selected out of %d on %d selected objects"
msgstr[0] ""
-"<b>Kein</b> Verlaufs-Handle von %d ausgewÀhlt bei %d markiertem Objekt"
+"Von %d Verlaufs-Anfassern <b>keiner</b> ausgewÀhlt bei %d ausgewÀhlten Objekt"
msgstr[1] ""
-"<b>Keine</b> Verlaufs-Handles von %d ausgewÀhlt bei %d markierten Objekten"
+"Von %d Verlaufs-Anfassern <b>keiner</b> ausgewÀhlt bei %d ausgewÀhlten "
+"Objekten"
-#: ../src/ui/tools/gradient-tool.cpp:443
+#: ../src/ui/tools/gradient-tool.cpp:433
msgid "Simplify gradient"
msgstr "Farbverlauf vereinfachen"
-#: ../src/ui/tools/gradient-tool.cpp:519
+#: ../src/ui/tools/gradient-tool.cpp:509
msgid "Create default gradient"
msgstr "Standard-Farbverlauf erzeugen"
-#: ../src/ui/tools/gradient-tool.cpp:578 ../src/ui/tools/mesh-tool.cpp:570
+#: ../src/ui/tools/gradient-tool.cpp:568 ../src/ui/tools/mesh-tool.cpp:560
msgid "<b>Draw around</b> handles to select them"
msgstr "<b>Zeichne um</b> Anfasser um diese auszuwÀhlen"
-#: ../src/ui/tools/gradient-tool.cpp:701
+#: ../src/ui/tools/gradient-tool.cpp:691
msgid "<b>Ctrl</b>: snap gradient angle"
msgstr "<b>Strg</b>: Winkel des Farbverlaufs einrasten"
-#: ../src/ui/tools/gradient-tool.cpp:702
+#: ../src/ui/tools/gradient-tool.cpp:692
msgid "<b>Shift</b>: draw gradient around the starting point"
msgstr "<b>Umschalt</b>: Farbverlauf ausgehend vom Mittelpunkt zeichnen"
-#: ../src/ui/tools/gradient-tool.cpp:956 ../src/ui/tools/mesh-tool.cpp:993
+#: ../src/ui/tools/gradient-tool.cpp:946 ../src/ui/tools/mesh-tool.cpp:983
#, c-format
msgid "<b>Gradient</b> for %d object; with <b>Ctrl</b> to snap angle"
msgid_plural "<b>Gradient</b> for %d objects; with <b>Ctrl</b> to snap angle"
msgstr[0] "<b>Farbverlauf</b> fĂŒr %d Objekte; mit <b>Strg</b> Winkel einrasten"
msgstr[1] "<b>Farbverlauf</b> fĂŒr %d Objekte; mit <b>Strg</b> Winkel einrasten"
-#: ../src/ui/tools/gradient-tool.cpp:960 ../src/ui/tools/mesh-tool.cpp:997
+#: ../src/ui/tools/gradient-tool.cpp:950 ../src/ui/tools/mesh-tool.cpp:987
msgid "Select <b>objects</b> on which to create gradient."
msgstr "<b>Objekte</b> auswĂ€hlen, fĂŒr die ein Farbverlauf erzeugt werden soll."
-#: ../src/ui/tools/lpe-tool.cpp:206
+#: ../src/ui/tools/lpe-tool.cpp:195
msgid "Choose a construction tool from the toolbar."
msgstr "Ein Konstruktionswerkzeug von der Werkzeugleiste wÀhlen."
#. TRANSLATORS: Mind the space in front. This is part of a compound message
-#: ../src/ui/tools/mesh-tool.cpp:132 ../src/ui/tools/mesh-tool.cpp:143
-#, fuzzy, c-format
+#: ../src/ui/tools/mesh-tool.cpp:122 ../src/ui/tools/mesh-tool.cpp:133
+#, c-format
msgid " out of %d mesh handle"
msgid_plural " out of %d mesh handles"
-msgstr[0] " von %d Farbverlaufs-Anfasser gewÀhlt"
-msgstr[1] " von %d Farbverlaufs-Anfassern gewÀhlt"
+msgstr[0] " von %d Gitter-Anfasser"
+msgstr[1] " von %d Gitter-Anfassern"
-#: ../src/ui/tools/mesh-tool.cpp:150
-#, fuzzy, c-format
+#: ../src/ui/tools/mesh-tool.cpp:140
+#, c-format
msgid "<b>%d</b> mesh handle selected out of %d"
msgid_plural "<b>%d</b> mesh handles selected out of %d"
-msgstr[0] "<b>%d</b> Verlaufs-Handle von %d ausgewÀhlt"
-msgstr[1] "<b>%d</b> Verlaufs-Handles von %d ausgewÀhlt"
+msgstr[0] "<b>%d</b> Gitter-Anfasser von %d ausgewÀhlt"
+msgstr[1] "<b>%d</b> Gitter-Anfasser von %d ausgewÀhlt"
#. TRANSLATORS: The plural refers to number of selected objects
-#: ../src/ui/tools/mesh-tool.cpp:157
-#, fuzzy, c-format
+#: ../src/ui/tools/mesh-tool.cpp:147
+#, c-format
msgid "<b>No</b> mesh handles selected out of %d on %d selected object"
msgid_plural "<b>No</b> mesh handles selected out of %d on %d selected objects"
msgstr[0] ""
-"<b>Kein</b> Verlaufs-Handle von %d ausgewÀhlt bei %d markiertem Objekt"
+"Von %d Gitter-Anfassern <b>keiner</b> ausgewÀhlt bei %d ausgewÀhlten Objekt"
msgstr[1] ""
-"<b>Keine</b> Verlaufs-Handles von %d ausgewÀhlt bei %d markierten Objekten"
+"Von %d Gitter-Anfassern <b>keiner</b> ausgewÀhlt bei %d ausgewÀhlten Objekten"
-#: ../src/ui/tools/mesh-tool.cpp:321
+#: ../src/ui/tools/mesh-tool.cpp:311
msgid "Split mesh row/column"
msgstr "Teile Gitter Reihe/Spalte"
-#: ../src/ui/tools/mesh-tool.cpp:407
+#: ../src/ui/tools/mesh-tool.cpp:397
msgid "Toggled mesh path type."
msgstr "Umgeschalteter Gitterpfadtyp."
-#: ../src/ui/tools/mesh-tool.cpp:411
+#: ../src/ui/tools/mesh-tool.cpp:401
msgid "Approximated arc for mesh side."
msgstr "Durchschnittlicher Winkel fĂŒr Gitterseite."
-#: ../src/ui/tools/mesh-tool.cpp:415
+#: ../src/ui/tools/mesh-tool.cpp:405
msgid "Toggled mesh tensors."
msgstr "Umgeschaltete Gittertensoren."
-#: ../src/ui/tools/mesh-tool.cpp:419
+#: ../src/ui/tools/mesh-tool.cpp:409
msgid "Smoothed mesh corner color."
msgstr "Farbe fĂŒr geglĂ€ttete Gitterecke."
-#: ../src/ui/tools/mesh-tool.cpp:423
+#: ../src/ui/tools/mesh-tool.cpp:413
msgid "Picked mesh corner color."
msgstr "AusgewÀhlte Farbe der Gitter-Ecken "
-#: ../src/ui/tools/mesh-tool.cpp:498
+#: ../src/ui/tools/mesh-tool.cpp:488
msgid "Create default mesh"
msgstr "Standardgitter erstellen"
-#: ../src/ui/tools/mesh-tool.cpp:718
+#: ../src/ui/tools/mesh-tool.cpp:708
msgid "FIXME<b>Ctrl</b>: snap mesh angle"
msgstr "FIXME<b>Strg</b>: Gitterwinkel einrasten"
-#: ../src/ui/tools/mesh-tool.cpp:719
+#: ../src/ui/tools/mesh-tool.cpp:709
msgid "FIXME<b>Shift</b>: draw mesh around the starting point"
msgstr "FIXME<b>Umschalt</b>: Gitter um den Startpunkt zeichnen"
-#: ../src/ui/tools/node-tool.cpp:612
+#: ../src/ui/tools/node-tool.cpp:602
msgctxt "Node tool tip"
msgid ""
"<b>Shift</b>: drag to add nodes to the selection, click to toggle object "
@@ -23623,19 +23731,19 @@ msgstr ""
"<b>Umschalt</b>: Ziehen, um Knoten zur Auswahl hinzuzufĂŒgen. Klicken, um die "
"Auswahl umzuschalten."
-#: ../src/ui/tools/node-tool.cpp:616
+#: ../src/ui/tools/node-tool.cpp:606
msgctxt "Node tool tip"
msgid "<b>Shift</b>: drag to add nodes to the selection"
msgstr "<b>Umschalt</b>: Ziehen, um Knoten zur Auswahl hinzuzufĂŒgen"
-#: ../src/ui/tools/node-tool.cpp:628
+#: ../src/ui/tools/node-tool.cpp:618
#, c-format
msgid "<b>%u of %u</b> node selected."
msgid_plural "<b>%u of %u</b> nodes selected."
msgstr[0] "<b>%u von %u</b> Knoten ausgewÀhlt."
msgstr[1] "<b>%u von %u</b> Knoten ausgewÀhlt."
-#: ../src/ui/tools/node-tool.cpp:634
+#: ../src/ui/tools/node-tool.cpp:624
#, c-format
msgctxt "Node tool tip"
msgid "%s Drag to select nodes, click to edit only this object (more: Shift)"
@@ -23643,71 +23751,71 @@ msgstr ""
"%s Ziehen, um Knoten auszuwÀhlen. Klicken, um nur dieses Objekt zu "
"bearbeiten (mehr: Umschalt)"
-#: ../src/ui/tools/node-tool.cpp:640
+#: ../src/ui/tools/node-tool.cpp:630
#, c-format
msgctxt "Node tool tip"
msgid "%s Drag to select nodes, click clear the selection"
msgstr "%s Ziehen, um Knoten auszuwÀhlen. Klicken, um Auswahl zu löschen"
-#: ../src/ui/tools/node-tool.cpp:649
+#: ../src/ui/tools/node-tool.cpp:639
msgctxt "Node tool tip"
msgid "Drag to select nodes, click to edit only this object"
msgstr ""
"Ziehen, um Knoten auszuwÀhlen. Klicken, um nur dieses Objekt zu bearbeiten."
-#: ../src/ui/tools/node-tool.cpp:652
+#: ../src/ui/tools/node-tool.cpp:642
msgctxt "Node tool tip"
msgid "Drag to select nodes, click to clear the selection"
msgstr "Ziehen, um Knoten auszuwÀhlen. Klicken, um Auswahl zu löschen"
-#: ../src/ui/tools/node-tool.cpp:657
+#: ../src/ui/tools/node-tool.cpp:647
msgctxt "Node tool tip"
msgid "Drag to select objects to edit, click to edit this object (more: Shift)"
msgstr ""
"Ziehen um Objekte zum Bearbeiten auszuwÀhlen und Klicken, um das Objekt zu "
"bearbeiten (mehr: Umschalt)"
-#: ../src/ui/tools/node-tool.cpp:660
+#: ../src/ui/tools/node-tool.cpp:650
msgctxt "Node tool tip"
msgid "Drag to select objects to edit"
msgstr "Ziehen, um Objekte zum bearbeiten auszuwÀhlen"
-#: ../src/ui/tools/pen-tool.cpp:233 ../src/ui/tools/pencil-tool.cpp:466
+#: ../src/ui/tools/pen-tool.cpp:224 ../src/ui/tools/pencil-tool.cpp:457
msgid "Drawing cancelled"
msgstr "Zeichnen abgebrochen"
# !!! make singular and plural forms
-#: ../src/ui/tools/pen-tool.cpp:469 ../src/ui/tools/pencil-tool.cpp:204
+#: ../src/ui/tools/pen-tool.cpp:460 ../src/ui/tools/pencil-tool.cpp:195
msgid "Continuing selected path"
msgstr "GewÀhlten Pfad verlÀngern"
-#: ../src/ui/tools/pen-tool.cpp:479 ../src/ui/tools/pencil-tool.cpp:212
+#: ../src/ui/tools/pen-tool.cpp:470 ../src/ui/tools/pencil-tool.cpp:203
msgid "Creating new path"
msgstr "Erzeuge neuen Pfad"
-#: ../src/ui/tools/pen-tool.cpp:481 ../src/ui/tools/pencil-tool.cpp:215
+#: ../src/ui/tools/pen-tool.cpp:472 ../src/ui/tools/pencil-tool.cpp:206
msgid "Appending to selected path"
msgstr "Zu ausgewĂ€hltem Pfad hinzufĂŒgen"
-#: ../src/ui/tools/pen-tool.cpp:646
+#: ../src/ui/tools/pen-tool.cpp:637
msgid "<b>Click</b> or <b>click and drag</b> to close and finish the path."
msgstr "<b>Klick</b> oder <b>Klick und Ziehen</b>, um den Pfad abzuschließen."
-#: ../src/ui/tools/pen-tool.cpp:648
+#: ../src/ui/tools/pen-tool.cpp:639
#, fuzzy
msgid ""
"<b>Click</b> or <b>click and drag</b> to close and finish the path. Shift"
"+Click make a cusp node"
msgstr "<b>Klick</b> oder <b>Klick und Ziehen</b>, um den Pfad abzuschließen."
-#: ../src/ui/tools/pen-tool.cpp:660
+#: ../src/ui/tools/pen-tool.cpp:651
msgid ""
"<b>Click</b> or <b>click and drag</b> to continue the path from this point."
msgstr ""
"<b>Klick</b> oder <b>Klick und Ziehen</b>, um den Pfad von diesem Punkt aus "
"fortzusetzen."
-#: ../src/ui/tools/pen-tool.cpp:662
+#: ../src/ui/tools/pen-tool.cpp:653
#, fuzzy
msgid ""
"<b>Click</b> or <b>click and drag</b> to continue the path from this point. "
@@ -23716,7 +23824,7 @@ msgstr ""
"<b>Klick</b> oder <b>Klick und Ziehen</b>, um den Pfad von diesem Punkt aus "
"fortzusetzen."
-#: ../src/ui/tools/pen-tool.cpp:2036
+#: ../src/ui/tools/pen-tool.cpp:2027
#, c-format
msgid ""
"<b>Curve segment</b>: angle %3.2f&#176;, distance %s; with <b>Ctrl</b> to "
@@ -23725,7 +23833,7 @@ msgstr ""
"<b>Kurvensegment</b>: Winkel %3.2f&#176;, Abstand %s; <b>Strg</b> rastet den "
"Winkel ein; <b>Eingabe</b> schließt den Pfad ab"
-#: ../src/ui/tools/pen-tool.cpp:2037
+#: ../src/ui/tools/pen-tool.cpp:2028
#, c-format
msgid ""
"<b>Line segment</b>: angle %3.2f&#176;, distance %s; with <b>Ctrl</b> to "
@@ -23734,7 +23842,7 @@ msgstr ""
"<b>Liniensegment</b>: Winkel %3.2f&#176;, Abstand %s; <b>Strg</b> rastet den "
"Winkel ein; <b>Eingabe</b> schließt den Pfad ab"
-#: ../src/ui/tools/pen-tool.cpp:2040
+#: ../src/ui/tools/pen-tool.cpp:2031
#, fuzzy, c-format
msgid ""
"<b>Curve segment</b>: angle %3.2f&#176;, distance %s; with <b>Shift+Click</"
@@ -23743,7 +23851,7 @@ msgstr ""
"<b>Kurvensegment</b>: Winkel %3.2f&#176;, Abstand %s; <b>Strg</b> rastet den "
"Winkel ein; <b>Eingabe</b> schließt den Pfad ab"
-#: ../src/ui/tools/pen-tool.cpp:2041
+#: ../src/ui/tools/pen-tool.cpp:2032
#, fuzzy, c-format
msgid ""
"<b>Line segment</b>: angle %3.2f&#176;, distance %s; with <b>Shift+Click</b> "
@@ -23752,7 +23860,7 @@ msgstr ""
"<b>Liniensegment</b>: Winkel %3.2f&#176;, Abstand %s; <b>Strg</b> rastet den "
"Winkel ein; <b>Eingabe</b> schließt den Pfad ab"
-#: ../src/ui/tools/pen-tool.cpp:2058
+#: ../src/ui/tools/pen-tool.cpp:2049
#, c-format
msgid ""
"<b>Curve handle</b>: angle %3.2f&#176;, length %s; with <b>Ctrl</b> to snap "
@@ -23761,7 +23869,7 @@ msgstr ""
"<b>Kurvenanfasser</b>: Winkel %3.2f°; LÀnge %s; Winkel mit <b>Strg</b> "
"einrasten"
-#: ../src/ui/tools/pen-tool.cpp:2082
+#: ../src/ui/tools/pen-tool.cpp:2073
#, c-format
msgid ""
"<b>Curve handle, symmetric</b>: angle %3.2f&#176;, length %s; with <b>Ctrl</"
@@ -23770,7 +23878,7 @@ msgstr ""
"<b>Symmetrischer Kurvenanfasser</b>: Winkel %3.2f&#176;, LĂ€nge %s; <b>Strg</"
"b> rastet den Winkel ein; <b>Umschalt</b> bewegt nur diesen Anfasser"
-#: ../src/ui/tools/pen-tool.cpp:2083
+#: ../src/ui/tools/pen-tool.cpp:2074
#, c-format
msgid ""
"<b>Curve handle</b>: angle %3.2f&#176;, length %s; with <b>Ctrl</b> to snap "
@@ -23780,29 +23888,29 @@ msgstr ""
"Winkel ein; <b>Umschalt</b> bewegt nur diesen Anfasser"
# not sure here -cm-
-#: ../src/ui/tools/pen-tool.cpp:2217
+#: ../src/ui/tools/pen-tool.cpp:2208
msgid "Drawing finished"
msgstr "Zeichnen beendet"
-#: ../src/ui/tools/pencil-tool.cpp:316
+#: ../src/ui/tools/pencil-tool.cpp:307
msgid "<b>Release</b> here to close and finish the path."
msgstr "Hier <b>loslassen</b>, um den Pfad zu schließen und beenden."
-#: ../src/ui/tools/pencil-tool.cpp:322
+#: ../src/ui/tools/pencil-tool.cpp:313
msgid "Drawing a freehand path"
msgstr "Freihandlinien zeichnen"
-#: ../src/ui/tools/pencil-tool.cpp:327
+#: ../src/ui/tools/pencil-tool.cpp:318
msgid "<b>Drag</b> to continue the path from this point."
msgstr "<b>Ziehen</b>, um den Pfad von diesem Punkt aus fortzusetzen."
# !!!
#. Write curves to object
-#: ../src/ui/tools/pencil-tool.cpp:412
+#: ../src/ui/tools/pencil-tool.cpp:403
msgid "Finishing freehand"
msgstr "Fertig mit Freihandlinien"
-#: ../src/ui/tools/pencil-tool.cpp:515
+#: ../src/ui/tools/pencil-tool.cpp:506
msgid ""
"<b>Sketch mode</b>: holding <b>Alt</b> interpolates between sketched paths. "
"Release <b>Alt</b> to finalize."
@@ -23811,11 +23919,11 @@ msgstr ""
"Pfaden. Zum Beenden <b>Alt</b> loslassen."
# !!!
-#: ../src/ui/tools/pencil-tool.cpp:542
+#: ../src/ui/tools/pencil-tool.cpp:533
msgid "Finishing freehand sketch"
msgstr "Fertig mit Freihandlinien"
-#: ../src/ui/tools/rect-tool.cpp:288
+#: ../src/ui/tools/rect-tool.cpp:278
msgid ""
"<b>Ctrl</b>: make square or integer-ratio rect, lock a rounded corner "
"circular"
@@ -23823,7 +23931,7 @@ msgstr ""
"<b>Strg</b>: Quadrat oder Rechteck mit ganzzahligem Kanten-LÀngenverhÀltnis, "
"abgerundete Kanten mit einheitlichen Radien"
-#: ../src/ui/tools/rect-tool.cpp:449
+#: ../src/ui/tools/rect-tool.cpp:439
#, c-format
msgid ""
"<b>Rectangle</b>: %s &#215; %s (constrained to ratio %d:%d); with <b>Shift</"
@@ -23832,7 +23940,7 @@ msgstr ""
"<b>Rechteck</b>: %s × %s (beschrĂ€nkt auf SeitenverhĂ€ltnis %d:%d); "
"<b>Umschalt</b> - Rechteck vom Zentrum aus zeichnen"
-#: ../src/ui/tools/rect-tool.cpp:452
+#: ../src/ui/tools/rect-tool.cpp:442
#, c-format
msgid ""
"<b>Rectangle</b>: %s &#215; %s (constrained to golden ratio 1.618 : 1); with "
@@ -23841,7 +23949,7 @@ msgstr ""
"<b>Rechteck</b>: %s × %s (beschrĂ€nkt auf Goldenen Schnitt 1,618 : 1); "
"<b>Umschalt</b> - Rechteck vom Zentrum aus zeichnen"
-#: ../src/ui/tools/rect-tool.cpp:454
+#: ../src/ui/tools/rect-tool.cpp:444
#, c-format
msgid ""
"<b>Rectangle</b>: %s &#215; %s (constrained to golden ratio 1 : 1.618); with "
@@ -23850,7 +23958,7 @@ msgstr ""
"<b>Rechteck</b>: %s × %s (beschrĂ€nkt auf Goldenen Schnitt 1 : 1,618); "
"<b>Umschalt</b> - Rechteck vom Zentrum aus zeichnen"
-#: ../src/ui/tools/rect-tool.cpp:458
+#: ../src/ui/tools/rect-tool.cpp:448
#, c-format
msgid ""
"<b>Rectangle</b>: %s &#215; %s; with <b>Ctrl</b> to make square or integer-"
@@ -23859,16 +23967,16 @@ msgstr ""
"<b>Rechteck</b>: %s × %s; <b>Strg</b> erzeugt Quadrat oder ganzzahliges "
"Höhen/BreitenverhÀltnis; <b>Umschalt</b> - Rechteck vom Zentrum aus zeichnen"
-#: ../src/ui/tools/rect-tool.cpp:481
+#: ../src/ui/tools/rect-tool.cpp:471
msgid "Create rectangle"
msgstr "Rechteck erzeugen"
-#: ../src/ui/tools/select-tool.cpp:169
+#: ../src/ui/tools/select-tool.cpp:160
msgid "Click selection to toggle scale/rotation handles"
msgstr ""
"Klicken Sie auf die Auswahl, um zwischen Skalieren und Rotieren umzuschalten"
-#: ../src/ui/tools/select-tool.cpp:170
+#: ../src/ui/tools/select-tool.cpp:161
msgid ""
"No objects selected. Click, Shift+click, Alt+scroll mouse on top of objects, "
"or drag around objects to select."
@@ -23877,16 +23985,16 @@ msgstr ""
"auszuwÀhlen."
# !!!
-#: ../src/ui/tools/select-tool.cpp:223
+#: ../src/ui/tools/select-tool.cpp:214
msgid "Move canceled."
msgstr "Verschieben abgebrochen."
# !!!
-#: ../src/ui/tools/select-tool.cpp:231
+#: ../src/ui/tools/select-tool.cpp:222
msgid "Selection canceled."
msgstr "Auswahl abgebrochen."
-#: ../src/ui/tools/select-tool.cpp:653
+#: ../src/ui/tools/select-tool.cpp:644
msgid ""
"<b>Draw over</b> objects to select them; release <b>Alt</b> to switch to "
"rubberband selection"
@@ -23894,7 +24002,7 @@ msgstr ""
"<b>Zeichnen ĂŒber</b> Objekten wĂ€hlt sie aus; <b>Alt</b> loslassen, um mit "
"Gummiband auszuwÀhlen"
-#: ../src/ui/tools/select-tool.cpp:655
+#: ../src/ui/tools/select-tool.cpp:646
msgid ""
"<b>Drag around</b> objects to select them; press <b>Alt</b> to switch to "
"touch selection"
@@ -23902,19 +24010,19 @@ msgstr ""
"<b>Ziehen um</b> Objekte wĂ€hlt sie aus; <b>Alt</b> drĂŒcken, um durch "
"BerĂŒhrung auszuwĂ€hlen"
-#: ../src/ui/tools/select-tool.cpp:950
+#: ../src/ui/tools/select-tool.cpp:941
msgid "<b>Ctrl</b>: click to select in groups; drag to move hor/vert"
msgstr ""
"<b>Strg</b>: Klick um in Gruppierung auszuwÀhlen; Ziehen um horizontal/"
"vertikal bewegen"
-#: ../src/ui/tools/select-tool.cpp:951
+#: ../src/ui/tools/select-tool.cpp:942
msgid "<b>Shift</b>: click to toggle select; drag for rubberband selection"
msgstr ""
"<b>Umschalt</b>: Klick um Auswahl aktivieren/deaktivieren, Ziehen fĂŒr "
"Gummiband-Auswahl"
-#: ../src/ui/tools/select-tool.cpp:952
+#: ../src/ui/tools/select-tool.cpp:943
msgid ""
"<b>Alt</b>: click to select under; scroll mouse-wheel to cycle-select; drag "
"to move selected or select by touch"
@@ -23922,41 +24030,41 @@ msgstr ""
"<b>Alt</b>: Klick um verdeckte Objekte auswÀhlen; Ziehen um gewÀhltes Objekt "
"zu verschieben oder durch BerĂŒhren auszuwĂ€hlen"
-#: ../src/ui/tools/select-tool.cpp:1160
+#: ../src/ui/tools/select-tool.cpp:1151
msgid "Selected object is not a group. Cannot enter."
msgstr "AusgewÀhltes Objekt ist keine Gruppe - kann diese nicht betreten."
-#: ../src/ui/tools/spiral-tool.cpp:259
+#: ../src/ui/tools/spiral-tool.cpp:249
msgid "<b>Ctrl</b>: snap angle"
msgstr "<b>Strg</b>: Winkel einrasten"
-#: ../src/ui/tools/spiral-tool.cpp:261
+#: ../src/ui/tools/spiral-tool.cpp:251
msgid "<b>Alt</b>: lock spiral radius"
msgstr "<b>Alt</b>: Radius der Spirale einrasten"
-#: ../src/ui/tools/spiral-tool.cpp:400
+#: ../src/ui/tools/spiral-tool.cpp:390
#, c-format
msgid ""
"<b>Spiral</b>: radius %s, angle %5g&#176;; with <b>Ctrl</b> to snap angle"
msgstr ""
"<b>Spirale</b>: Radius %s, Winkel %5g&#176;; Winkel mit <b>Strg</b> einrasten"
-#: ../src/ui/tools/spiral-tool.cpp:421
+#: ../src/ui/tools/spiral-tool.cpp:411
msgid "Create spiral"
msgstr "Spirale erstellen"
-#: ../src/ui/tools/spray-tool.cpp:192 ../src/ui/tools/tweak-tool.cpp:167
+#: ../src/ui/tools/spray-tool.cpp:182 ../src/ui/tools/tweak-tool.cpp:157
#, c-format
msgid "<b>%i</b> object selected"
msgid_plural "<b>%i</b> objects selected"
msgstr[0] "<b>%i</b> Objekt ausgewÀhlt"
msgstr[1] "<b>%i</b> Objekte ausgewÀhlt"
-#: ../src/ui/tools/spray-tool.cpp:194 ../src/ui/tools/tweak-tool.cpp:169
+#: ../src/ui/tools/spray-tool.cpp:184 ../src/ui/tools/tweak-tool.cpp:159
msgid "<b>Nothing</b> selected"
msgstr "Es wurde <b>nichts</b> gewÀhlt"
-#: ../src/ui/tools/spray-tool.cpp:199
+#: ../src/ui/tools/spray-tool.cpp:189
#, c-format
msgid ""
"%s. Drag, click or click and scroll to spray <b>copies</b> of the initial "
@@ -23965,7 +24073,7 @@ msgstr ""
"%s. Ziehen, Klicken oder Klicken und Scrollen zum SprĂŒhen von <b>Kopien</b> "
"der ersten Auswahl."
-#: ../src/ui/tools/spray-tool.cpp:202
+#: ../src/ui/tools/spray-tool.cpp:192
#, c-format
msgid ""
"%s. Drag, click or click and scroll to spray <b>clones</b> of the initial "
@@ -23974,7 +24082,7 @@ msgstr ""
"%s. Ziehen, Klicken oder Klicken und Scrollen zum SprĂŒhen von <b>Klonen</b> "
"der ersten Auswahl."
-#: ../src/ui/tools/spray-tool.cpp:205
+#: ../src/ui/tools/spray-tool.cpp:195
#, c-format
msgid ""
"%s. Drag, click or click and scroll to spray in a <b>single path</b> of the "
@@ -23983,95 +24091,95 @@ msgstr ""
"%s. Ziehen, Klicken oder Klicken und Scrollen zum SprĂŒhen in einen "
"<b>Einzelpfad</b> der ersten Auswahl."
-#: ../src/ui/tools/spray-tool.cpp:664
+#: ../src/ui/tools/spray-tool.cpp:654
msgid "<b>Nothing selected!</b> Select objects to spray."
msgstr "<b>Nichts ausgewĂ€hlt!</b> WĂ€hle Objekte zum SprĂŒhen aus."
-#: ../src/ui/tools/spray-tool.cpp:739 ../src/widgets/spray-toolbar.cpp:166
+#: ../src/ui/tools/spray-tool.cpp:729 ../src/widgets/spray-toolbar.cpp:166
msgid "Spray with copies"
msgstr "SprĂŒhen mit Kopien"
-#: ../src/ui/tools/spray-tool.cpp:743 ../src/widgets/spray-toolbar.cpp:173
+#: ../src/ui/tools/spray-tool.cpp:733 ../src/widgets/spray-toolbar.cpp:173
msgid "Spray with clones"
msgstr "SprĂŒhen mit Klonen"
-#: ../src/ui/tools/spray-tool.cpp:747
+#: ../src/ui/tools/spray-tool.cpp:737
msgid "Spray in single path"
msgstr "SprĂŒhen in einen einzelnen Pfad"
-#: ../src/ui/tools/star-tool.cpp:271
+#: ../src/ui/tools/star-tool.cpp:261
msgid "<b>Ctrl</b>: snap angle; keep rays radial"
msgstr "<b>Strg</b>: Winkel einrasten; Strahlen bleiben radial ausgerichtet"
-#: ../src/ui/tools/star-tool.cpp:417
+#: ../src/ui/tools/star-tool.cpp:407
#, c-format
msgid ""
"<b>Polygon</b>: radius %s, angle %5g&#176;; with <b>Ctrl</b> to snap angle"
msgstr ""
"<b>Polygon</b>: Radius %s, Winkel %5g°; Winkel mit <b>Strg</b> einrasten"
-#: ../src/ui/tools/star-tool.cpp:418
+#: ../src/ui/tools/star-tool.cpp:408
#, c-format
msgid "<b>Star</b>: radius %s, angle %5g&#176;; with <b>Ctrl</b> to snap angle"
msgstr ""
"<b>Stern</b>: Radius %s, Winkel %5g&#176;; Winkel mit <b>Strg</b> einrasten"
-#: ../src/ui/tools/star-tool.cpp:446
+#: ../src/ui/tools/star-tool.cpp:436
msgid "Create star"
msgstr "Stern erstellen"
-#: ../src/ui/tools/text-tool.cpp:379
+#: ../src/ui/tools/text-tool.cpp:370
msgid "<b>Click</b> to edit the text, <b>drag</b> to select part of the text."
msgstr ""
"<b>Klick</b> zum Ändern des Textes, <b>Ziehen</b>, um einen Teil des Textes "
"zu Àndern."
-#: ../src/ui/tools/text-tool.cpp:381
+#: ../src/ui/tools/text-tool.cpp:372
msgid ""
"<b>Click</b> to edit the flowed text, <b>drag</b> to select part of the text."
msgstr ""
"<b>Klick</b> zum Ändern des Fließtextes, <b>Ziehen</b>, um einen Teil des "
"Textes zu Àndern."
-#: ../src/ui/tools/text-tool.cpp:435
+#: ../src/ui/tools/text-tool.cpp:426
msgid "Create text"
msgstr "Text erstellen"
-#: ../src/ui/tools/text-tool.cpp:460
+#: ../src/ui/tools/text-tool.cpp:451
msgid "Non-printable character"
msgstr "Nicht druckbares Zeichen"
-#: ../src/ui/tools/text-tool.cpp:475
+#: ../src/ui/tools/text-tool.cpp:466
msgid "Insert Unicode character"
msgstr "Unicode-Zeichen einfĂŒgen"
-#: ../src/ui/tools/text-tool.cpp:510
+#: ../src/ui/tools/text-tool.cpp:501
#, c-format
msgid "Unicode (<b>Enter</b> to finish): %s: %s"
msgstr "Unicode (<b>Eingabe</b> zum Abschliessen): %s: %s"
-#: ../src/ui/tools/text-tool.cpp:512 ../src/ui/tools/text-tool.cpp:817
+#: ../src/ui/tools/text-tool.cpp:503 ../src/ui/tools/text-tool.cpp:808
msgid "Unicode (<b>Enter</b> to finish): "
msgstr "Unicode (<b>Eingabe</b> zum Abschliessen): "
-#: ../src/ui/tools/text-tool.cpp:595
+#: ../src/ui/tools/text-tool.cpp:586
#, c-format
msgid "<b>Flowed text frame</b>: %s &#215; %s"
msgstr "<b>Fließtext-Rahmen</b>: %s × %s"
-#: ../src/ui/tools/text-tool.cpp:653
+#: ../src/ui/tools/text-tool.cpp:644
msgid "Type text; <b>Enter</b> to start new line."
msgstr "Text schreiben; <b>Eingabe</b>, um eine neue Zeile zu beginnen."
-#: ../src/ui/tools/text-tool.cpp:664
+#: ../src/ui/tools/text-tool.cpp:655
msgid "Flowed text is created."
msgstr "Fließtext wird erzeugt."
-#: ../src/ui/tools/text-tool.cpp:665
+#: ../src/ui/tools/text-tool.cpp:656
msgid "Create flowed text"
msgstr "Fließtext erstellen"
-#: ../src/ui/tools/text-tool.cpp:667
+#: ../src/ui/tools/text-tool.cpp:658
msgid ""
"The frame is <b>too small</b> for the current font size. Flowed text not "
"created."
@@ -24079,75 +24187,75 @@ msgstr ""
"Der Rahmen ist <b>zu klein</b> fĂŒr die aktuelle SchriftgrĂ¶ĂŸe. Der Fließtext "
"wurde nicht erzeugt."
-#: ../src/ui/tools/text-tool.cpp:803
+#: ../src/ui/tools/text-tool.cpp:794
msgid "No-break space"
msgstr "Untrennbares Leerzeichen"
-#: ../src/ui/tools/text-tool.cpp:804
+#: ../src/ui/tools/text-tool.cpp:795
msgid "Insert no-break space"
msgstr "Untrennbares Leerzeichen einfĂŒgen"
-#: ../src/ui/tools/text-tool.cpp:840
+#: ../src/ui/tools/text-tool.cpp:831
msgid "Make bold"
msgstr "Fett"
-#: ../src/ui/tools/text-tool.cpp:857
+#: ../src/ui/tools/text-tool.cpp:848
msgid "Make italic"
msgstr "Kursiv"
-#: ../src/ui/tools/text-tool.cpp:895
+#: ../src/ui/tools/text-tool.cpp:886
msgid "New line"
msgstr "Neue Zeile"
-#: ../src/ui/tools/text-tool.cpp:936
+#: ../src/ui/tools/text-tool.cpp:927
msgid "Backspace"
msgstr "RĂŒckschritt"
-#: ../src/ui/tools/text-tool.cpp:990
+#: ../src/ui/tools/text-tool.cpp:981
msgid "Kern to the left"
msgstr "Unterschneidung nach links"
-#: ../src/ui/tools/text-tool.cpp:1014
+#: ../src/ui/tools/text-tool.cpp:1005
msgid "Kern to the right"
msgstr "Unterschneidung nach rechts"
-#: ../src/ui/tools/text-tool.cpp:1038
+#: ../src/ui/tools/text-tool.cpp:1029
msgid "Kern up"
msgstr "Unterschneidung nach oben"
-#: ../src/ui/tools/text-tool.cpp:1062
+#: ../src/ui/tools/text-tool.cpp:1053
msgid "Kern down"
msgstr "Unterschneidung nach unten"
-#: ../src/ui/tools/text-tool.cpp:1137
+#: ../src/ui/tools/text-tool.cpp:1128
msgid "Rotate counterclockwise"
msgstr "Entgegen Uhrzeigersinn drehen"
-#: ../src/ui/tools/text-tool.cpp:1157
+#: ../src/ui/tools/text-tool.cpp:1148
msgid "Rotate clockwise"
msgstr "Im Uhrzeigersinn drehen"
-#: ../src/ui/tools/text-tool.cpp:1173
+#: ../src/ui/tools/text-tool.cpp:1164
msgid "Contract line spacing"
msgstr "Zeilenabstand vermindern"
-#: ../src/ui/tools/text-tool.cpp:1179
+#: ../src/ui/tools/text-tool.cpp:1170
msgid "Contract letter spacing"
msgstr "Zeichenabstand vermindern"
-#: ../src/ui/tools/text-tool.cpp:1196
+#: ../src/ui/tools/text-tool.cpp:1187
msgid "Expand line spacing"
msgstr "Zeilenabstand vergrĂ¶ĂŸern"
-#: ../src/ui/tools/text-tool.cpp:1202
+#: ../src/ui/tools/text-tool.cpp:1193
msgid "Expand letter spacing"
msgstr "Zeichenabstand vergrĂ¶ĂŸern"
-#: ../src/ui/tools/text-tool.cpp:1332
+#: ../src/ui/tools/text-tool.cpp:1323
msgid "Paste text"
msgstr "Text einfĂŒgen"
-#: ../src/ui/tools/text-tool.cpp:1583
+#: ../src/ui/tools/text-tool.cpp:1574
#, c-format
msgid ""
"Type or edit flowed text (%d character%s); <b>Enter</b> to start new "
@@ -24162,7 +24270,7 @@ msgstr[1] ""
"Fließtext schreiben (%d Zeichen%s); <b>Eingabe</b>, um einen neuen Absatz zu "
"beginnen."
-#: ../src/ui/tools/text-tool.cpp:1585
+#: ../src/ui/tools/text-tool.cpp:1576
#, c-format
msgid "Type or edit text (%d character%s); <b>Enter</b> to start new line."
msgid_plural ""
@@ -24174,7 +24282,7 @@ msgstr[1] ""
"Text eintippen oder bearbeiten (%d Zeichen%s); <b>Eingabe</b>, um eine neue "
"Zeile zu beginnen."
-#: ../src/ui/tools/text-tool.cpp:1695
+#: ../src/ui/tools/text-tool.cpp:1686
msgid "Type text"
msgstr "Text eingeben"
@@ -24182,144 +24290,144 @@ msgstr "Text eingeben"
msgid "<b>Space+mouse move</b> to pan canvas"
msgstr "<b>Leertaste+Maus ziehen</b>, um die ArbeitsflÀche zu verschieben"
-#: ../src/ui/tools/tweak-tool.cpp:174
+#: ../src/ui/tools/tweak-tool.cpp:164
#, c-format
msgid "%s. Drag to <b>move</b>."
msgstr "%s. Ziehen zum <b>verschieben</b>."
-#: ../src/ui/tools/tweak-tool.cpp:178
+#: ../src/ui/tools/tweak-tool.cpp:168
#, c-format
msgid "%s. Drag or click to <b>move in</b>; with Shift to <b>move out</b>."
msgstr ""
-"%s. Ziehen oder Klicken zum <b>verschieben hinein </b>; mit Umschalttaste "
-"zum <b>verschieben hinaus</b>."
+"%s. Ziehen oder Klicken zum <b>Zusammenziehen</b>; mit Umschalttaste zum "
+"<b>Auseinanderziehen</b>."
-#: ../src/ui/tools/tweak-tool.cpp:186
+#: ../src/ui/tools/tweak-tool.cpp:176
#, c-format
msgid "%s. Drag or click to <b>move randomly</b>."
-msgstr "%s. Ziehen oder Klicken zum <b>zufÀlligen verschieben</b>."
+msgstr "%s. Ziehen oder Klicken zum <b>zufÀlligen Verschieben</b>."
-#: ../src/ui/tools/tweak-tool.cpp:190
+#: ../src/ui/tools/tweak-tool.cpp:180
#, c-format
msgid "%s. Drag or click to <b>scale down</b>; with Shift to <b>scale up</b>."
msgstr ""
-"%s. Ziehen oder Klicken zum <b>kleiner skalieren</b>; mit Umschalttaste zum "
-"<b>grĂ¶ĂŸer skalieren</b>."
+"%s. Ziehen oder Klicken zum <b>verkleinern</b>; mit Umschalttaste zum "
+"<b>vergrĂ¶ĂŸern</b>."
-#: ../src/ui/tools/tweak-tool.cpp:198
+#: ../src/ui/tools/tweak-tool.cpp:188
#, c-format
msgid ""
"%s. Drag or click to <b>rotate clockwise</b>; with Shift, "
"<b>counterclockwise</b>."
msgstr ""
"%s. Ziehen oder Klicken zum <b>Drehen im Uhrzeigersinn</b>; mit "
-"Umschalttaste zum <b>gegen den Uhrzeigersinn</b>."
+"Umschalttaste zum <b>Drehen gegen den Uhrzeigersinn</b>."
-#: ../src/ui/tools/tweak-tool.cpp:206
+#: ../src/ui/tools/tweak-tool.cpp:196
#, c-format
msgid "%s. Drag or click to <b>duplicate</b>; with Shift, <b>delete</b>."
msgstr ""
"%s. Ziehen oder Klicken zum <b>Duplizieren</b>; mit Umschalttaste zum "
"<b>Löschen</b>."
-#: ../src/ui/tools/tweak-tool.cpp:214
+#: ../src/ui/tools/tweak-tool.cpp:204
#, c-format
msgid "%s. Drag to <b>push paths</b>."
msgstr "%s. Ziehen zum <b> Schieben der Pfade</b>."
-#: ../src/ui/tools/tweak-tool.cpp:218
+#: ../src/ui/tools/tweak-tool.cpp:208
#, c-format
msgid "%s. Drag or click to <b>inset paths</b>; with Shift to <b>outset</b>."
msgstr ""
"%s. Ziehen oder Klicken <b>zieht</b> Pfade <b>zusammen</b>; mit Umschalt "
"<b>schiebt sie auseinander</b>."
-#: ../src/ui/tools/tweak-tool.cpp:226
+#: ../src/ui/tools/tweak-tool.cpp:216
#, c-format
msgid "%s. Drag or click to <b>attract paths</b>; with Shift to <b>repel</b>."
msgstr ""
"%s. Ziehen oder Klicken <b>zieht Pfade an</b>; mit Umschalt <b>stĂ¶ĂŸt es sie "
"ab</b>."
-#: ../src/ui/tools/tweak-tool.cpp:234
+#: ../src/ui/tools/tweak-tool.cpp:224
#, c-format
msgid "%s. Drag or click to <b>roughen paths</b>."
msgstr "%s. Ziehen oder Klicken um <b>Pfad aufzurauen</b>."
-#: ../src/ui/tools/tweak-tool.cpp:238
+#: ../src/ui/tools/tweak-tool.cpp:228
#, c-format
msgid "%s. Drag or click to <b>paint objects</b> with color."
msgstr "%s. Ziehen oder Klicken um <b>Objekte zu bemalen</b> mit Farbe."
-#: ../src/ui/tools/tweak-tool.cpp:242
+#: ../src/ui/tools/tweak-tool.cpp:232
#, c-format
msgid "%s. Drag or click to <b>randomize colors</b>."
msgstr "%s. Ziehen oder Klicken um <b>Farben zufÀllig zu setzen</b>."
-#: ../src/ui/tools/tweak-tool.cpp:246
+#: ../src/ui/tools/tweak-tool.cpp:236
#, c-format
msgid ""
"%s. Drag or click to <b>increase blur</b>; with Shift to <b>decrease</b>."
msgstr ""
-"%s. Ziehen oder Klicken, um die <b>Weichheit zu erhöhen</b>; mit Umschalt "
+"%s. Ziehen oder Klicken, um die <b>UnschÀrfe zu erhöhen</b>; mit Umschalt "
"<b>verringern</b>."
-#: ../src/ui/tools/tweak-tool.cpp:1205
+#: ../src/ui/tools/tweak-tool.cpp:1195
msgid "<b>Nothing selected!</b> Select objects to tweak."
msgstr "<b>Nichts ausgewÀhlt!</b> WÀhle Objekte zum Justieren aus."
-#: ../src/ui/tools/tweak-tool.cpp:1239
+#: ../src/ui/tools/tweak-tool.cpp:1229
msgid "Move tweak"
-msgstr "Verschieben-Justage"
+msgstr "Optimieren durch Verschieben"
# Was bewegt sich?
-#: ../src/ui/tools/tweak-tool.cpp:1243
+#: ../src/ui/tools/tweak-tool.cpp:1233
msgid "Move in/out tweak"
msgstr "Optimieren durch Zusammen-/Auseinanderbewegen"
-#: ../src/ui/tools/tweak-tool.cpp:1247
+#: ../src/ui/tools/tweak-tool.cpp:1237
msgid "Move jitter tweak"
-msgstr "Bewegungsversatz-Justage"
+msgstr "Optimieren durch Bewegungsversatz"
-#: ../src/ui/tools/tweak-tool.cpp:1251
+#: ../src/ui/tools/tweak-tool.cpp:1241
msgid "Scale tweak"
-msgstr "Skalieren-Justage"
+msgstr "Optimieren durch Skalieren"
-#: ../src/ui/tools/tweak-tool.cpp:1255
+#: ../src/ui/tools/tweak-tool.cpp:1245
msgid "Rotate tweak"
-msgstr "Rotieren-Justage"
+msgstr "Optimieren durch Rotieren"
-#: ../src/ui/tools/tweak-tool.cpp:1259
+#: ../src/ui/tools/tweak-tool.cpp:1249
msgid "Duplicate/delete tweak"
-msgstr "Dulizieren-/Löschen-Justage"
+msgstr "Optimieren durch Duplizieren-/Löschen"
-#: ../src/ui/tools/tweak-tool.cpp:1263
+#: ../src/ui/tools/tweak-tool.cpp:1253
msgid "Push path tweak"
-msgstr "Pfad-Verschieben-Justage"
+msgstr "Optimieren durch Verschieben von Pfaden"
-#: ../src/ui/tools/tweak-tool.cpp:1267
+#: ../src/ui/tools/tweak-tool.cpp:1257
msgid "Shrink/grow path tweak"
-msgstr "Schrumpfen-/Weiten-Justage"
+msgstr "Optimieren durch Schrumpfen/VergĂ¶ĂŸern von Pfaden"
-#: ../src/ui/tools/tweak-tool.cpp:1271
+#: ../src/ui/tools/tweak-tool.cpp:1261
msgid "Attract/repel path tweak"
-msgstr "Pfad-Anziehen-/-Abstoßen-Justage"
+msgstr "Optimieren durch Anziehen/Abstoßen von Pfaden"
-#: ../src/ui/tools/tweak-tool.cpp:1275
+#: ../src/ui/tools/tweak-tool.cpp:1265
msgid "Roughen path tweak"
-msgstr "Pfadrauheit-Justage"
+msgstr "Optimieren der Pfadrauheit"
-#: ../src/ui/tools/tweak-tool.cpp:1279
+#: ../src/ui/tools/tweak-tool.cpp:1269
msgid "Color paint tweak"
-msgstr "Farb-Justage"
+msgstr "Optimieren der Farbe"
-#: ../src/ui/tools/tweak-tool.cpp:1283
+#: ../src/ui/tools/tweak-tool.cpp:1273
msgid "Color jitter tweak"
-msgstr "Farbrauschen-Justage"
+msgstr "Optimieren durch Farbrauschen"
-#: ../src/ui/tools/tweak-tool.cpp:1287
+#: ../src/ui/tools/tweak-tool.cpp:1277
msgid "Blur tweak"
-msgstr "UnschÀrfe-Justage"
+msgstr "Optimieren durch UnschÀrfe"
#: ../src/ui/widget/filter-effect-chooser.cpp:26
msgid "_Blur:"
@@ -24353,6 +24461,11 @@ msgstr "ProprietÀr"
msgid "MetadataLicence|Other"
msgstr "Andere"
+#: ../src/ui/widget/licensor.cpp:72
+#, fuzzy
+msgid "Document license updated"
+msgstr "Dokumentbereinigung"
+
#: ../src/ui/widget/object-composite-settings.cpp:47
#: ../src/ui/widget/selected-style.cpp:1119
#: ../src/ui/widget/selected-style.cpp:1120
@@ -24695,12 +24808,12 @@ msgstr "<b>L</b>"
#: ../src/ui/widget/selected-style.cpp:221
#, fuzzy
msgid "Mesh gradient fill"
-msgstr "FĂŒllung des linearen Farbverlaufs"
+msgstr "FĂŒllung des Verlaufsgitter"
#: ../src/ui/widget/selected-style.cpp:221
#, fuzzy
msgid "Mesh gradient stroke"
-msgstr "Kontur des linearen Farbverlaufs"
+msgstr "Kontur des Verlaufsgitter"
#: ../src/ui/widget/selected-style.cpp:229
msgid "Different"
@@ -25051,8 +25164,8 @@ msgstr[1] ""
msgid ""
"shared by <b>%d</b> box; drag with <b>Shift</b> to separate selected box(es)"
msgid_plural ""
-"shared by <b>%d</b> boxes; drag with <b>Shift</b> to separate selected box"
-"(es)"
+"shared by <b>%d</b> boxes; drag with <b>Shift</b> to separate selected "
+"box(es)"
msgstr[0] "<b>%d</b> Quader zugewiesen. "
msgstr[1] ""
"<b>%d</b> Quadern zugewiesen. <b>Umschalt+Ziehen</b> trennt die Quader."
@@ -25262,6 +25375,12 @@ msgstr "Keine"
msgid "Does nothing"
msgstr "Hat keine Funktion"
+#. File
+#. Tag
+#: ../src/verbs.cpp:2431 ../src/verbs.cpp:2726
+msgid "_New"
+msgstr "_Neu"
+
#: ../src/verbs.cpp:2431
msgid "Create new document from the default template"
msgstr "Ein neues Dokument mit der Standardvorlage anlegen"
@@ -25315,15 +25434,15 @@ msgstr "Das Dokument drucken"
#. TRANSLATORS: "Vacuum Defs" means "Clean up defs" (so as to remove unused definitions)
#: ../src/verbs.cpp:2446
msgid "Clean _up document"
-msgstr "Dokument sÀubern"
+msgstr "Dok_ument sÀubern"
#: ../src/verbs.cpp:2446
msgid ""
"Remove unused definitions (such as gradients or clipping paths) from the &lt;"
"defs&gt; of the document"
msgstr ""
-"Unbenutzte vordefinierte Elemente (z.B. FarbverlÀufe oder Ausschneidepfade) "
-"aus den &lt;defs&gt; des Dokuments entfernen"
+"Unbenutzte Definitionen (z.B. FarbverlÀufe oder Ausschneidepfade) aus den "
+"&lt;defs&gt; des Dokuments entfernen"
#: ../src/verbs.cpp:2448
msgid "_Import..."
@@ -25376,8 +25495,8 @@ msgid "Quit Inkscape"
msgstr "Inkscape verlassen"
#: ../src/verbs.cpp:2461
-msgid "_Templates..."
-msgstr "_Vorlagen..."
+msgid "New from _Template..."
+msgstr "Neu aus _Vorlage"
#: ../src/verbs.cpp:2462
msgid "Create new project from template"
@@ -25614,7 +25733,7 @@ msgstr "Objekte aus einem gekacheltem FĂŒllmuster extrahieren"
#: ../src/verbs.cpp:2519
msgid "Group to Symbol"
-msgstr "Gruppieren zum Symbol"
+msgstr "Gruppe zu Symbol"
#: ../src/verbs.cpp:2520
msgid "Convert group to a symbol"
@@ -25622,11 +25741,11 @@ msgstr "Gruppe in Symbol konvertieren"
#: ../src/verbs.cpp:2521
msgid "Symbol to Group"
-msgstr "Symbol zum Gruppieren"
+msgstr "Symbol zu Gruppe"
#: ../src/verbs.cpp:2522
msgid "Extract group from a symbol"
-msgstr "Extrahiere Gruppe von einem Symbol"
+msgstr "Extrahiere Gruppe aus einem Symbol"
#: ../src/verbs.cpp:2523
msgid "Clea_r All"
@@ -26346,7 +26465,7 @@ msgstr "Modellieren"
#: ../src/verbs.cpp:2734
msgid "Tweak objects by sculpting or painting"
-msgstr "Objekte verbessern durch Verformen oder Malen"
+msgstr "Objekte optimieren durch Verformen oder EinfÀrben"
#: ../src/verbs.cpp:2735
msgctxt "ContextVerb"
@@ -26355,7 +26474,7 @@ msgstr "Spray"
#: ../src/verbs.cpp:2736
msgid "Spray objects by sculpting or painting"
-msgstr "Objekte sprĂŒhen durch Verformen oder Malen"
+msgstr "Objekte sprĂŒhen durch Verformen oder EinfĂ€rben"
#: ../src/verbs.cpp:2737
msgctxt "ContextVerb"
@@ -26744,8 +26863,8 @@ msgstr "Hi_lfslinien"
#: ../src/verbs.cpp:2826
msgid "Show or hide guides (drag from a ruler to create a guide)"
msgstr ""
-"FĂŒhrungslinien zeigen oder verstecken (von einem Lineal ziehen, um eine "
-"FĂŒhrungslinie zu erzeugen)"
+"Hilfslinien zeigen oder verstecken (von einem Lineal ziehen, um eine "
+"Hilfslinie zu erzeugen)"
#: ../src/verbs.cpp:2827
msgid "Enable snapping"
@@ -27445,7 +27564,7 @@ msgstr "Bogen: Offen/geschlossen Àndern"
# !!!
#: ../src/widgets/arc-toolbar.cpp:289 ../src/widgets/arc-toolbar.cpp:319
-#: ../src/widgets/rect-toolbar.cpp:261 ../src/widgets/rect-toolbar.cpp:300
+#: ../src/widgets/rect-toolbar.cpp:260 ../src/widgets/rect-toolbar.cpp:299
#: ../src/widgets/spiral-toolbar.cpp:214 ../src/widgets/spiral-toolbar.cpp:238
#: ../src/widgets/star-toolbar.cpp:384 ../src/widgets/star-toolbar.cpp:446
msgid "<b>New:</b>"
@@ -27455,7 +27574,7 @@ msgstr "<b>Neu:</b>"
#. FIXME: implement averaging of all parameters for multiple selected
#. gtk_label_set_markup(GTK_LABEL(l), _("<b>Average:</b>"));
#: ../src/widgets/arc-toolbar.cpp:292 ../src/widgets/arc-toolbar.cpp:303
-#: ../src/widgets/rect-toolbar.cpp:269 ../src/widgets/rect-toolbar.cpp:287
+#: ../src/widgets/rect-toolbar.cpp:268 ../src/widgets/rect-toolbar.cpp:286
#: ../src/widgets/spiral-toolbar.cpp:216 ../src/widgets/spiral-toolbar.cpp:227
#: ../src/widgets/star-toolbar.cpp:386
msgid "<b>Change:</b>"
@@ -28054,7 +28173,7 @@ msgid ""
"\n"
"If you close without saving, your changes will be discarded."
msgstr ""
-"<span weight=\"bold\" size=\"larger\">Änderungen an Dokument »%s« vor dem "
+"<span weight=\"bold\" size=\"larger\">Änderungen an Dokument „%s“ vor dem "
"Schließen speichern?</span>\n"
"\n"
"Wenn Sie schließen, ohne zu speichern, dann gehen Ihre Änderungen verloren."
@@ -28072,10 +28191,10 @@ msgid ""
"\n"
"Do you want to save this file as Inkscape SVG?"
msgstr ""
-"<span weight=\"fett\" size=\"grĂ¶ĂŸer\">Die Datei \"%s\" wurde in einem "
+"<span weight=\"bold\" size=\"larger\">Die Datei \"%s\" wurde in einem "
"möglicherweise verlustbehafteten Format gespeichert!</span>\n"
"\n"
-"Möchten Sie das Dokument als ein Inkscape SVG speichern?"
+"Möchten Sie das Dokument als Inkscape SVG speichern?"
#: ../src/widgets/desktop-widget.cpp:1179
msgid "_Save as Inkscape SVG"
@@ -28184,137 +28303,137 @@ msgstr "Stil"
# !!!
#: ../src/widgets/font-selector.cpp:211
msgid "Face"
-msgstr "FlÀche"
+msgstr "Schnitt"
#: ../src/widgets/font-selector.cpp:240 ../share/extensions/dots.inx.h:3
msgid "Font size:"
msgstr "SchriftgrĂ¶ĂŸe:"
-#: ../src/widgets/gradient-selector.cpp:196
+#: ../src/widgets/gradient-selector.cpp:201
msgid "Create a duplicate gradient"
-msgstr "Duplikat-Farbverlauf erstellen"
+msgstr "Farbverlauf duplizieren"
#: ../src/widgets/gradient-selector.cpp:212
msgid "Edit gradient"
msgstr "Farbverlauf bearbeiten"
-#: ../src/widgets/gradient-selector.cpp:288
+#: ../src/widgets/gradient-selector.cpp:281
#: ../src/widgets/paint-selector.cpp:236
msgid "Swatch"
msgstr "Farbmuster"
-#: ../src/widgets/gradient-selector.cpp:338
+#: ../src/widgets/gradient-selector.cpp:331
msgid "Rename gradient"
msgstr "Farbverlauf umbenennen"
#: ../src/widgets/gradient-toolbar.cpp:156
#: ../src/widgets/gradient-toolbar.cpp:169
-#: ../src/widgets/gradient-toolbar.cpp:756
-#: ../src/widgets/gradient-toolbar.cpp:1094
+#: ../src/widgets/gradient-toolbar.cpp:758
+#: ../src/widgets/gradient-toolbar.cpp:1097
msgid "No gradient"
msgstr "Kein Farbverlauf"
-#: ../src/widgets/gradient-toolbar.cpp:175
+#: ../src/widgets/gradient-toolbar.cpp:176
msgid "Multiple gradients"
msgstr "Mehrfache FarbverlÀufe"
-#: ../src/widgets/gradient-toolbar.cpp:676
+#: ../src/widgets/gradient-toolbar.cpp:678
msgid "Multiple stops"
-msgstr "Mehrfach-Stopp"
+msgstr "Mehrere Zwischenfarben"
-#: ../src/widgets/gradient-toolbar.cpp:774
+#: ../src/widgets/gradient-toolbar.cpp:776
#: ../src/widgets/gradient-vector.cpp:609
msgid "No stops in gradient"
msgstr "Keine Zwischenfarben im Farbverlauf"
-#: ../src/widgets/gradient-toolbar.cpp:927
+#: ../src/widgets/gradient-toolbar.cpp:930
msgid "Assign gradient to object"
msgstr "Farbverlauf einem Objekt zuweisen"
-#: ../src/widgets/gradient-toolbar.cpp:949
+#: ../src/widgets/gradient-toolbar.cpp:952
msgid "Set gradient repeat"
msgstr "Setze Verlaufswiederholung"
-#: ../src/widgets/gradient-toolbar.cpp:987
+#: ../src/widgets/gradient-toolbar.cpp:990
#: ../src/widgets/gradient-vector.cpp:720
msgid "Change gradient stop offset"
msgstr "Versatz der Zwischenfarben des Farbverlaufs Àndern"
-#: ../src/widgets/gradient-toolbar.cpp:1034
+#: ../src/widgets/gradient-toolbar.cpp:1037
msgid "linear"
msgstr "linear"
-#: ../src/widgets/gradient-toolbar.cpp:1034
+#: ../src/widgets/gradient-toolbar.cpp:1037
msgid "Create linear gradient"
msgstr "Linearen Farbverlauf erzeugen"
-#: ../src/widgets/gradient-toolbar.cpp:1038
+#: ../src/widgets/gradient-toolbar.cpp:1041
msgid "radial"
msgstr "radial"
-#: ../src/widgets/gradient-toolbar.cpp:1038
+#: ../src/widgets/gradient-toolbar.cpp:1041
msgid "Create radial (elliptic or circular) gradient"
msgstr "Radialen (elliptischen oder kreisförmigen) Farbverlauf erzeugen"
-#: ../src/widgets/gradient-toolbar.cpp:1041
-#: ../src/widgets/mesh-toolbar.cpp:207
+#: ../src/widgets/gradient-toolbar.cpp:1044
+#: ../src/widgets/mesh-toolbar.cpp:341
msgid "New:"
msgstr "Neu:"
-#: ../src/widgets/gradient-toolbar.cpp:1064
-#: ../src/widgets/mesh-toolbar.cpp:230
+#: ../src/widgets/gradient-toolbar.cpp:1067
+#: ../src/widgets/mesh-toolbar.cpp:364
msgid "fill"
msgstr "fĂŒllen"
-#: ../src/widgets/gradient-toolbar.cpp:1064
-#: ../src/widgets/mesh-toolbar.cpp:230
+#: ../src/widgets/gradient-toolbar.cpp:1067
+#: ../src/widgets/mesh-toolbar.cpp:364
msgid "Create gradient in the fill"
msgstr "Farbverlauf fĂŒr die FĂŒllung erzeugen"
-#: ../src/widgets/gradient-toolbar.cpp:1068
-#: ../src/widgets/mesh-toolbar.cpp:234
+#: ../src/widgets/gradient-toolbar.cpp:1071
+#: ../src/widgets/mesh-toolbar.cpp:368
msgid "stroke"
msgstr "Kontur"
-#: ../src/widgets/gradient-toolbar.cpp:1068
-#: ../src/widgets/mesh-toolbar.cpp:234
+#: ../src/widgets/gradient-toolbar.cpp:1071
+#: ../src/widgets/mesh-toolbar.cpp:368
msgid "Create gradient in the stroke"
msgstr "Farbverlauf fĂŒr die Kontur erzeugen"
# CHECK
-#: ../src/widgets/gradient-toolbar.cpp:1071
-#: ../src/widgets/mesh-toolbar.cpp:237
+#: ../src/widgets/gradient-toolbar.cpp:1074
+#: ../src/widgets/mesh-toolbar.cpp:371
msgid "on:"
msgstr "auf:"
-#: ../src/widgets/gradient-toolbar.cpp:1096
+#: ../src/widgets/gradient-toolbar.cpp:1099
msgid "Select"
msgstr "AuswÀhlen"
-#: ../src/widgets/gradient-toolbar.cpp:1096
+#: ../src/widgets/gradient-toolbar.cpp:1099
msgid "Choose a gradient"
msgstr "WĂ€hlen Sie einen Verlauf"
-#: ../src/widgets/gradient-toolbar.cpp:1097
+#: ../src/widgets/gradient-toolbar.cpp:1100
msgid "Select:"
msgstr "AuswÀhlen:"
# CHECK
-#: ../src/widgets/gradient-toolbar.cpp:1112
+#: ../src/widgets/gradient-toolbar.cpp:1115
msgctxt "Gradient repeat type"
msgid "None"
msgstr "Keine"
-#: ../src/widgets/gradient-toolbar.cpp:1118
+#: ../src/widgets/gradient-toolbar.cpp:1121
msgid "Direct"
msgstr "Direkt"
-#: ../src/widgets/gradient-toolbar.cpp:1120
+#: ../src/widgets/gradient-toolbar.cpp:1123
msgid "Repeat"
msgstr "Wiederholen"
#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/pservers.html#LinearGradientSpreadMethodAttribute
-#: ../src/widgets/gradient-toolbar.cpp:1122
+#: ../src/widgets/gradient-toolbar.cpp:1125
msgid ""
"Whether to fill with flat color beyond the ends of the gradient vector "
"(spreadMethod=\"pad\"), or repeat the gradient in the same direction "
@@ -28326,57 +28445,57 @@ msgstr ""
"Richtung (spreadMethod=\"repeat\"), oder Wiederholung in abwechselnd "
"entgegengesetzte Richtungen (spreadMethod=\"reflect\")"
-#: ../src/widgets/gradient-toolbar.cpp:1127
+#: ../src/widgets/gradient-toolbar.cpp:1130
msgid "Repeat:"
msgstr "Wiederholung:"
-#: ../src/widgets/gradient-toolbar.cpp:1141
+#: ../src/widgets/gradient-toolbar.cpp:1144
msgid "No stops"
-msgstr "Keine Stopps"
+msgstr "Keine Zwischenfarben"
-#: ../src/widgets/gradient-toolbar.cpp:1143
+#: ../src/widgets/gradient-toolbar.cpp:1146
msgid "Stops"
-msgstr "Stopps"
+msgstr "Zwischenfarben"
-#: ../src/widgets/gradient-toolbar.cpp:1143
+#: ../src/widgets/gradient-toolbar.cpp:1146
msgid "Select a stop for the current gradient"
-msgstr "Stopp fĂŒr derzeitigen Farbverlauf auswĂ€hlen"
+msgstr "Zwischenfarbe fĂŒr derzeitigen Farbverlauf auswĂ€hlen"
-#: ../src/widgets/gradient-toolbar.cpp:1144
+#: ../src/widgets/gradient-toolbar.cpp:1147
msgid "Stops:"
-msgstr "Stopps:"
+msgstr "Zwischenfarben:"
#. Label
-#: ../src/widgets/gradient-toolbar.cpp:1156
+#: ../src/widgets/gradient-toolbar.cpp:1159
#: ../src/widgets/gradient-vector.cpp:906
msgctxt "Gradient"
msgid "Offset:"
msgstr "Versatz:"
-#: ../src/widgets/gradient-toolbar.cpp:1156
+#: ../src/widgets/gradient-toolbar.cpp:1159
msgid "Offset of selected stop"
-msgstr "Den gewÀhlten Stopp verschieben"
+msgstr "Die gewÀhlten Zwischenfarbe verschieben"
-#: ../src/widgets/gradient-toolbar.cpp:1174
-#: ../src/widgets/gradient-toolbar.cpp:1175
+#: ../src/widgets/gradient-toolbar.cpp:1177
+#: ../src/widgets/gradient-toolbar.cpp:1178
msgid "Insert new stop"
-msgstr "Neuen Stopp einfĂŒgen"
+msgstr "Zwischenfarbe einfĂŒgen"
-#: ../src/widgets/gradient-toolbar.cpp:1188
-#: ../src/widgets/gradient-toolbar.cpp:1189
+#: ../src/widgets/gradient-toolbar.cpp:1191
+#: ../src/widgets/gradient-toolbar.cpp:1192
#: ../src/widgets/gradient-vector.cpp:888
msgid "Delete stop"
msgstr "Zwischenfarbe löschen"
-#: ../src/widgets/gradient-toolbar.cpp:1203
+#: ../src/widgets/gradient-toolbar.cpp:1206
msgid "Reverse the direction of the gradient"
msgstr "Die Richtung des Verlaufs umkehren"
-#: ../src/widgets/gradient-toolbar.cpp:1217
+#: ../src/widgets/gradient-toolbar.cpp:1220
msgid "Link gradients"
msgstr "VerknĂŒpfe FarbverlĂ€ufe"
-#: ../src/widgets/gradient-toolbar.cpp:1218
+#: ../src/widgets/gradient-toolbar.cpp:1221
msgid "Link gradients to change all related gradients"
msgstr "VerknĂŒpfe FarbverlĂ€ufe, um alle verbundenen FarbverlĂ€ufe zu Ă€ndern"
@@ -28479,7 +28598,7 @@ msgstr "Messwert aĂŒr ausgewĂ€hlte Objekte anzeigen"
#. Add the units menu.
#: ../src/widgets/lpe-toolbar.cpp:387 ../src/widgets/node-toolbar.cpp:613
#: ../src/widgets/paintbucket-toolbar.cpp:168
-#: ../src/widgets/rect-toolbar.cpp:379 ../src/widgets/select-toolbar.cpp:538
+#: ../src/widgets/rect-toolbar.cpp:378 ../src/widgets/select-toolbar.cpp:538
msgid "Units"
msgstr "Einheiten"
@@ -28508,73 +28627,102 @@ msgstr "Die SchriftgrĂ¶ĂŸe, die fĂŒr die Messungen verwendet werden"
msgid "The units to be used for the measurements"
msgstr "Die Einheiten, die fĂŒr die Messungen verwendet werden"
-#: ../src/widgets/mesh-toolbar.cpp:200
+#: ../src/widgets/mesh-toolbar.cpp:311
+#, fuzzy
+msgid "Set mesh type"
+msgstr "Textstil setzen"
+
+#: ../src/widgets/mesh-toolbar.cpp:334
msgid "normal"
msgstr "Normal"
-#: ../src/widgets/mesh-toolbar.cpp:200
+#: ../src/widgets/mesh-toolbar.cpp:334
msgid "Create mesh gradient"
-msgstr "Gitter-Farbverlauf erzeugen"
+msgstr "Verlaufsgitter erzeugen"
-#: ../src/widgets/mesh-toolbar.cpp:204
+#: ../src/widgets/mesh-toolbar.cpp:338
msgid "conical"
msgstr "konisch"
-#: ../src/widgets/mesh-toolbar.cpp:204
+#: ../src/widgets/mesh-toolbar.cpp:338
msgid "Create conical gradient"
msgstr "Konischen Farbverlauf erzeugen"
-#: ../src/widgets/mesh-toolbar.cpp:259
+#: ../src/widgets/mesh-toolbar.cpp:393
msgid "Rows"
msgstr "Reihen"
-#: ../src/widgets/mesh-toolbar.cpp:259
+#: ../src/widgets/mesh-toolbar.cpp:393
#: ../share/extensions/guides_creator.inx.h:5
#: ../share/extensions/layout_nup.inx.h:12
msgid "Rows:"
msgstr "Reihen:"
-#: ../src/widgets/mesh-toolbar.cpp:259
+#: ../src/widgets/mesh-toolbar.cpp:393
msgid "Number of rows in new mesh"
msgstr "Anzahl der Zeilen im neuen Gitter"
-#: ../src/widgets/mesh-toolbar.cpp:275
+#: ../src/widgets/mesh-toolbar.cpp:409
msgid "Columns"
msgstr "Spalten"
-#: ../src/widgets/mesh-toolbar.cpp:275
+#: ../src/widgets/mesh-toolbar.cpp:409
#: ../share/extensions/guides_creator.inx.h:4
msgid "Columns:"
msgstr "Spalten:"
-#: ../src/widgets/mesh-toolbar.cpp:275
+#: ../src/widgets/mesh-toolbar.cpp:409
msgid "Number of columns in new mesh"
msgstr "Anzahl der Spalten im neuen Gitter"
-#: ../src/widgets/mesh-toolbar.cpp:289
+#: ../src/widgets/mesh-toolbar.cpp:423
msgid "Edit Fill"
msgstr "FĂŒllung bearbeiten"
-#: ../src/widgets/mesh-toolbar.cpp:290
+#: ../src/widgets/mesh-toolbar.cpp:424
msgid "Edit fill mesh"
msgstr "FĂŒllungsgitter bearbeiten"
-#: ../src/widgets/mesh-toolbar.cpp:301
+#: ../src/widgets/mesh-toolbar.cpp:435
msgid "Edit Stroke"
msgstr "Kontur bearbeiten"
-#: ../src/widgets/mesh-toolbar.cpp:302
+#: ../src/widgets/mesh-toolbar.cpp:436
msgid "Edit stroke mesh"
msgstr "Konturgitter bearbeiten"
-#: ../src/widgets/mesh-toolbar.cpp:313 ../src/widgets/node-toolbar.cpp:521
+#: ../src/widgets/mesh-toolbar.cpp:447 ../src/widgets/node-toolbar.cpp:521
msgid "Show Handles"
msgstr "Anfasser zeigen"
-#: ../src/widgets/mesh-toolbar.cpp:314
-#, fuzzy
+#: ../src/widgets/mesh-toolbar.cpp:448
msgid "Show side and tensor handles"
-msgstr "Anzeigen der Anfasser"
+msgstr "Anzeigen der seitlichen und Tensor-Anfasser"
+
+#: ../src/widgets/mesh-toolbar.cpp:463
+msgid "WARNING: Mesh SVG Syntax Subject to Change"
+msgstr ""
+
+#: ../src/widgets/mesh-toolbar.cpp:473
+msgctxt "Type"
+msgid "Coons"
+msgstr ""
+
+#: ../src/widgets/mesh-toolbar.cpp:476
+msgid "Bicubic"
+msgstr ""
+
+#: ../src/widgets/mesh-toolbar.cpp:478
+msgid "Coons"
+msgstr ""
+
+#: ../src/widgets/mesh-toolbar.cpp:479
+msgid "Coons: no smoothing. Bicubic: smoothing across patch boundaries."
+msgstr ""
+
+#: ../src/widgets/mesh-toolbar.cpp:481 ../src/widgets/pencil-toolbar.cpp:278
+msgid "Smoothing:"
+msgstr "GlÀttung:"
#: ../src/widgets/node-toolbar.cpp:341
msgid "Insert node"
@@ -28771,7 +28919,7 @@ msgstr "Y-Koordinate der Auswahl"
#: ../src/widgets/paint-selector.cpp:222
msgid "No paint"
-msgstr "Nicht zeichnen"
+msgstr "Keine Farbe"
#: ../src/widgets/paint-selector.cpp:224
msgid "Flat color"
@@ -28786,13 +28934,12 @@ msgid "Radial gradient"
msgstr "Radialer Farbverlauf"
#: ../src/widgets/paint-selector.cpp:231
-#, fuzzy
msgid "Mesh gradient"
-msgstr "Farbverlaufs-Anfasser verschieben"
+msgstr "Verlaufsgitter"
#: ../src/widgets/paint-selector.cpp:238
msgid "Unset paint (make it undefined so it can be inherited)"
-msgstr "Farbe nicht setzen (damit sie nicht ĂŒbernommen/vererbt werden kann)"
+msgstr "Farbe nicht setzen (damit sie geerbt werden kann)"
#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty
#: ../src/widgets/paint-selector.cpp:255
@@ -28800,16 +28947,16 @@ msgid ""
"Any path self-intersections or subpaths create holes in the fill (fill-rule: "
"evenodd)"
msgstr ""
-"Überschneidungen desselben Pfades oder mit eingefĂŒgten Pfaden erzeugen "
-"Löcher (FĂŒllregel: evenodd)"
+"Überschneidungen im Pfad oder mit Pfadabschnitten erzeugen Löcher in der "
+"FĂŒllung (FĂŒllregel: evenodd)"
#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty
#: ../src/widgets/paint-selector.cpp:266
msgid ""
"Fill is solid unless a subpath is counterdirectional (fill-rule: nonzero)"
msgstr ""
-"VollstĂ€ndiges FĂŒllen, außer ein eingefĂŒgter Pfad lĂ€uft entgegengesetzt "
-"(FĂŒllregel: nonzero)"
+"VollstĂ€ndige FĂŒllung, solange kein Pfadabschnitt in entgegengesetzter "
+"Richtung verlĂ€uft (FĂŒllregel: nonzero)"
#: ../src/widgets/paint-selector.cpp:600
msgid "<b>No objects</b>"
@@ -28829,7 +28976,7 @@ msgstr "<b>Keine Farbe</b>"
#: ../src/widgets/paint-selector.cpp:704
msgid "<b>Flat color</b>"
-msgstr "<b>Farbbereich</b>"
+msgstr "<b>Einfache Farbe</b>"
#. sp_gradient_selector_set_mode(SP_GRADIENT_SELECTOR(gsel), SP_GRADIENT_SELECTOR_MODE_LINEAR);
#: ../src/widgets/paint-selector.cpp:773
@@ -28841,9 +28988,8 @@ msgid "<b>Radial gradient</b>"
msgstr "<b>Radialer Farbverlauf</b>"
#: ../src/widgets/paint-selector.cpp:781
-#, fuzzy
msgid "<b>Mesh gradient</b>"
-msgstr "<b>Linearer Farbverlauf</b>"
+msgstr "<b>Verlaufsgitter</b>"
#: ../src/widgets/paint-selector.cpp:1080
msgid ""
@@ -28852,8 +28998,8 @@ msgid ""
"create a new pattern from selection."
msgstr ""
"Benutzen Sie das <b>Knotenwerkzeug</b>, um Position Winkel und GrĂ¶ĂŸe des "
-"Musters auf der ArbeitsflĂ€che anzupassen. Mit <b>Objekt » FĂŒllmuster » "
-"Objekte in FĂŒllmuster umwandeln</b> lassen sich neue FĂŒllmuster von "
+"Musters auf der ArbeitsflĂ€che anzupassen. Mit <b>Objekt „ FĂŒllmuster "
+"„ Objekte in FĂŒllmuster umwandeln</b> lassen sich neue FĂŒllmuster von "
"ausgewÀhlten Objekten erzeugen."
#: ../src/widgets/paint-selector.cpp:1093
@@ -28862,7 +29008,7 @@ msgstr "<b>FĂŒllmuster</b>"
#: ../src/widgets/paint-selector.cpp:1187
msgid "<b>Swatch fill</b>"
-msgstr "<b>FarbmusterfĂŒllung</b>"
+msgstr "<b>Farbmuster</b>"
#: ../src/widgets/paintbucket-toolbar.cpp:135
msgid "Fill by"
@@ -28886,17 +29032,18 @@ msgstr ""
#: ../src/widgets/paintbucket-toolbar.cpp:176
msgid "Grow/shrink by"
-msgstr "VergrĂ¶ĂŸern/Verkleinern um:"
+msgstr "VergrĂ¶ĂŸern/Verkleinern um"
#: ../src/widgets/paintbucket-toolbar.cpp:176
msgid "Grow/shrink by:"
-msgstr "VergrĂ¶ĂŸern/Verkleinern um:"
+msgstr "VergrĂ¶ĂŸern/Verkleinern um"
#: ../src/widgets/paintbucket-toolbar.cpp:177
msgid ""
"The amount to grow (positive) or shrink (negative) the created fill path"
msgstr ""
-"Erzeugten FĂŒllungspfad vergrĂ¶ĂŸern (positive) oder verkleinern (negativ)"
+"Betrag um den der erzeugte FĂŒllungspfad vergrĂ¶ĂŸert (positiv) oder "
+"verkleinert (negativ) wird"
#: ../src/widgets/paintbucket-toolbar.cpp:202
msgid "Close gaps"
@@ -28917,8 +29064,8 @@ msgid ""
"Reset paint bucket parameters to defaults (use Inkscape Preferences > Tools "
"to change defaults)"
msgstr ""
-"Die Parameter des Farbeimers auf Vorgabewerte zurĂŒcksetzen (MenĂŒ Datei » "
-"Inkscape-Einstellungen » Werkzeuge, um die Vorgabeeinstellungen zu Àndern)"
+"Die Parameter des Farbeimers auf Vorgabewerte zurĂŒcksetzen (MenĂŒ Datei "
+"„ Inkscape-Einstellungen „ Werkzeuge, um die Vorgabeeinstellungen zu Ă€ndern)"
#: ../src/widgets/pencil-toolbar.cpp:96
msgid "Bezier"
@@ -28997,10 +29144,6 @@ msgid "(few nodes, smooth)"
msgstr "(wenige Knoten, weich)"
#: ../src/widgets/pencil-toolbar.cpp:278
-msgid "Smoothing:"
-msgstr "GlÀttung:"
-
-#: ../src/widgets/pencil-toolbar.cpp:278
msgid "Smoothing: "
msgstr "GlÀttung:"
@@ -29013,98 +29156,98 @@ msgid ""
"Reset pencil parameters to defaults (use Inkscape Preferences > Tools to "
"change defaults)"
msgstr ""
-"Die Parameter des Stiftes auf Vorgabewerte zurĂŒcksetzen (MenĂŒ Datei » "
-"Inkscape-Einstellungen » Werkzeuge, um die Grundeinstellungen zu Àndern)"
+"Die Parameter des Stiftes auf Vorgabewerte zurĂŒcksetzen (MenĂŒ Datei "
+"„ Inkscape-Einstellungen „ Werkzeuge, um die Grundeinstellungen zu Ă€ndern)"
#: ../src/widgets/rect-toolbar.cpp:124
msgid "Change rectangle"
msgstr "Rechteck Àndern"
-#: ../src/widgets/rect-toolbar.cpp:318
+#: ../src/widgets/rect-toolbar.cpp:317
msgid "W:"
msgstr "W:"
-#: ../src/widgets/rect-toolbar.cpp:318
+#: ../src/widgets/rect-toolbar.cpp:317
msgid "Width of rectangle"
msgstr "Breite des Rechtecks"
-#: ../src/widgets/rect-toolbar.cpp:335
+#: ../src/widgets/rect-toolbar.cpp:334
msgid "H:"
msgstr "H:"
-#: ../src/widgets/rect-toolbar.cpp:335
+#: ../src/widgets/rect-toolbar.cpp:334
msgid "Height of rectangle"
msgstr "Höhe des Rechtecks"
-#: ../src/widgets/rect-toolbar.cpp:349 ../src/widgets/rect-toolbar.cpp:364
+#: ../src/widgets/rect-toolbar.cpp:348 ../src/widgets/rect-toolbar.cpp:363
msgid "not rounded"
msgstr "nicht abgerundet"
-#: ../src/widgets/rect-toolbar.cpp:352
+#: ../src/widgets/rect-toolbar.cpp:351
msgid "Horizontal radius"
msgstr "Horizontaler Radius"
-#: ../src/widgets/rect-toolbar.cpp:352
+#: ../src/widgets/rect-toolbar.cpp:351
msgid "Rx:"
msgstr "Rx:"
-#: ../src/widgets/rect-toolbar.cpp:352
+#: ../src/widgets/rect-toolbar.cpp:351
msgid "Horizontal radius of rounded corners"
msgstr "Horizontaler Radius einer abgerundeten Ecke"
-#: ../src/widgets/rect-toolbar.cpp:367
+#: ../src/widgets/rect-toolbar.cpp:366
msgid "Vertical radius"
msgstr "Vertikaler Radius"
-#: ../src/widgets/rect-toolbar.cpp:367
+#: ../src/widgets/rect-toolbar.cpp:366
msgid "Ry:"
msgstr "Ry:"
-#: ../src/widgets/rect-toolbar.cpp:367
+#: ../src/widgets/rect-toolbar.cpp:366
msgid "Vertical radius of rounded corners"
msgstr "Vertikaler Radius einer abgerundeten Ecke"
-#: ../src/widgets/rect-toolbar.cpp:386
+#: ../src/widgets/rect-toolbar.cpp:385
msgid "Not rounded"
msgstr "Nicht abgerundet"
-#: ../src/widgets/rect-toolbar.cpp:387
+#: ../src/widgets/rect-toolbar.cpp:386
msgid "Make corners sharp"
msgstr "Spitze Ecken"
-#: ../src/widgets/ruler.cpp:192
+#: ../src/widgets/ruler.cpp:193
msgid "The orientation of the ruler"
msgstr "Die Ausrichtung des Lineals"
-#: ../src/widgets/ruler.cpp:202
+#: ../src/widgets/ruler.cpp:203
msgid "Unit of the ruler"
msgstr "Einheit des Lineals"
-#: ../src/widgets/ruler.cpp:209
+#: ../src/widgets/ruler.cpp:210
msgid "Lower"
msgstr "Untere"
-#: ../src/widgets/ruler.cpp:210
+#: ../src/widgets/ruler.cpp:211
msgid "Lower limit of ruler"
msgstr "Untergrenze des Lineals"
-#: ../src/widgets/ruler.cpp:219
+#: ../src/widgets/ruler.cpp:220
msgid "Upper"
msgstr "Obere"
-#: ../src/widgets/ruler.cpp:220
+#: ../src/widgets/ruler.cpp:221
msgid "Upper limit of ruler"
msgstr "Obergrenze des Lineals"
-#: ../src/widgets/ruler.cpp:230
+#: ../src/widgets/ruler.cpp:231
msgid "Position of mark on the ruler"
msgstr "Position der Markierung auf dem Lineal"
-#: ../src/widgets/ruler.cpp:239
+#: ../src/widgets/ruler.cpp:240
msgid "Max Size"
msgstr "Maximale GrĂ¶ĂŸe"
-#: ../src/widgets/ruler.cpp:240
+#: ../src/widgets/ruler.cpp:241
msgid "Maximum size of the ruler"
msgstr "MaximalgrĂ¶ĂŸe des Lineals"
@@ -29488,8 +29631,8 @@ msgid ""
"Reset shape parameters to defaults (use Inkscape Preferences > Tools to "
"change defaults)"
msgstr ""
-"Die Parameter der Formen auf Vorgabewerte zurĂŒcksetzen (MenĂŒ Datei » "
-"Inkscape-Einstellungen » Werkzeuge, um die Vorgabeeinstellungen zu Àndern)"
+"Die Parameter der Formen auf Vorgabewerte zurĂŒcksetzen (MenĂŒ Datei "
+"„ Inkscape-Einstellungen „ Werkzeuge, um die Vorgabeeinstellungen zu Ă€ndern)"
# (swatches)
#. Width
@@ -30153,7 +30296,7 @@ msgstr "Zeichendrehung (Grad)"
#: ../src/widgets/toolbox.cpp:181
msgid "Color/opacity used for color tweaking"
-msgstr "Farbe / OpazitÀt zur Farbjustage"
+msgstr "Farbe/Deckkraft fĂŒr Optimierung durch EinfĂ€rben"
#: ../src/widgets/toolbox.cpp:189
msgid "Style of new stars"
@@ -30195,149 +30338,150 @@ msgstr "\"Beschreibung fehlt noch!\""
msgid "Style of Paint Bucket fill objects"
msgstr "Stil von neuen Farbeimer-Objekten"
-#: ../src/widgets/toolbox.cpp:1681
+#: ../src/widgets/toolbox.cpp:1683
msgid "Bounding box"
msgstr "Rahmen"
-#: ../src/widgets/toolbox.cpp:1681
+#: ../src/widgets/toolbox.cpp:1683
msgid "Snap bounding boxes"
-msgstr "Am Rahmen einrasten"
+msgstr "Umrandung einrasten"
-#: ../src/widgets/toolbox.cpp:1690
+#: ../src/widgets/toolbox.cpp:1692
msgid "Bounding box edges"
msgstr "Kanten der Umrandung"
-#: ../src/widgets/toolbox.cpp:1690
+#: ../src/widgets/toolbox.cpp:1692
msgid "Snap to edges of a bounding box"
msgstr "An Kanten einer Umrandung einrasten"
-#: ../src/widgets/toolbox.cpp:1699
+#: ../src/widgets/toolbox.cpp:1701
msgid "Bounding box corners"
msgstr "Ecken der Umrandung"
-#: ../src/widgets/toolbox.cpp:1699
+#: ../src/widgets/toolbox.cpp:1701
msgid "Snap bounding box corners"
-msgstr "An Ecken der Umrandung einrasten"
+msgstr "Ecken der Umrandung einrasten"
-#: ../src/widgets/toolbox.cpp:1708
+#: ../src/widgets/toolbox.cpp:1710
msgid "BBox Edge Midpoints"
-msgstr "Mittenpunkte der Umrandungskanten"
+msgstr "Mittelpunkte der Umrandungslinien"
-#: ../src/widgets/toolbox.cpp:1708
+#: ../src/widgets/toolbox.cpp:1710
msgid "Snap midpoints of bounding box edges"
-msgstr "An Mittelpunkten von Umrandungslinien ein-/ausrasten"
+msgstr "Mittelpunkte von Umrandungslinien einrasten"
-#: ../src/widgets/toolbox.cpp:1718
+#: ../src/widgets/toolbox.cpp:1720
msgid "BBox Centers"
msgstr "Mittelpunkt Umrandung"
-#: ../src/widgets/toolbox.cpp:1718
+#: ../src/widgets/toolbox.cpp:1720
msgid "Snapping centers of bounding boxes"
-msgstr "An Mittelpunkten von Umrandungen ein-/ausrasten"
+msgstr "Mittelpunkte von Umrandungen einrasten"
-#: ../src/widgets/toolbox.cpp:1727
+#: ../src/widgets/toolbox.cpp:1729
msgid "Snap nodes, paths, and handles"
msgstr "Knoten, Pfade und Anfasser einrasten"
-#: ../src/widgets/toolbox.cpp:1735
+#: ../src/widgets/toolbox.cpp:1737
msgid "Snap to paths"
-msgstr "An Objektpfaden einrasten"
+msgstr "An Pfaden einrasten"
-#: ../src/widgets/toolbox.cpp:1744
+#: ../src/widgets/toolbox.cpp:1746
msgid "Path intersections"
-msgstr "PfadĂŒberschneidung"
+msgstr "PfadĂŒberschneidungen"
-#: ../src/widgets/toolbox.cpp:1744
+#: ../src/widgets/toolbox.cpp:1746
msgid "Snap to path intersections"
msgstr "An PfadĂŒberschneidungen einrasten"
-#: ../src/widgets/toolbox.cpp:1753
+#: ../src/widgets/toolbox.cpp:1755
msgid "To nodes"
msgstr "An Knoten"
-#: ../src/widgets/toolbox.cpp:1753
+#: ../src/widgets/toolbox.cpp:1755
msgid "Snap cusp nodes, incl. rectangle corners"
-msgstr "An spitzen Knoten einrasten (inkl. Ecken von Rechtecken)"
+msgstr "Spitze Knoten einrasten, inkl. Ecken von Rechtecken"
-#: ../src/widgets/toolbox.cpp:1762
+#: ../src/widgets/toolbox.cpp:1764
msgid "Smooth nodes"
-msgstr "Glatte Knotten"
+msgstr "Glatte Knoten"
-#: ../src/widgets/toolbox.cpp:1762
+#: ../src/widgets/toolbox.cpp:1764
msgid "Snap smooth nodes, incl. quadrant points of ellipses"
-msgstr "Einrasten an glatten Knoten, inkl. Quadrant-Punkten von Ellipsen"
+msgstr "Glatte Knoten einrasten, inkl. Quadrantenpunkte von Ellipsen"
-#: ../src/widgets/toolbox.cpp:1771
+#: ../src/widgets/toolbox.cpp:1773
msgid "Line Midpoints"
msgstr "Linien-Mittelpunkte"
-#: ../src/widgets/toolbox.cpp:1771
+#: ../src/widgets/toolbox.cpp:1773
msgid "Snap midpoints of line segments"
-msgstr "Einrasten an Mittelpunkten von Liniensegmenten"
+msgstr "Mittelpunkte von Liniensegmenten einrasten"
-#: ../src/widgets/toolbox.cpp:1780
+#: ../src/widgets/toolbox.cpp:1782
msgid "Others"
msgstr "Andere"
-#: ../src/widgets/toolbox.cpp:1780
+#: ../src/widgets/toolbox.cpp:1782
msgid "Snap other points (centers, guide origins, gradient handles, etc.)"
msgstr ""
-"Einrasten an anderen Punkten (Zentren, Hilfslinien-UrsprĂŒnge, "
-"Verlaufsanfasser, usw.)"
+"Andere Punkte einrasten (Mittelpunkte, UrsprĂŒnge von Hilfslinien, "
+"Anfasser von FarbverlÀufen, usw.)"
-#: ../src/widgets/toolbox.cpp:1788
+#: ../src/widgets/toolbox.cpp:1790
msgid "Object Centers"
-msgstr "Objektzentrum"
+msgstr "Objektmittelpunkte"
-#: ../src/widgets/toolbox.cpp:1788
+#: ../src/widgets/toolbox.cpp:1790
msgid "Snap centers of objects"
-msgstr "An Objektmittelpunkten einrasten"
+msgstr "Objektmittelpunkte einrasten"
-#: ../src/widgets/toolbox.cpp:1797
+#: ../src/widgets/toolbox.cpp:1799
msgid "Rotation Centers"
msgstr "Drehpunkte"
-#: ../src/widgets/toolbox.cpp:1797
+#: ../src/widgets/toolbox.cpp:1799
msgid "Snap an item's rotation center"
-msgstr "An Drehpunkten von Objekten einrasten"
+msgstr "Drehpunkte von Objekten einrasten"
-#: ../src/widgets/toolbox.cpp:1806
+#: ../src/widgets/toolbox.cpp:1808
msgid "Text baseline"
msgstr "Text-Grundlinie"
-#: ../src/widgets/toolbox.cpp:1806
+#: ../src/widgets/toolbox.cpp:1808
msgid "Snap text anchors and baselines"
-msgstr "An TExtankern und Grundlinien einrasten"
+msgstr "Textanker und Grundlinien einrasten"
-#: ../src/widgets/toolbox.cpp:1816
+#: ../src/widgets/toolbox.cpp:1818
msgid "Page border"
msgstr "Seitenrand"
-#: ../src/widgets/toolbox.cpp:1816
+#: ../src/widgets/toolbox.cpp:1818
msgid "Snap to the page border"
msgstr "Am Seitenrand einrasten"
-#: ../src/widgets/toolbox.cpp:1825
+#: ../src/widgets/toolbox.cpp:1827
msgid "Snap to grids"
msgstr "Am Gitter einrasten"
-#: ../src/widgets/toolbox.cpp:1834
+#: ../src/widgets/toolbox.cpp:1836
msgid "Snap guides"
-msgstr "An FĂŒhrungslinien einrasten"
+msgstr "Hilfslinien einrasten"
#. Width
#: ../src/widgets/tweak-toolbar.cpp:125
msgid "(pinch tweak)"
-msgstr "(Zupfjustage)"
+msgstr "(Optimieren durch Zupfen)"
#: ../src/widgets/tweak-toolbar.cpp:125
msgid "(broad tweak)"
-msgstr "(breite Justage)"
+msgstr "(breite Optimierung)"
#: ../src/widgets/tweak-toolbar.cpp:128
msgid "The width of the tweak area (relative to the visible canvas area)"
msgstr ""
-"Breite des Justagebereichs (relativ zum sichtbaren ArbeitsflÀchenbereich)"
+"Breite des Optimierungsbereichs (relativ zum sichtbaren "
+"ArbeitsflÀchenbereich)"
#. Force
#: ../src/widgets/tweak-toolbar.cpp:142
@@ -30374,7 +30518,7 @@ msgstr "Her-/Wegbewegen"
#: ../src/widgets/tweak-toolbar.cpp:171
msgid "Move objects towards cursor; with Shift from cursor"
-msgstr "Verschiebt Objekte zum Cursor; mit Umschalt vom Mauszeiger weg"
+msgstr "Verschiebt Objekte zum Mauszeiger; mit Umschalt vom Mauszeiger weg"
#: ../src/widgets/tweak-toolbar.cpp:177
msgid "Move jitter mode"
@@ -30418,7 +30562,7 @@ msgstr "Teile des Pfades in eine beliebige Richtung schieben"
#: ../src/widgets/tweak-toolbar.cpp:212
msgid "Shrink/grow mode"
-msgstr "Schrumpf-/Wachstums-Modus"
+msgstr "Schrumpf-/VergĂ¶ĂŸerungs-Modus"
#: ../src/widgets/tweak-toolbar.cpp:213
msgid "Shrink (inset) parts of paths; with Shift grow (outset)"
@@ -30536,7 +30680,7 @@ msgstr ""
"Druckempfindlichkeit des EingabegerÀts benutzen, um die Kraft der "
"Anpassungsaktion zu bestimmen"
-#: ../share/extensions/convert2dashes.py:93
+#: ../share/extensions/convert2dashes.py:100
msgid ""
"The selected object is not a path.\n"
"Try using the procedure Path->Object to Path."
@@ -30605,7 +30749,7 @@ msgstr ""
"Module werden von der Erweiterung benötigt. Bitte installieren Sie diese und "
"versuchen es erneut."
-#: ../share/extensions/dxf_outlines.py:300
+#: ../share/extensions/dxf_outlines.py:299
msgid ""
"Error: Field 'Layer match name' must be filled when using 'By name match' "
"option"
@@ -30613,7 +30757,7 @@ msgstr ""
"Fehler: Feld 'Übereinstimmender Ebenenname' muss ausgefĂŒllt sein, wenn die "
"Option 'Nach NamensĂŒbereinstimmung' verwendet wird. "
-#: ../share/extensions/dxf_outlines.py:341
+#: ../share/extensions/dxf_outlines.py:340
#, python-format
msgid "Warning: Layer '%s' not found!"
msgstr "Warnung: Ebene '%s' nicht gefunden!"
@@ -30662,12 +30806,17 @@ msgid "Need at least 2 paths selected"
msgstr "Benötigt mindestens 2 ausgewÀhlte Pfade"
#: ../share/extensions/funcplot.py:48
-msgid "x-interval cannot be zero. Please modify 'Start X' or 'End X'"
+#, fuzzy
+msgid ""
+"x-interval cannot be zero. Please modify 'Start X value' or 'End X value'"
msgstr ""
"X-Interval kann nicht Null sein. Bitte verÀndern Sie 'Start X' oder 'Ende X'"
#: ../share/extensions/funcplot.py:60
-msgid "y-interval cannot be zero. Please modify 'Y top' or 'Y bottom'"
+#, fuzzy
+msgid ""
+"y-interval cannot be zero. Please modify 'Y value of rectangle's top' or 'Y "
+"value of rectangle's bottom'"
msgstr ""
"Y-Interval kann nicht Null sein. Bitte verÀndern Sie 'Y oben' oder 'Y unten'"
@@ -30953,14 +31102,19 @@ msgid "Please select an object"
msgstr "Bitte wÀhlen Sie ein Objekt."
#: ../share/extensions/gimp_xcf.py:39
-msgid "Gimp must be installed and set in your path variable."
+#, fuzzy
+msgid "Inkscape must be installed and set in your path variable."
msgstr "Gimp muss installiert und in Ihren Pfadvariablen gesetzt sein."
#: ../share/extensions/gimp_xcf.py:43
+msgid "Gimp must be installed and set in your path variable."
+msgstr "Gimp muss installiert und in Ihren Pfadvariablen gesetzt sein."
+
+#: ../share/extensions/gimp_xcf.py:47
msgid "An error occurred while processing the XCF file."
msgstr "Es ist beim Verarbeiten der XCF-Datei ein fehler aufgetreten."
-#: ../share/extensions/gimp_xcf.py:177
+#: ../share/extensions/gimp_xcf.py:185
msgid "This extension requires at least one non empty layer."
msgstr "Diese Erweiterung benötigt mindestens eine nicht leere Ebene."
@@ -30973,7 +31127,8 @@ msgid "Movements"
msgstr "Bewegungen"
#: ../share/extensions/hpgl_decoder.py:44
-msgid "Pen #"
+#, fuzzy
+msgid "Pen "
msgstr "Stift #"
#. issue error if no hpgl data found
@@ -31033,7 +31188,7 @@ msgstr "Kein passender Knoten fĂŒr Ausdruck: %s"
#: ../share/extensions/inkex.py:313
msgid "SVG Width not set correctly! Assuming width = 100"
-msgstr ""
+msgstr "Breite des SVGs nicht richtig gesetzt. Benutze width = 100"
#: ../share/extensions/interp_att_g.py:167
msgid "There is no selection to interpolate"
@@ -31345,17 +31500,17 @@ msgstr ""
" Versuchen sie den Befehl Pfad | Objekt in Pfad umwandeln."
#. issue error if no paths found
-#: ../share/extensions/plotter.py:66
+#: ../share/extensions/plotter.py:67
msgid ""
"No paths where found. Please convert all objects you want to plot into paths."
msgstr ""
"Keine Pfade gefunden. Bitte alle zu plottenden Objekte in Pfade umwandeln."
-#: ../share/extensions/plotter.py:143
+#: ../share/extensions/plotter.py:144
msgid "pySerial is not installed."
msgstr "pySerial ist nicht installiert."
-#: ../share/extensions/plotter.py:163
+#: ../share/extensions/plotter.py:164
msgid ""
"Could not open port. Please check that your plotter is running, connected "
"and the settings are correct."
@@ -31746,7 +31901,7 @@ msgstr "Schwarz-Weiß"
#: ../share/extensions/color_blackandwhite.inx.h:2
msgid "Threshold Color (1-255):"
-msgstr "Schwellenwertfarbe (1-255):"
+msgstr "Schwellwertfarbe (1-255):"
#: ../share/extensions/color_brighter.inx.h:1
msgid "Brighter"
@@ -31910,7 +32065,7 @@ msgid ""
"If you do not have it, there is likely to be something wrong with your "
"Inkscape installation."
msgstr ""
-"Das Skript »dia2svg.sh« sollte in Ihrer Inkscape-Installation vorhanden "
+"Das Skript „dia2svg.sh“ sollte in Ihrer Inkscape-Installation vorhanden "
"sein. Wenn Sie es nicht haben, ist wahrscheinlich etwas mit Ihrer Inkscape-"
"Installation nicht in Ordnung."
@@ -31928,7 +32083,7 @@ msgstr "Dia-Zeichnung (*.dia)"
#: ../share/extensions/dia.inx.h:5
msgid "A diagram created with the program Dia"
-msgstr "Eine mit dem Programm »Dia« erstellte Zeichnung"
+msgstr "Eine mit dem Programm „Dia“ erstellte Zeichnung"
#: ../share/extensions/dimension.inx.h:1
msgid "Dimensions"
@@ -32258,7 +32413,7 @@ msgstr "AutoCAD DXF R13 (*.dxf)"
#: ../share/extensions/dxf_input.inx.h:20
msgid "Import AutoCAD's Document Exchange Format"
-msgstr "AutoCADs »Document Exchange Format« importieren"
+msgstr "AutoCADs „Document Exchange Format“ importieren"
#: ../share/extensions/dxf_outlines.inx.h:1
msgid "Desktop Cutting Plotter"
@@ -32766,11 +32921,12 @@ msgid ""
"\n"
"The constants pi and e are also available."
msgstr ""
-"Die folgenden Standard-Mathematik-Funktionen von Python sind verfĂŒgbar: ceil"
-"(x); fabs(x); floor(x); fmod(x,y); frexp(x); ldexp(x,i); modf(x); exp(x); log"
-"(x [, base]); log10(x); pow(x,y); sqrt(x); acos(x); asin(x); atan(x); atan2"
-"(y,x); hypot(x,y); cos(x); sin(x); tan(x); degrees(x); radians(x); cosh(x); "
-"sinh(x); tanh(x). Die Konstanten pi und e sind ebenfalls verfĂŒgbar."
+"Die folgenden Standard-Mathematik-Funktionen von Python sind verfĂŒgbar: "
+"ceil(x); fabs(x); floor(x); fmod(x,y); frexp(x); ldexp(x,i); modf(x); "
+"exp(x); log(x [, base]); log10(x); pow(x,y); sqrt(x); acos(x); asin(x); "
+"atan(x); atan2(y,x); hypot(x,y); cos(x); sin(x); tan(x); degrees(x); "
+"radians(x); cosh(x); sinh(x); tanh(x). Die Konstanten pi und e sind "
+"ebenfalls verfĂŒgbar."
#: ../share/extensions/funcplot.inx.h:31
msgid "Function:"
@@ -33576,13 +33732,13 @@ msgid ""
"of the pattern and get an empty border."
msgstr ""
"Erstellt ein zufÀlliges Muster aus Voronoi-Zellen. Das Muster wird spÀter im "
-"FĂŒlungs- und Kontur-Dialog verfĂŒgbar seion. Sie mĂŒssen dazu ein Objekt oder "
+"FĂŒllungs- und Kontur-Dialog verfĂŒgbar sein. Sie mĂŒssen dazu ein Objekt oder "
"ein Gruppe auswÀhlen.\n"
"\n"
" Ist der Rand null, wird das Muster an den Kanten unterbrochen. Nehmen Sie "
"einen positiven Wert, grĂ¶ĂŸer als die ZellgrĂ¶ĂŸe, um einen weichen Übergang "
"zwischen Zellen und Rand zu schaffen. Nehmen Sie einen negativen Wert, um "
-"die MustergrĂ¶ĂŸe zu reduzieren und einen lleren Rand zu erzeugen."
+"die MustergrĂ¶ĂŸe zu reduzieren und einen lehren Rand zu erzeugen."
#: ../share/extensions/gimp_xcf.inx.h:1
msgid "GIMP XCF"
@@ -33848,15 +34004,15 @@ msgstr "StrichstÀrke Winkelnebenteilung (px):"
#: ../share/extensions/guides_creator.inx.h:1
msgid "Guides creator"
-msgstr "FĂŒhrungslinien erstellen"
+msgstr "Hilfslinien erstellen"
#: ../share/extensions/guides_creator.inx.h:2
msgid "Regular guides"
-msgstr "RegelmĂ€ĂŸige FĂŒhrungslinien"
+msgstr "RegelmĂ€ĂŸige Hilfslinien"
#: ../share/extensions/guides_creator.inx.h:3
msgid "Guides preset:"
-msgstr "FĂŒhrungslinienvoreinstellung:"
+msgstr "Hilfslinienvoreinstellung:"
#: ../share/extensions/guides_creator.inx.h:6
msgid "Start from edges"
@@ -33864,7 +34020,7 @@ msgstr "An Kanten beginnen"
#: ../share/extensions/guides_creator.inx.h:7
msgid "Delete existing guides"
-msgstr "Lösche existierende FĂŒhrungslinien"
+msgstr "Lösche existierende Hilfslinien"
#: ../share/extensions/guides_creator.inx.h:8
msgid "Custom..."
@@ -33880,7 +34036,7 @@ msgstr "Drittel-Regel"
#: ../share/extensions/guides_creator.inx.h:11
msgid "Diagonal guides"
-msgstr "Diagonale FĂŒhrungslinien"
+msgstr "Diagonale Hilfslinien"
#: ../share/extensions/guides_creator.inx.h:12
msgid "Upper left corner"
@@ -34138,13 +34294,13 @@ msgstr ""
#: ../share/extensions/hpgl_input.inx.h:3
#: ../share/extensions/hpgl_output.inx.h:4
-#: ../share/extensions/plotter.inx.h:23
+#: ../share/extensions/plotter.inx.h:25
msgid "Resolution X (dpi):"
msgstr "X-Auflösung (dpi):"
#: ../share/extensions/hpgl_input.inx.h:4
#: ../share/extensions/hpgl_output.inx.h:5
-#: ../share/extensions/plotter.inx.h:24
+#: ../share/extensions/plotter.inx.h:26
msgid ""
"The amount of steps the plotter moves if it moves for 1 inch on the X axis "
"(Default: 1016.0)"
@@ -34154,13 +34310,13 @@ msgstr ""
#: ../share/extensions/hpgl_input.inx.h:5
#: ../share/extensions/hpgl_output.inx.h:6
-#: ../share/extensions/plotter.inx.h:25
+#: ../share/extensions/plotter.inx.h:27
msgid "Resolution Y (dpi):"
msgstr "Y-Auflösung (dpi):"
#: ../share/extensions/hpgl_input.inx.h:6
#: ../share/extensions/hpgl_output.inx.h:7
-#: ../share/extensions/plotter.inx.h:26
+#: ../share/extensions/plotter.inx.h:28
msgid ""
"The amount of steps the plotter moves if it moves for 1 inch on the Y axis "
"(Default: 1016.0)"
@@ -34202,27 +34358,27 @@ msgstr ""
"(ErweiterungsmenĂŒ), um direkt ĂŒber eine serielle Verbindung zu plotten."
#: ../share/extensions/hpgl_output.inx.h:3
-#: ../share/extensions/plotter.inx.h:22
+#: ../share/extensions/plotter.inx.h:24
msgid "Plotter Settings "
msgstr "Plottereinstellungen "
#: ../share/extensions/hpgl_output.inx.h:8
-#: ../share/extensions/plotter.inx.h:27
+#: ../share/extensions/plotter.inx.h:29
msgid "Pen number:"
msgstr "Stiftnummer:"
#: ../share/extensions/hpgl_output.inx.h:9
-#: ../share/extensions/plotter.inx.h:28
+#: ../share/extensions/plotter.inx.h:30
msgid "The number of the pen (tool) to use (Standard: '1')"
msgstr "Die Nummer des zu verwendenden Stiftes (Werkzeug) (Standard: '1')"
#: ../share/extensions/hpgl_output.inx.h:10
-#: ../share/extensions/plotter.inx.h:29
+#: ../share/extensions/plotter.inx.h:31
msgid "Pen force (g):"
msgstr "Stiftdruck (g):"
#: ../share/extensions/hpgl_output.inx.h:11
-#: ../share/extensions/plotter.inx.h:30
+#: ../share/extensions/plotter.inx.h:32
msgid ""
"The amount of force pushing down the pen in grams, set to 0 to omit command; "
"most plotters ignore this command (Default: 0)"
@@ -34231,7 +34387,7 @@ msgstr ""
"Auf 0 setzen, um den Befehl zu ignorieren (Standard)"
#: ../share/extensions/hpgl_output.inx.h:12
-#: ../share/extensions/plotter.inx.h:31
+#: ../share/extensions/plotter.inx.h:33
msgid "Pen speed (cm/s or mm/s):"
msgstr "Stiftgeschwindigkeit (cm/s oder mm/s):"
@@ -34249,53 +34405,53 @@ msgid "Rotation (°, Clockwise):"
msgstr "Drehung (°, im Uhrzeigersinn):"
#: ../share/extensions/hpgl_output.inx.h:15
-#: ../share/extensions/plotter.inx.h:34
+#: ../share/extensions/plotter.inx.h:36
msgid "Rotation of the drawing (Default: 0°)"
msgstr "Drehung der Zeichnung in Grad (Standard 0°)"
#: ../share/extensions/hpgl_output.inx.h:16
-#: ../share/extensions/plotter.inx.h:35
+#: ../share/extensions/plotter.inx.h:37
msgid "Mirror X axis"
msgstr "X-Spiegelachse"
#: ../share/extensions/hpgl_output.inx.h:17
-#: ../share/extensions/plotter.inx.h:36
+#: ../share/extensions/plotter.inx.h:38
msgid "Check this to mirror the X axis (Default: Unchecked)"
msgstr "X-Achse spiegeln"
#: ../share/extensions/hpgl_output.inx.h:18
-#: ../share/extensions/plotter.inx.h:37
+#: ../share/extensions/plotter.inx.h:39
msgid "Mirror Y axis"
msgstr "Y-Spiegelachse"
#: ../share/extensions/hpgl_output.inx.h:19
-#: ../share/extensions/plotter.inx.h:38
+#: ../share/extensions/plotter.inx.h:40
msgid "Check this to mirror the Y axis (Default: Unchecked)"
msgstr "Y-Achse spiegeln"
#: ../share/extensions/hpgl_output.inx.h:20
-#: ../share/extensions/plotter.inx.h:39
+#: ../share/extensions/plotter.inx.h:41
msgid "Center zero point"
msgstr "Zentrierter Nullpunkt"
#: ../share/extensions/hpgl_output.inx.h:21
-#: ../share/extensions/plotter.inx.h:40
+#: ../share/extensions/plotter.inx.h:42
msgid ""
"Check this if your plotter uses a centered zero point (Default: Unchecked)"
msgstr "WĂ€hlen wenn der verwendete Plotter seinen 0-Punkt in der Mitte hat."
#: ../share/extensions/hpgl_output.inx.h:22
-#: ../share/extensions/plotter.inx.h:41
+#: ../share/extensions/plotter.inx.h:43
msgid "Plot Features "
msgstr "Plot-Funktionen "
#: ../share/extensions/hpgl_output.inx.h:23
-#: ../share/extensions/plotter.inx.h:42
+#: ../share/extensions/plotter.inx.h:44
msgid "Overcut (mm):"
msgstr "Überschnitt (mm):"
#: ../share/extensions/hpgl_output.inx.h:24
-#: ../share/extensions/plotter.inx.h:43
+#: ../share/extensions/plotter.inx.h:45
msgid ""
"The distance in mm that will be cut over the starting point of the path to "
"prevent open paths, set to 0.0 to omit command (Default: 1.00)"
@@ -34304,12 +34460,12 @@ msgstr ""
"wird, um offene Pfade zu schĂŒtzen (Standard: '1.00')"
#: ../share/extensions/hpgl_output.inx.h:25
-#: ../share/extensions/plotter.inx.h:44
+#: ../share/extensions/plotter.inx.h:46
msgid "Tool offset (mm):"
msgstr "Werkzeugversatz (mm):"
#: ../share/extensions/hpgl_output.inx.h:26
-#: ../share/extensions/plotter.inx.h:45
+#: ../share/extensions/plotter.inx.h:47
msgid ""
"The offset from the tool tip to the tool axis in mm, set to 0.0 to omit "
"command (Default: 0.25)"
@@ -34318,12 +34474,12 @@ msgstr ""
"zu ĂŒbergehen (Standard: '0.25')"
#: ../share/extensions/hpgl_output.inx.h:27
-#: ../share/extensions/plotter.inx.h:46
+#: ../share/extensions/plotter.inx.h:48
msgid "Use precut"
msgstr "Überschnitt verwenden"
#: ../share/extensions/hpgl_output.inx.h:28
-#: ../share/extensions/plotter.inx.h:47
+#: ../share/extensions/plotter.inx.h:49
msgid ""
"Check this to cut a small line before the real drawing starts to correctly "
"align the tool orientation. (Default: Checked)"
@@ -34332,12 +34488,12 @@ msgstr ""
"Werkzeug richtig auszurichten."
#: ../share/extensions/hpgl_output.inx.h:29
-#: ../share/extensions/plotter.inx.h:48
+#: ../share/extensions/plotter.inx.h:50
msgid "Curve flatness:"
msgstr "Kurvenebenheit:"
#: ../share/extensions/hpgl_output.inx.h:30
-#: ../share/extensions/plotter.inx.h:49
+#: ../share/extensions/plotter.inx.h:51
msgid ""
"Curves are divided into lines, this number controls how fine the curves will "
"be reproduced, the smaller the finer (Default: '1.2')"
@@ -34346,12 +34502,12 @@ msgstr ""
"reproduziert werden; Je kleiner desto feiner (Standard: '1.2')"
#: ../share/extensions/hpgl_output.inx.h:31
-#: ../share/extensions/plotter.inx.h:50
+#: ../share/extensions/plotter.inx.h:52
msgid "Auto align"
msgstr "Automatisches Ausrichten"
#: ../share/extensions/hpgl_output.inx.h:32
-#: ../share/extensions/plotter.inx.h:51
+#: ../share/extensions/plotter.inx.h:53
msgid ""
"Check this to auto align the drawing to the zero point (Plus the tool offset "
"if used). If unchecked you have to make sure that all parts of your drawing "
@@ -34362,7 +34518,7 @@ msgstr ""
"Zeichnung innerhalb der Dokumentengrenzen sind. (Standard: ausgewÀhlt)"
#: ../share/extensions/hpgl_output.inx.h:33
-#: ../share/extensions/plotter.inx.h:54
+#: ../share/extensions/plotter.inx.h:56
msgid ""
"All these settings depend on the plotter you use, for more information "
"please consult the manual or homepage for your plotter."
@@ -34419,7 +34575,6 @@ msgstr "Referenz der Tasten- und Maus-Befehle"
#. i18n. Please don't translate it unless a page exists in your language
#: ../share/extensions/inkscape_help_keys.inx.h:3
-#, fuzzy
msgid "http://inkscape.org/doc/keys091.html"
msgstr "http://inkscape.org/doc/keys091.html"
@@ -34499,11 +34654,11 @@ msgstr "Endwert"
#: ../share/extensions/interp_att_g.inx.h:13
msgid "Translate X"
-msgstr "Übersetzer X"
+msgstr "Verschiebung X"
#: ../share/extensions/interp_att_g.inx.h:14
msgid "Translate Y"
-msgstr "Übersetzer Y"
+msgstr "Verschiebung Y"
#: ../share/extensions/interp_att_g.inx.h:15
#: ../share/extensions/markers_strokepaint.inx.h:9
@@ -35784,36 +35939,47 @@ msgid "The command language to use (Default: HPGL)"
msgstr "Die zu verwendende Befehlssprache (Standard: HPGL)"
#: ../share/extensions/plotter.inx.h:12
+msgid "Initialization commands:"
+msgstr ""
+
+#: ../share/extensions/plotter.inx.h:13
+msgid ""
+"Commands that will be sent to the plotter before the main data stream, only "
+"use this if you know what you are doing! (Default: Empty)"
+msgstr ""
+
+#: ../share/extensions/plotter.inx.h:14
msgid "Software (XON/XOFF)"
msgstr "Software (XON/XOFF)"
-#: ../share/extensions/plotter.inx.h:13
+#: ../share/extensions/plotter.inx.h:15
msgid "Hardware (RTS/CTS)"
msgstr "Hardware (RTS/CTS)"
-#: ../share/extensions/plotter.inx.h:14
+#: ../share/extensions/plotter.inx.h:16
msgid "Hardware (DSR/DTR + RTS/CTS)"
msgstr "Hardware (DSR/DTR + RTS/CTS)"
# CHECK
-#: ../share/extensions/plotter.inx.h:15
+#: ../share/extensions/plotter.inx.h:17
msgctxt "Flow control"
msgid "None"
msgstr "Keine"
-#: ../share/extensions/plotter.inx.h:16
+#: ../share/extensions/plotter.inx.h:18
msgid "HPGL"
msgstr "HPGL"
-#: ../share/extensions/plotter.inx.h:17
+#: ../share/extensions/plotter.inx.h:19
msgid "DMPL"
msgstr "DMPL"
-#: ../share/extensions/plotter.inx.h:18
-msgid "KNK Zing (HPGL variant)"
+#: ../share/extensions/plotter.inx.h:20
+#, fuzzy
+msgid "KNK Plotter (HPGL variant)"
msgstr "KNK Zing (HPGL-Variante)"
-#: ../share/extensions/plotter.inx.h:19
+#: ../share/extensions/plotter.inx.h:21
msgid ""
"Using wrong settings can under certain circumstances cause Inkscape to "
"freeze. Always save your work before plotting!"
@@ -35821,7 +35987,7 @@ msgstr ""
"Die Verwendung falscher Einstellungen kann zum Einfrieren von Inkscape "
"fĂŒhren. Bitte Datei vor dem Plotten immer speichern!"
-#: ../share/extensions/plotter.inx.h:20
+#: ../share/extensions/plotter.inx.h:22
msgid ""
"This can be a physical serial connection or a USB-to-Serial bridge. Ask your "
"plotter manufacturer for drivers if needed."
@@ -35829,11 +35995,11 @@ msgstr ""
"Es können serielle Verbindungen oder ein USB-Seriell-Konverter verwendet "
"werden. Fragen Sie Ihren Plotter-Hersteller wenn Sie Treiber benötigen."
-#: ../share/extensions/plotter.inx.h:21
+#: ../share/extensions/plotter.inx.h:23
msgid "Parallel (LPT) connections are not supported."
msgstr "Parallele (LPT) Verbindungen werden nicht unterstĂŒtzt."
-#: ../share/extensions/plotter.inx.h:32
+#: ../share/extensions/plotter.inx.h:34
msgid ""
"The speed the pen will move with in centimeters or millimeters per second "
"(depending on your plotter model), set to 0 to omit command. Most plotters "
@@ -35843,15 +36009,15 @@ msgstr ""
"ModellabhÀngig). Auf 0 setzen um denBefehl auszulassen . Die meisten Plotter "
"ignorieren diesen Befehl (Standard: 0)"
-#: ../share/extensions/plotter.inx.h:33
+#: ../share/extensions/plotter.inx.h:35
msgid "Rotation (°, clockwise):"
msgstr "Drehung (°, im Uhrzeigersinn):"
-#: ../share/extensions/plotter.inx.h:52
+#: ../share/extensions/plotter.inx.h:54
msgid "Show debug information"
msgstr "Debuginformation anzeigen"
-#: ../share/extensions/plotter.inx.h:53
+#: ../share/extensions/plotter.inx.h:55
msgid ""
"Check this to get verbose information about the plot without actually "
"sending something to the plotter (A.k.a. data dump) (Default: Unchecked)"
@@ -36643,11 +36809,13 @@ msgid "Seamless Pattern"
msgstr "Braille Muster"
#: ../share/extensions/seamless_pattern.inx.h:2
+#: ../share/extensions/seamless_pattern_procedural.inx.h:2
#, fuzzy
msgid "Custom Width (px):"
msgstr "Breite der Kontur, px"
#: ../share/extensions/seamless_pattern.inx.h:3
+#: ../share/extensions/seamless_pattern_procedural.inx.h:3
#, fuzzy
msgid "Custom Height (px):"
msgstr "Rechts (px):"
@@ -36660,16 +36828,6 @@ msgstr ""
msgid "Seamless Pattern Procedural"
msgstr ""
-#: ../share/extensions/seamless_pattern_procedural.inx.h:2
-#, fuzzy
-msgid "Custom Width (px.):"
-msgstr "Breite der Kontur, px"
-
-#: ../share/extensions/seamless_pattern_procedural.inx.h:3
-#, fuzzy
-msgid "Custom Height (px.):"
-msgstr "Rechts (px):"
-
#: ../share/extensions/setup_typography_canvas.inx.h:1
msgid "1 - Setup Typography Canvas"
msgstr "1 - Einrichtung der Typografie-ArbeitsflÀche"
@@ -36725,7 +36883,7 @@ msgstr "Sketch-Zeichnung (*.sk)"
#: ../share/extensions/sk_input.inx.h:3
msgid "A diagram created with the program Sketch"
-msgstr "Eine mit dem Programm »Sketch« erstellte Zeichnung"
+msgstr "Eine mit dem Programm „Sketch“ erstellte Zeichnung"
#: ../share/extensions/spirograph.inx.h:1
msgid "Spirograph"
@@ -37249,12 +37407,12 @@ msgstr "beim Klicken"
#: ../share/extensions/web-set-att.inx.h:9
#: ../share/extensions/web-transmit-att.inx.h:8
msgid "on focus"
-msgstr "bei Fokuserhalt"
+msgstr "beim Fokussieren"
#: ../share/extensions/web-set-att.inx.h:10
#: ../share/extensions/web-transmit-att.inx.h:9
msgid "on blur"
-msgstr "bei UnschÀrfe"
+msgstr "beim Defokussieren"
#: ../share/extensions/web-set-att.inx.h:11
#: ../share/extensions/web-transmit-att.inx.h:10
@@ -37264,22 +37422,22 @@ msgstr "beim Aktivieren"
#: ../share/extensions/web-set-att.inx.h:12
#: ../share/extensions/web-transmit-att.inx.h:11
msgid "on mouse down"
-msgstr "wenn Zeiger sich nach unten bewegt"
+msgstr "beim DrĂŒcken der Maustaste"
#: ../share/extensions/web-set-att.inx.h:13
#: ../share/extensions/web-transmit-att.inx.h:12
msgid "on mouse up"
-msgstr "wenn Zeiger sich nach oben bewegt"
+msgstr "beim Loslassen der Maustaste"
#: ../share/extensions/web-set-att.inx.h:14
#: ../share/extensions/web-transmit-att.inx.h:13
msgid "on mouse over"
-msgstr "bei Überfahren mit Zeiger"
+msgstr "wenn Mauszeiger das Objekt erreicht"
#: ../share/extensions/web-set-att.inx.h:15
#: ../share/extensions/web-transmit-att.inx.h:14
msgid "on mouse move"
-msgstr "bei Bewegen des Zeigers"
+msgstr "wenn Mauszeiger sich ĂŒber dem Objekt bewegt"
#: ../share/extensions/web-set-att.inx.h:16
#: ../share/extensions/web-transmit-att.inx.h:15
@@ -37381,8 +37539,8 @@ msgid ""
"This effect transmits one or more attributes from the first selected element "
"to the second when an event occurs."
msgstr ""
-"Dieser Effekt setzt Attribute im zweiten ausgewÀhlten Element, wenn ein "
-"Ereignis bei dem ersten Element eintritt."
+"Dieser Effekt sendet ein oder mehrere Attribute vom ersten ausgewÀhlten "
+"Element zum Zweiten wenn ein Ereignis eintritt."
#: ../share/extensions/web-transmit-att.inx.h:26
msgid ""
@@ -37390,7 +37548,7 @@ msgid ""
"with a space, and only with a space."
msgstr ""
"Wenn Sie mehr als nur ein Attribut ĂŒbertragen wollen, mĂŒssen Sie diese mit "
-"einzelnen Leerzeichen trennen. "
+"einzelnen Leerzeichen trennen."
#: ../share/extensions/webslicer_create_group.inx.h:1
msgid "Set a layout group"
@@ -37429,7 +37587,7 @@ msgstr "Prozent (relativ zur GrĂ¶ĂŸe des VorgĂ€ngers)"
#: ../share/extensions/webslicer_create_group.inx.h:10
msgid "Undefined (relative to non-floating content size)"
-msgstr "Unbestimmt (relativ zur nicht-schwimmenden InhaltsgrĂ¶ĂŸe)"
+msgstr "Unbestimmt (relativ zur nicht-fließenden InhaltsgrĂ¶ĂŸe)"
#: ../share/extensions/webslicer_create_group.inx.h:12
msgid ""
@@ -37647,6 +37805,27 @@ msgstr "Ein beliebtes Dateiformat fĂŒr Clipart"
msgid "XAML Input"
msgstr "XAML einlesen"
+#~ msgid "PS+LaTeX: Omit text in PS, and create LaTeX file"
+#~ msgstr "PS+LaTeX: Text in PS weglassen und LaTeX Datei erstellen"
+
+#~ msgid "EPS+LaTeX: Omit text in EPS, and create LaTeX file"
+#~ msgstr "EPS+LaTeX: Text in EPS weglassen und LaTeX Datei erstellen"
+
+#, fuzzy
+#~ msgid "Show helper paths"
+#~ msgstr "An Ausschneidepfaden einrasten"
+
+#~ msgid "_Templates..."
+#~ msgstr "_Vorlagen..."
+
+#, fuzzy
+#~ msgid "Custom Width (px.):"
+#~ msgstr "Breite der Kontur, px"
+
+#, fuzzy
+#~ msgid "Custom Height (px.):"
+#~ msgstr "Rechts (px):"
+
#~ msgid "A4 Landscape Page"
#~ msgstr "A4 Querformatseite"
@@ -38367,7 +38546,7 @@ msgstr "XAML einlesen"
#~ msgstr "Einstellen des \"rechten\" Endes der Tangente"
#~ msgid "Stack step:"
-#~ msgstr "Scans stapeln"
+#~ msgstr "Abtastungen stapeln"
#~ msgid "Point param:"
#~ msgstr "Punktparameter"
@@ -38765,7 +38944,7 @@ msgstr "XAML einlesen"
#~ "document (e.g. 'en-GB')"
#~ msgstr ""
#~ "Zweibuchstabiges Sprachsymbol mit optionalen Untersymbolen fĂŒr die "
-#~ "Sprache dieses Dokuments (z.B. »de-CH«)"
+#~ "Sprache dieses Dokuments (z.B. „de-CH“)"
#~ msgid ""
#~ "The topic of this document as comma-separated key words, phrases, or "
@@ -38808,7 +38987,7 @@ msgstr "XAML einlesen"
#~ msgstr "Voreinstellung"
#~ msgid "Vertical guide each:"
-#~ msgstr "Vertikale FĂŒhrungslinie alle"
+#~ msgstr "Vertikale Hilfslinie alle"
#~ msgid "1/2"
#~ msgstr "1/2"
@@ -38838,7 +39017,7 @@ msgstr "XAML einlesen"
#~ msgstr "1/10"
#~ msgid "Horizontal guide each:"
-#~ msgstr "Horizontale FĂŒhrungslinie alle:"
+#~ msgstr "Horizontale Hilfslinie alle:"
#~ msgid "Crop:"
#~ msgstr "Schneiden:"
@@ -39490,14 +39669,14 @@ msgstr "XAML einlesen"
#~ msgstr "Schmelz:"
#~ msgid "_Snap guides while dragging"
-#~ msgstr "An FĂŒhrungslinien wĂ€hrend dem Ziehen _einrasten"
+#~ msgstr "An Hilfslinien wÀhrend dem Ziehen _einrasten"
#~ msgid ""
#~ "While dragging a guide, snap to object nodes or bounding box corners "
#~ "('Snap to nodes' or 'snap to bounding box corners' must be enabled; only "
#~ "a small part of the guide near the cursor will snap)"
#~ msgstr ""
-#~ "WĂ€hrend des Ziehens einer FĂŒhrungslinie rastet diese an Objekt-Knoten "
+#~ "WĂ€hrend des Ziehens einer Hilfslinie rastet diese an Objekt-Knoten "
#~ "oder Ecken von UmrandungskÀsten ein (\"An Knoten einrasten\" oder \"An "
#~ "Umrandungsecken einrasten\" muss aktiviert sein; nur ein kleiner Teil um "
#~ "den Mauszeiger wird einrasten)"
@@ -39704,9 +39883,6 @@ msgstr "XAML einlesen"
#~ msgid "Draws a black outline around"
#~ msgstr "Zeichnet einen schwarzen Umriss "
-#~ msgid "Color outline"
-#~ msgstr "Farbige Außenlinie"
-
#~ msgid "Draws a colored outline around"
#~ msgstr "Zeichnet einen farbige Umriss"
@@ -40834,11 +41010,6 @@ msgstr "XAML einlesen"
#~ "nur horizontale/vertikale Verschiebung;<b>Strg+Alt</b>: entlang der "
#~ "Anfasser verschieben"
-#~ msgid "<b>Alt</b>: lock handle length; <b>Ctrl+Alt</b>: move along handles"
-#~ msgstr ""
-#~ "<b>Alt</b>: AnfasserlÀnge fixieren; <b>Strg+Alt</b>: Entlang der Anfasser "
-#~ "verschieben"
-
#~ msgid ""
#~ "<b>Node handle</b>: drag to shape the curve; with <b>Ctrl</b> to snap "
#~ "angle; with <b>Alt</b> to lock length; with <b>Shift</b> to rotate both "
@@ -41144,7 +41315,7 @@ msgstr "XAML einlesen"
#~ msgstr "Encapsulated Postscript Interchange (*.epsi)"
#~ msgid "Encapsulated Postscript with a thumbnail"
-#~ msgstr "»Encapsulated Postscript« mit einem Vorschaubild"
+#~ msgstr "„Encapsulated Postscript“ mit einem Vorschaubild"
#~ msgid "Glossy jelly"
#~ msgstr "GlÀnzendes Gelee"
@@ -41337,8 +41508,8 @@ msgstr "XAML einlesen"
#~ msgstr ""
#~ "Druckername (wie von lpstat -p angezeigt);\n"
#~ "leer lassen, um den Standarddrucker zu verwenden.\n"
-#~ "Verwenden Sie »> Dateiname« zum Drucken in eine Datei.\n"
-#~ "Verwenden Sie »| Prog. Arg.  « zur Weiterleitung an ein Programm."
+#~ "Verwenden Sie „> Dateiname“ zum Drucken in eine Datei.\n"
+#~ "Verwenden Sie „| Prog. Arg. 
“ zur Weiterleitung an ein Programm."
#~ msgid "PDF Print"
#~ msgstr "PDF-Druck"
@@ -41424,7 +41595,7 @@ msgstr "XAML einlesen"
#~ msgstr "Exportiere EPS-Dateien mit den SeitengrĂ¶ĂŸen als Umrandungsbox"
#~ msgid "Select <b>at least two objects</b> to combine."
-#~ msgstr "<b>Mindestens 2 Objekte</b> zum Kombinieren auswÀhlen."
+#~ msgstr "<b>Mindestens zwei Objekte</b> zum Kombinieren auswÀhlen."
#~ msgid "<b>Pushing %d</b> selected object"
#~ msgid_plural "<b>Pushing %d</b> selected objects"
@@ -41482,13 +41653,13 @@ msgstr "XAML einlesen"
#~ msgstr "Knoten an Objektpfaden einrasten"
#~ msgid "Snap bounding box corners and guides to bounding box edges"
-#~ msgstr "_Umrandungsbox an FĂŒhrungslinien einrasten"
+#~ msgstr "_Umrandungsbox an Hilfslinien einrasten"
#~ msgid "Snap bounding box corners and nodes to the page border"
-#~ msgstr "_Umrandungsbox an FĂŒhrungslinien einrasten"
+#~ msgstr "_Umrandungsbox an Hilfslinien einrasten"
#~ msgid "_Grid with guides"
-#~ msgstr "Gitter/FĂŒhrungslinien"
+#~ msgstr "Gitter/Hilfslinien"
#~ msgid "_Paths"
#~ msgstr "Pfade"
@@ -41503,7 +41674,7 @@ msgstr "XAML einlesen"
# !!! points?
#~ msgid "<b>Special points to consider</b>"
-#~ msgstr "_Knoten (Punkte) an FĂŒhrungslinien einrasten"
+#~ msgstr "_Knoten (Punkte) an Hilfslinien einrasten"
#~ msgid "Commands bar icon size"
#~ msgstr "Befehlsleiste Icon GrĂ¶ĂŸe"
diff --git a/po/is.po b/po/is.po
index f0836459c..19c422f3e 100644
--- a/po/is.po
+++ b/po/is.po
@@ -1,20 +1,22 @@
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
+# ĂžĂœĂ°ing inkscape.po ĂĄ Icelandic
+# Copyright (C) 2015 Icelandic Inksape Translators
+# This file is distributed under the same license as the Inkscape package.
#
# Sveinn Ă­ Felli <sv1@fellsnet.is>, 2015.
msgid ""
msgstr ""
-"Project-Id-Version: \n"
+"Project-Id-Version: inkscape\n"
"Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2015-01-28 11:25+0100\n"
-"PO-Revision-Date: 2015-03-11 18:53+0000\n"
+"POT-Creation-Date: 2015-03-10 09:10+0100\n"
+"PO-Revision-Date: 2015-04-30 14:44+0000\n"
"Last-Translator: Sveinn Ă­ Felli <sv1@fellsnet.is>\n"
"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
"Language: is\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"Plural-Forms: nplurals=2; plural=(n%10!=1 || n%100==11);\n"
+"\n"
"X-Generator: Lokalize 1.5\n"
#: ../inkscape.desktop.in.h:1
@@ -164,7 +166,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:38
msgid "Ripple"
-msgstr ""
+msgstr "GĂĄrur"
#: ../share/filters/filters.svg.h:39 ../share/filters/filters.svg.h:123
#: ../share/filters/filters.svg.h:315 ../share/filters/filters.svg.h:319
@@ -178,7 +180,7 @@ msgstr "Aflaga"
#: ../share/filters/filters.svg.h:40
msgid "Horizontal rippling of edges"
-msgstr ""
+msgstr "Lårétt gårun jaðra"
#: ../share/filters/filters.svg.h:42
msgid "Speckle"
@@ -628,7 +630,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:218
msgid "Raised Border"
-msgstr ""
+msgstr "HÊkkaðir jaðrar"
#: ../share/filters/filters.svg.h:220
msgid "Strongly raised border around a flat surface"
@@ -685,7 +687,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:242
msgid "Gold Splatter"
-msgstr ""
+msgstr "Gullslettur"
#: ../share/filters/filters.svg.h:244
msgid "Splattered cast metal, with golden highlights"
@@ -693,7 +695,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:246
msgid "Gold Paste"
-msgstr ""
+msgstr "Gullkrem"
#: ../share/filters/filters.svg.h:248
msgid "Fat pasted cast metal, with golden highlights"
@@ -701,7 +703,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:250
msgid "Crumpled Plastic"
-msgstr ""
+msgstr "Krumpuplast"
#: ../share/filters/filters.svg.h:252
msgid "Crumpled matte plastic, with melted edge"
@@ -783,7 +785,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:290
msgid "Shaken Liquid"
-msgstr ""
+msgstr "Hristur vökvi"
#: ../share/filters/filters.svg.h:292
msgid "Colorizable filling with flow inside like transparency"
@@ -791,7 +793,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:294
msgid "Soft Focus Lens"
-msgstr ""
+msgstr "MjĂșkur linsufĂłkus"
#: ../share/filters/filters.svg.h:296
msgid "Glowing image content without blurring it"
@@ -799,7 +801,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:298
msgid "Stained Glass"
-msgstr ""
+msgstr "Steint gler"
#: ../share/filters/filters.svg.h:300
msgid "Illuminated stained glass effect"
@@ -807,7 +809,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:302
msgid "Dark Glass"
-msgstr ""
+msgstr "Dökkt gler"
#: ../share/filters/filters.svg.h:304
msgid "Illuminated glass effect with light coming from beneath"
@@ -831,7 +833,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:314 ../share/filters/filters.svg.h:362
msgid "Torn Edges"
-msgstr ""
+msgstr "Rifnar brĂșnir"
#: ../share/filters/filters.svg.h:316 ../share/filters/filters.svg.h:364
msgid ""
@@ -923,7 +925,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:358
msgid "Wax Print"
-msgstr ""
+msgstr "Vaxprentun"
#: ../share/filters/filters.svg.h:360
msgid "Wax print on tissue texture"
@@ -939,7 +941,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:370
msgid "Felt"
-msgstr ""
+msgstr "Filti"
#: ../share/filters/filters.svg.h:372
msgid ""
@@ -948,7 +950,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:374
msgid "Ink Paint"
-msgstr ""
+msgstr "BlekmĂĄlning"
#: ../share/filters/filters.svg.h:376
msgid "Ink paint on paper with some turbulent color shift"
@@ -956,7 +958,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:378
msgid "Tinted Rainbow"
-msgstr ""
+msgstr "Litaður regnbogi"
#: ../share/filters/filters.svg.h:380
msgid "Smooth rainbow colors melted along the edges and colorizable"
@@ -964,7 +966,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:382
msgid "Melted Rainbow"
-msgstr ""
+msgstr "BrĂŠddur regnbogi"
#: ../share/filters/filters.svg.h:384
msgid "Smooth rainbow colors slightly melted along the edges"
@@ -1030,26 +1032,27 @@ msgstr "Svart ljĂłs"
#: ../src/extension/internal/filter/bumps.h:101
#: ../src/extension/internal/filter/bumps.h:321
#: ../src/extension/internal/filter/bumps.h:328
-#: ../src/extension/internal/filter/color.h:82
-#: ../src/extension/internal/filter/color.h:164
-#: ../src/extension/internal/filter/color.h:171
-#: ../src/extension/internal/filter/color.h:262
-#: ../src/extension/internal/filter/color.h:340
-#: ../src/extension/internal/filter/color.h:347
-#: ../src/extension/internal/filter/color.h:437
-#: ../src/extension/internal/filter/color.h:532
-#: ../src/extension/internal/filter/color.h:654
-#: ../src/extension/internal/filter/color.h:751
-#: ../src/extension/internal/filter/color.h:830
-#: ../src/extension/internal/filter/color.h:921
-#: ../src/extension/internal/filter/color.h:1049
-#: ../src/extension/internal/filter/color.h:1119
-#: ../src/extension/internal/filter/color.h:1212
-#: ../src/extension/internal/filter/color.h:1324
-#: ../src/extension/internal/filter/color.h:1429
-#: ../src/extension/internal/filter/color.h:1505
-#: ../src/extension/internal/filter/color.h:1609
-#: ../src/extension/internal/filter/color.h:1616
+#: ../src/extension/internal/filter/color.h:83
+#: ../src/extension/internal/filter/color.h:165
+#: ../src/extension/internal/filter/color.h:172
+#: ../src/extension/internal/filter/color.h:283
+#: ../src/extension/internal/filter/color.h:337
+#: ../src/extension/internal/filter/color.h:415
+#: ../src/extension/internal/filter/color.h:422
+#: ../src/extension/internal/filter/color.h:512
+#: ../src/extension/internal/filter/color.h:607
+#: ../src/extension/internal/filter/color.h:729
+#: ../src/extension/internal/filter/color.h:826
+#: ../src/extension/internal/filter/color.h:905
+#: ../src/extension/internal/filter/color.h:996
+#: ../src/extension/internal/filter/color.h:1124
+#: ../src/extension/internal/filter/color.h:1194
+#: ../src/extension/internal/filter/color.h:1287
+#: ../src/extension/internal/filter/color.h:1399
+#: ../src/extension/internal/filter/color.h:1504
+#: ../src/extension/internal/filter/color.h:1580
+#: ../src/extension/internal/filter/color.h:1684
+#: ../src/extension/internal/filter/color.h:1691
#: ../src/extension/internal/filter/morphology.h:194
#: ../src/extension/internal/filter/overlays.h:73
#: ../src/extension/internal/filter/paint.h:99
@@ -1059,7 +1062,7 @@ msgstr "Svart ljĂłs"
#: ../src/extension/internal/filter/transparency.h:345
#: ../src/filter-enums.cpp:67 ../src/ui/dialog/clonetiler.cpp:830
#: ../src/ui/dialog/clonetiler.cpp:981
-#: ../src/ui/dialog/document-properties.cpp:157
+#: ../src/ui/dialog/document-properties.cpp:164
#: ../share/extensions/color_HSL_adjust.inx.h:20
#: ../share/extensions/color_blackandwhite.inx.h:3
#: ../share/extensions/color_brighter.inx.h:2
@@ -1098,7 +1101,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:418
msgid "Plaster Color"
-msgstr ""
+msgstr "Gifsaður litur"
#: ../share/filters/filters.svg.h:420
msgid "Colored plaster emboss effect"
@@ -1106,7 +1109,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:422
msgid "Velvet Bumps"
-msgstr ""
+msgstr "Flauelsójöfnur"
#: ../share/filters/filters.svg.h:424
msgid "Gives Smooth Bumps velvet like"
@@ -1114,7 +1117,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:426
msgid "Comics Cream"
-msgstr ""
+msgstr "Myndasögusmurning"
#: ../share/filters/filters.svg.h:427 ../share/filters/filters.svg.h:727
#: ../share/filters/filters.svg.h:731 ../share/filters/filters.svg.h:735
@@ -1228,7 +1231,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:474
msgid "Carnaval"
-msgstr ""
+msgstr "Kjötkveðjuhåtíð"
#: ../share/filters/filters.svg.h:476
msgid "White splotches evocating carnaval masks"
@@ -1236,7 +1239,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:478
msgid "Plastify"
-msgstr ""
+msgstr "Plastgera"
#: ../share/filters/filters.svg.h:480
msgid ""
@@ -1246,7 +1249,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:482
msgid "Plaster"
-msgstr ""
+msgstr "Gifsað"
#: ../share/filters/filters.svg.h:484
msgid ""
@@ -1320,7 +1323,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:518
msgid "Lapping"
-msgstr ""
+msgstr "SlĂ­pun"
#: ../share/filters/filters.svg.h:520
msgid "Something like a water noise"
@@ -1328,7 +1331,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:522
msgid "Monochrome Transparency"
-msgstr ""
+msgstr "Einlitað gegnsÊi"
#: ../share/filters/filters.svg.h:523 ../share/filters/filters.svg.h:527
#: ../share/filters/filters.svg.h:647 ../share/filters/filters.svg.h:651
@@ -1482,7 +1485,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:591
msgid "Pixel tools"
-msgstr ""
+msgstr "MynddĂ­laverkfĂŠri"
#: ../share/filters/filters.svg.h:592
msgid "Reduce or remove antialiasing around shapes"
@@ -1530,11 +1533,11 @@ msgstr ""
#: ../share/filters/filters.svg.h:614
msgid "Rough Canvas Painting"
-msgstr ""
+msgstr "MĂĄlun ĂĄ hrjĂșfan striga"
#: ../share/filters/filters.svg.h:618
msgid "Paper Bump"
-msgstr ""
+msgstr "Pappírsójöfnur"
#: ../share/filters/filters.svg.h:620
msgid "Paper like emboss effect"
@@ -1550,7 +1553,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:626
msgid "Blend Opposites"
-msgstr ""
+msgstr "Blöndun andstÊðna"
#: ../share/filters/filters.svg.h:628
msgid "Blend an image with its hue opposite"
@@ -1562,12 +1565,12 @@ msgstr "LitblĂŠr Ă­ hvĂ­tt"
#: ../share/filters/filters.svg.h:632
msgid "Fades hue progressively to white"
-msgstr ""
+msgstr "Deyfir litblĂŠ smĂĄm saman yfir Ă­ hvĂ­tt"
#: ../share/filters/filters.svg.h:634
#: ../src/extension/internal/bitmap/swirl.cpp:37
msgid "Swirl"
-msgstr "Sveimur"
+msgstr "Þyrla"
#: ../share/filters/filters.svg.h:636
msgid ""
@@ -1592,19 +1595,19 @@ msgstr ""
#: ../share/filters/filters.svg.h:646
msgid "Fill Background"
-msgstr ""
+msgstr "Fylltur bakgrunnur"
#: ../share/filters/filters.svg.h:648
msgid "Adds a colorizable opaque background"
-msgstr ""
+msgstr "BÊtir við lituðum ógegnsÊum bakgrunni"
#: ../share/filters/filters.svg.h:650
msgid "Flatten Transparency"
-msgstr ""
+msgstr "Fletja gegnsĂŠi"
#: ../share/filters/filters.svg.h:652
msgid "Adds a white opaque background"
-msgstr ""
+msgstr "BÊtir við hvítum ógegnsÊum bakgrunni"
#: ../share/filters/filters.svg.h:654
msgid "Blur Double"
@@ -1696,7 +1699,7 @@ msgstr ""
#: ../share/filters/filters.svg.h:702
msgid "Duotone Turbulent"
-msgstr ""
+msgstr "TvĂ­tĂłna hrĂŠrt"
#: ../share/filters/filters.svg.h:706
msgid "Light Eraser Cracked"
@@ -1936,11 +1939,13 @@ msgstr ""
#: ../share/filters/filters.svg.h:830
msgid "Simulate CMY"
-msgstr ""
+msgstr "LĂ­kja eftir CMY"
#: ../share/filters/filters.svg.h:832
msgid "Render Cyan, Magenta and Yellow channels with a colorizable background"
msgstr ""
+"Myndgera grÊnblåa (cyan), blårauða (magenta) og gular litråsir með lituðum "
+"bakgrunni"
#: ../share/filters/filters.svg.h:834
msgid "Contouring table"
@@ -2108,7 +2113,7 @@ msgstr "BlĂĄgrĂŠnt (#008080)"
#: ../share/palettes/palettes.h:23
msgctxt "Palette"
msgid "Aqua (#00FFFF)"
-msgstr "SĂŠgrĂŠnt (#00FFFF)"
+msgstr "VatnsblĂĄr / Aqua (#00FFFF)"
#. Palette: ./inkscape.gpl
#: ../share/palettes/palettes.h:24
@@ -2126,7 +2131,7 @@ msgstr "BlĂĄtt (#0000FF)"
#: ../share/palettes/palettes.h:26
msgctxt "Palette"
msgid "Purple (#800080)"
-msgstr "FjĂłlublĂĄtt (#800080)"
+msgstr "PurpurablĂĄtt (#800080)"
#. Palette: ./inkscape.gpl
#: ../share/palettes/palettes.h:27
@@ -2192,31 +2197,31 @@ msgstr "hvĂ­tt (#FFFFFF)"
#: ../share/palettes/palettes.h:37
msgctxt "Palette"
msgid "rosybrown (#BC8F8F)"
-msgstr ""
+msgstr "rĂłsbrĂșnn (#BC8F8F)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:38
msgctxt "Palette"
msgid "indianred (#CD5C5C)"
-msgstr ""
+msgstr "indlandsrautt (#CD5C5C)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:39
msgctxt "Palette"
msgid "brown (#A52A2A)"
-msgstr ""
+msgstr "brĂșnt (#A52A2A)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:40
msgctxt "Palette"
msgid "firebrick (#B22222)"
-msgstr ""
+msgstr "mĂșrsteins (#B22222)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:41
msgctxt "Palette"
msgid "lightcoral (#F08080)"
-msgstr ""
+msgstr "ljĂłskĂłrall (#F08080)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:42
@@ -2228,7 +2233,7 @@ msgstr "ljĂłsbrĂșnt (#800000)"
#: ../share/palettes/palettes.h:43
msgctxt "Palette"
msgid "darkred (#8B0000)"
-msgstr ""
+msgstr "dökkrautt (#8B0000)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:44
@@ -2246,187 +2251,187 @@ msgstr "snjĂłr (#FFFAFA)"
#: ../share/palettes/palettes.h:46
msgctxt "Palette"
msgid "mistyrose (#FFE4E1)"
-msgstr ""
+msgstr "móðurós (#FFE4E1)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:47
msgctxt "Palette"
msgid "salmon (#FA8072)"
-msgstr ""
+msgstr "laxableikt (#FA8072)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:48
msgctxt "Palette"
msgid "tomato (#FF6347)"
-msgstr ""
+msgstr "tĂłmatur (#FF6347)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:49
msgctxt "Palette"
msgid "darksalmon (#E9967A)"
-msgstr ""
+msgstr "dökklaxableikur (#E9967A)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:50
msgctxt "Palette"
msgid "coral (#FF7F50)"
-msgstr ""
+msgstr "kĂłral (#FF7F50)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:51
msgctxt "Palette"
msgid "orangered (#FF4500)"
-msgstr ""
+msgstr "appelsĂ­nurautt (#FF4500)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:52
msgctxt "Palette"
msgid "lightsalmon (#FFA07A)"
-msgstr ""
+msgstr "ljĂłslaxableikt (#FFA07A)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:53
msgctxt "Palette"
msgid "sienna (#A0522D)"
-msgstr ""
+msgstr "sienna (#A0522D)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:54
msgctxt "Palette"
msgid "seashell (#FFF5EE)"
-msgstr ""
+msgstr "skeljar (#FFF5EE)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:55
msgctxt "Palette"
msgid "chocolate (#D2691E)"
-msgstr ""
+msgstr "sĂșkkulaði (#D2691E)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:56
msgctxt "Palette"
msgid "saddlebrown (#8B4513)"
-msgstr ""
+msgstr "leðurbrĂșnt (#8B4513)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:57
msgctxt "Palette"
msgid "sandybrown (#F4A460)"
-msgstr ""
+msgstr "sandbrĂșnt (#F4A460)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:58
msgctxt "Palette"
msgid "peachpuff (#FFDAB9)"
-msgstr ""
+msgstr "ferskjubleikt (#FFDAB9)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:59
msgctxt "Palette"
msgid "peru (#CD853F)"
-msgstr ""
+msgstr "perubrĂșnt (#CD853F)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:60
msgctxt "Palette"
msgid "linen (#FAF0E6)"
-msgstr ""
+msgstr "lĂ­nhvĂ­tt (#FAF0E6)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:61
msgctxt "Palette"
msgid "bisque (#FFE4C4)"
-msgstr ""
+msgstr "sĂșpa (#FFE4C4)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:62
msgctxt "Palette"
msgid "darkorange (#FF8C00)"
-msgstr ""
+msgstr "dökkappelsínugult (#FF8C00)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:63
msgctxt "Palette"
msgid "burlywood (#DEB887)"
-msgstr ""
+msgstr "spónarviður (#DEB887)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:64
msgctxt "Palette"
msgid "tan (#D2B48C)"
-msgstr ""
+msgstr "brĂșnka (#D2B48C)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:65
msgctxt "Palette"
msgid "antiquewhite (#FAEBD7)"
-msgstr ""
+msgstr "antikhvĂ­tt (#FAEBD7)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:66
msgctxt "Palette"
msgid "navajowhite (#FFDEAD)"
-msgstr ""
+msgstr "navajohvĂ­tt (#FFDEAD)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:67
msgctxt "Palette"
msgid "blanchedalmond (#FFEBCD)"
-msgstr ""
+msgstr "möndluhvítt (#FFEBCD)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:68
msgctxt "Palette"
msgid "papayawhip (#FFEFD5)"
-msgstr ""
+msgstr "papayaĂŸeytingur (#FFEFD5)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:69
msgctxt "Palette"
msgid "moccasin (#FFE4B5)"
-msgstr ""
+msgstr "mokkasĂ­nugult (#FFE4B5)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:70
msgctxt "Palette"
msgid "orange (#FFA500)"
-msgstr ""
+msgstr "appelsĂ­nugult (#FFA500)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:71
msgctxt "Palette"
msgid "wheat (#F5DEB3)"
-msgstr ""
+msgstr "hveiti (#F5DEB3)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:72
msgctxt "Palette"
msgid "oldlace (#FDF5E6)"
-msgstr ""
+msgstr "blĂșnduhvĂ­tt (#FDF5E6)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:73
msgctxt "Palette"
msgid "floralwhite (#FFFAF0)"
-msgstr ""
+msgstr "blĂłmhvĂ­tt (#FFFAF0)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:74
msgctxt "Palette"
msgid "darkgoldenrod (#B8860B)"
-msgstr ""
+msgstr "dökkgyllt (#B8860B)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:75
msgctxt "Palette"
msgid "goldenrod (#DAA520)"
-msgstr ""
+msgstr "ljĂłsgyllt (#DAA520)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:76
msgctxt "Palette"
msgid "cornsilk (#FFF8DC)"
-msgstr ""
+msgstr "kornsilki (#FFF8DC)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:77
@@ -2438,37 +2443,37 @@ msgstr "gyllt (#FFD700)"
#: ../share/palettes/palettes.h:78
msgctxt "Palette"
msgid "khaki (#F0E68C)"
-msgstr ""
+msgstr "kakĂ­ (#F0E68C)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:79
msgctxt "Palette"
msgid "lemonchiffon (#FFFACD)"
-msgstr ""
+msgstr "sĂ­trĂłnusiffon (#FFFACD)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:80
msgctxt "Palette"
msgid "palegoldenrod (#EEE8AA)"
-msgstr ""
+msgstr "fölgyllt (#EEE8AA)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:81
msgctxt "Palette"
msgid "darkkhaki (#BDB76B)"
-msgstr ""
+msgstr "dökkkakí (#BDB76B)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:82
msgctxt "Palette"
msgid "beige (#F5F5DC)"
-msgstr ""
+msgstr "beyki (#F5F5DC)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:83
msgctxt "Palette"
msgid "lightgoldenrodyellow (#FAFAD2)"
-msgstr ""
+msgstr "ljĂłsgylltgult (#FAFAD2)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:84
@@ -2486,7 +2491,7 @@ msgstr "gult (#FFFF00)"
#: ../share/palettes/palettes.h:86
msgctxt "Palette"
msgid "lightyellow (#FFFFE0)"
-msgstr ""
+msgstr "ljĂłsgult (#FFFFE0)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:87
@@ -2498,73 +2503,73 @@ msgstr "fĂ­labeinshvĂ­tt (#FFFFF0)"
#: ../share/palettes/palettes.h:88
msgctxt "Palette"
msgid "olivedrab (#6B8E23)"
-msgstr ""
+msgstr "ĂłlĂ­fuhrafl (#6B8E23)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:89
msgctxt "Palette"
msgid "yellowgreen (#9ACD32)"
-msgstr ""
+msgstr "gulgrĂŠnt (#9ACD32)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:90
msgctxt "Palette"
msgid "darkolivegreen (#556B2F)"
-msgstr ""
+msgstr "dökkólífugrÊnt (#556B2F)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:91
msgctxt "Palette"
msgid "greenyellow (#ADFF2F)"
-msgstr ""
+msgstr "grĂŠngult (#ADFF2F)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:92
msgctxt "Palette"
msgid "chartreuse (#7FFF00)"
-msgstr ""
+msgstr "chartreusegrĂŠnt (#7FFF00)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:93
msgctxt "Palette"
msgid "lawngreen (#7CFC00)"
-msgstr ""
+msgstr "grasgrĂŠnt (#7CFC00)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:94
msgctxt "Palette"
msgid "darkseagreen (#8FBC8F)"
-msgstr ""
+msgstr "dökksÊgrÊnt (#8FBC8F)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:95
msgctxt "Palette"
msgid "forestgreen (#228B22)"
-msgstr ""
+msgstr "skĂłggrĂŠnt (#228B22)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:96
msgctxt "Palette"
msgid "limegreen (#32CD32)"
-msgstr ""
+msgstr "lĂ­mĂłnugrĂŠnt (#32CD32)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:97
msgctxt "Palette"
msgid "lightgreen (#90EE90)"
-msgstr ""
+msgstr "ljĂłsgrĂŠnt (#90EE90)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:98
msgctxt "Palette"
msgid "palegreen (#98FB98)"
-msgstr ""
+msgstr "fölgrÊnt (#98FB98)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:99
msgctxt "Palette"
msgid "darkgreen (#006400)"
-msgstr ""
+msgstr "dökkgrÊnt (#006400)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:100
@@ -2576,85 +2581,85 @@ msgstr "grĂŠnt (#008000)"
#: ../share/palettes/palettes.h:101
msgctxt "Palette"
msgid "lime (#00FF00)"
-msgstr "lĂ­mĂłnugrĂŠnt (#00FF00)"
+msgstr "lĂ­mĂłna (#00FF00)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:102
msgctxt "Palette"
msgid "honeydew (#F0FFF0)"
-msgstr ""
+msgstr "hunangsdögg (#F0FFF0)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:103
msgctxt "Palette"
msgid "seagreen (#2E8B57)"
-msgstr ""
+msgstr "sĂŠgrĂŠnt (#2E8B57)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:104
msgctxt "Palette"
msgid "mediumseagreen (#3CB371)"
-msgstr ""
+msgstr "meðalsÊgrÊnt (#3CB371)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:105
msgctxt "Palette"
msgid "springgreen (#00FF7F)"
-msgstr ""
+msgstr "vorgrĂŠnt (#00FF7F)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:106
msgctxt "Palette"
msgid "mintcream (#F5FFFA)"
-msgstr ""
+msgstr "rjĂłmamynta (#F5FFFA)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:107
msgctxt "Palette"
msgid "mediumspringgreen (#00FA9A)"
-msgstr ""
+msgstr "meðalvorgrÊnt (#00FA9A)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:108
msgctxt "Palette"
msgid "mediumaquamarine (#66CDAA)"
-msgstr ""
+msgstr "meðalaquamarine (#66CDAA)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:109
msgctxt "Palette"
msgid "aquamarine (#7FFFD4)"
-msgstr ""
+msgstr "aquamarine (#7FFFD4)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:110
msgctxt "Palette"
msgid "turquoise (#40E0D0)"
-msgstr ""
+msgstr "tĂșrkĂ­sgrĂŠnn (#40E0D0)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:111
msgctxt "Palette"
msgid "lightseagreen (#20B2AA)"
-msgstr ""
+msgstr "ljĂłssĂŠgrĂŠnt (#20B2AA)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:112
msgctxt "Palette"
msgid "mediumturquoise (#48D1CC)"
-msgstr ""
+msgstr "meðaltĂșrkĂ­sgrĂŠnt (#48D1CC)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:113
msgctxt "Palette"
msgid "darkslategray (#2F4F4F)"
-msgstr ""
+msgstr "dökkleirflögugrått (#2F4F4F)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:114
msgctxt "Palette"
msgid "paleturquoise (#AFEEEE)"
-msgstr ""
+msgstr "föltĂșrkĂ­sgrĂŠnt (#AFEEEE)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:115
@@ -2666,127 +2671,127 @@ msgstr "blĂĄgrĂŠnt (#008080)"
#: ../share/palettes/palettes.h:116
msgctxt "Palette"
msgid "darkcyan (#008B8B)"
-msgstr ""
+msgstr "dökkgrÊnblått (#008B8B)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:117
msgctxt "Palette"
msgid "cyan (#00FFFF)"
-msgstr ""
+msgstr "grĂŠnblĂĄtt/cyan (#00FFFF)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:118
msgctxt "Palette"
msgid "lightcyan (#E0FFFF)"
-msgstr ""
+msgstr "ljĂłsgrĂŠnblĂĄtt (#E0FFFF)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:119
msgctxt "Palette"
msgid "azure (#F0FFFF)"
-msgstr ""
+msgstr "asĂșrlitur (#F0FFFF)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:120
msgctxt "Palette"
msgid "darkturquoise (#00CED1)"
-msgstr ""
+msgstr "dökktĂșrkĂ­sgrĂŠnt (#00CED1)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:121
msgctxt "Palette"
msgid "cadetblue (#5F9EA0)"
-msgstr ""
+msgstr "kadettblĂĄtt (#5F9EA0)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:122
msgctxt "Palette"
msgid "powderblue (#B0E0E6)"
-msgstr ""
+msgstr "pĂșðurblĂĄmi (#B0E0E6)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:123
msgctxt "Palette"
msgid "lightblue (#ADD8E6)"
-msgstr ""
+msgstr "ljĂłsblĂĄtt (#ADD8E6)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:124
msgctxt "Palette"
msgid "deepskyblue (#00BFFF)"
-msgstr ""
+msgstr "djĂșphiminblĂĄtt (#00BFFF)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:125
msgctxt "Palette"
msgid "skyblue (#87CEEB)"
-msgstr ""
+msgstr "himinblĂĄtt (#87CEEB)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:126
msgctxt "Palette"
msgid "lightskyblue (#87CEFA)"
-msgstr ""
+msgstr "ljĂłshiminblĂĄtt (#87CEFA)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:127
msgctxt "Palette"
msgid "steelblue (#4682B4)"
-msgstr ""
+msgstr "stĂĄlblĂĄtt (#4682B4)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:128
msgctxt "Palette"
msgid "aliceblue (#F0F8FF)"
-msgstr ""
+msgstr "blĂĄhvĂ­tt (#F0F8FF)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:129
msgctxt "Palette"
msgid "dodgerblue (#1E90FF)"
-msgstr ""
+msgstr "dodgerblĂĄtt (#1E90FF)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:130
msgctxt "Palette"
msgid "slategray (#708090)"
-msgstr ""
+msgstr "leirflögugrått (#708090)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:131
msgctxt "Palette"
msgid "lightslategray (#778899)"
-msgstr ""
+msgstr "ljósleirflögugrått (#778899)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:132
msgctxt "Palette"
msgid "lightsteelblue (#B0C4DE)"
-msgstr ""
+msgstr "ljĂłsstĂĄlblĂĄtt (#B0C4DE)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:133
msgctxt "Palette"
msgid "cornflowerblue (#6495ED)"
-msgstr ""
+msgstr "kornblĂłmablĂĄr (#6495ED)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:134
msgctxt "Palette"
msgid "royalblue (#4169E1)"
-msgstr ""
+msgstr "kĂłngablĂĄtt (#4169E1)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:135
msgctxt "Palette"
msgid "midnightblue (#191970)"
-msgstr ""
+msgstr "miðnÊturblått (#191970)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:136
msgctxt "Palette"
msgid "lavender (#E6E6FA)"
-msgstr ""
+msgstr "lofnarblĂłm (#E6E6FA)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:137
@@ -2816,157 +2821,157 @@ msgstr "blĂĄtt (#0000FF)"
#: ../share/palettes/palettes.h:141
msgctxt "Palette"
msgid "ghostwhite (#F8F8FF)"
-msgstr ""
+msgstr "draughvĂ­tt (#F8F8FF)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:142
msgctxt "Palette"
msgid "slateblue (#6A5ACD)"
-msgstr ""
+msgstr "leirflögublått (#6A5ACD)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:143
msgctxt "Palette"
msgid "darkslateblue (#483D8B)"
-msgstr ""
+msgstr "dökkleirflögublått (#483D8B)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:144
msgctxt "Palette"
msgid "mediumslateblue (#7B68EE)"
-msgstr ""
+msgstr "meðalleirflögublått (#7B68EE)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:145
msgctxt "Palette"
msgid "mediumpurple (#9370DB)"
-msgstr ""
+msgstr "meðalpurpurablått (#9370DB)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:146
msgctxt "Palette"
msgid "blueviolet (#8A2BE2)"
-msgstr ""
+msgstr "blĂĄfjĂłlublĂĄtt (#8A2BE2)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:147
msgctxt "Palette"
msgid "indigo (#4B0082)"
-msgstr ""
+msgstr "indĂ­gĂł (#4B0082)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:148
msgctxt "Palette"
msgid "darkorchid (#9932CC)"
-msgstr ""
+msgstr "dökkorkídeu (#9932CC)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:149
msgctxt "Palette"
msgid "darkviolet (#9400D3)"
-msgstr ""
+msgstr "dökkfjólublått (#9400D3)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:150
msgctxt "Palette"
msgid "mediumorchid (#BA55D3)"
-msgstr ""
+msgstr "meðalorkídeu (#BA55D3)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:151
msgctxt "Palette"
msgid "thistle (#D8BFD8)"
-msgstr ""
+msgstr "ĂŸistilbleikt (#D8BFD8)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:152
msgctxt "Palette"
msgid "plum (#DDA0DD)"
-msgstr ""
+msgstr "plĂłmubleikt (#DDA0DD)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:153
msgctxt "Palette"
msgid "violet (#EE82EE)"
-msgstr ""
+msgstr "fjĂłlublĂĄtt (#EE82EE)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:154
msgctxt "Palette"
msgid "purple (#800080)"
-msgstr "fjĂłlublĂĄtt (#800080)"
+msgstr "purpurablĂĄtt (#800080)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:155
msgctxt "Palette"
msgid "darkmagenta (#8B008B)"
-msgstr ""
+msgstr "dökkblårautt (#8B008B)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:156
msgctxt "Palette"
msgid "magenta (#FF00FF)"
-msgstr ""
+msgstr "blĂĄrautt/magenta (#FF00FF)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:157
msgctxt "Palette"
msgid "orchid (#DA70D6)"
-msgstr ""
+msgstr "orkĂ­dea (#DA70D6)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:158
msgctxt "Palette"
msgid "mediumvioletred (#C71585)"
-msgstr ""
+msgstr "millirauðfjólublår (#C71585)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:159
msgctxt "Palette"
msgid "deeppink (#FF1493)"
-msgstr ""
+msgstr "djĂșpbleikt (#FF1493)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:160
msgctxt "Palette"
msgid "hotpink (#FF69B4)"
-msgstr ""
+msgstr "heitbleikt (#FF69B4)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:161
msgctxt "Palette"
msgid "lavenderblush (#FFF0F5)"
-msgstr ""
+msgstr "lavenderroði (#FFF0F5)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:162
msgctxt "Palette"
msgid "palevioletred (#DB7093)"
-msgstr ""
+msgstr "fölfjólurautt (#DB7093)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:163
msgctxt "Palette"
msgid "crimson (#DC143C)"
-msgstr ""
+msgstr "crimsonrautt (#DC143C)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:164
msgctxt "Palette"
msgid "pink (#FFC0CB)"
-msgstr ""
+msgstr "bleikt (#FFC0CB)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:165
msgctxt "Palette"
msgid "lightpink (#FFB6C1)"
-msgstr ""
+msgstr "ljĂłsbleikt (#FFB6C1)"
#. Palette: ./svg.gpl
#: ../share/palettes/palettes.h:166
msgctxt "Palette"
msgid "rebeccapurple (#663399)"
-msgstr ""
+msgstr "rebebekkupurpuri (#663399)"
#. Palette: ./Tango-Palette.gpl
#: ../share/palettes/palettes.h:167
@@ -3292,7 +3297,7 @@ msgstr "Felulitir"
#: ../share/patterns/patterns.svg.h:1
msgid "Ermine"
-msgstr ""
+msgstr "Hreysiköttur"
#: ../share/patterns/patterns.svg.h:1
msgid "Sand (bitmap)"
@@ -3434,7 +3439,7 @@ msgstr "Snyrtingar"
#: ../share/symbols/symbols.h:41 ../share/symbols/symbols.h:42
msgctxt "Symbol"
msgid "Nursery"
-msgstr ""
+msgstr "Skiptiborð"
#. Symbols: ./AigaSymbols.svg
#: ../share/symbols/symbols.h:43 ../share/symbols/symbols.h:44
@@ -3654,7 +3659,7 @@ msgstr "HÊgri ör"
#: ../share/symbols/symbols.h:113 ../share/symbols/symbols.h:114
msgctxt "Symbol"
msgid "Forward and Right Arrow"
-msgstr ""
+msgstr "Áfram og hÊgri ör"
#. Symbols: ./AigaSymbols.svg
#: ../share/symbols/symbols.h:115 ../share/symbols/symbols.h:116
@@ -3666,7 +3671,7 @@ msgstr "Ör upp"
#: ../share/symbols/symbols.h:117 ../share/symbols/symbols.h:118
msgctxt "Symbol"
msgid "Forward and Left Arrow"
-msgstr ""
+msgstr "Áfram og vinstri ör"
#. Symbols: ./AigaSymbols.svg
#: ../share/symbols/symbols.h:119 ../share/symbols/symbols.h:120
@@ -3678,7 +3683,7 @@ msgstr "Vinstri ör"
#: ../share/symbols/symbols.h:121 ../share/symbols/symbols.h:122
msgctxt "Symbol"
msgid "Left and Down Arrow"
-msgstr ""
+msgstr "Vinstri og niður ör"
#. Symbols: ./AigaSymbols.svg
#: ../share/symbols/symbols.h:123 ../share/symbols/symbols.h:124
@@ -3690,31 +3695,31 @@ msgstr "Ör niður"
#: ../share/symbols/symbols.h:125 ../share/symbols/symbols.h:126
msgctxt "Symbol"
msgid "Right and Down Arrow"
-msgstr ""
+msgstr "HÊgri og niður ör"
#. Symbols: ./AigaSymbols.svg
#: ../share/symbols/symbols.h:127 ../share/symbols/symbols.h:128
msgctxt "Symbol"
msgid "NPS Wheelchair Accessible - 1996"
-msgstr ""
+msgstr "NPS Aðgengilegt í hjólastól - 1996"
#. Symbols: ./AigaSymbols.svg
#: ../share/symbols/symbols.h:129 ../share/symbols/symbols.h:130
msgctxt "Symbol"
msgid "NPS Wheelchair Accessible"
-msgstr ""
+msgstr "NPS Aðgengilegt í hjólastól"
#. Symbols: ./AigaSymbols.svg
#: ../share/symbols/symbols.h:131 ../share/symbols/symbols.h:132
msgctxt "Symbol"
msgid "New Wheelchair Accessible"
-msgstr ""
+msgstr "NĂœtt aðgengilegt Ă­ hjĂłlastĂłl"
#. Symbols: ./BalloonSymbols.svg
#: ../share/symbols/symbols.h:133
msgctxt "Symbol"
msgid "Word Balloons"
-msgstr ""
+msgstr "Talblöðrur"
#. Symbols: ./BalloonSymbols.svg
#: ../share/symbols/symbols.h:134
@@ -3726,19 +3731,19 @@ msgstr "Hugsanablaðra"
#: ../share/symbols/symbols.h:135
msgctxt "Symbol"
msgid "Dream Speaking"
-msgstr ""
+msgstr "Talandi Ă­ draumi"
#. Symbols: ./BalloonSymbols.svg
#: ../share/symbols/symbols.h:136
msgctxt "Symbol"
msgid "Rounded Balloon"
-msgstr ""
+msgstr "RĂșnnuð plaðra"
#. Symbols: ./BalloonSymbols.svg
#: ../share/symbols/symbols.h:137
msgctxt "Symbol"
msgid "Squared Balloon"
-msgstr ""
+msgstr "Köntuð blaðra"
#. Symbols: ./BalloonSymbols.svg
#: ../share/symbols/symbols.h:138
@@ -3750,19 +3755,19 @@ msgstr "Í símanum"
#: ../share/symbols/symbols.h:139
msgctxt "Symbol"
msgid "Hip Balloon"
-msgstr ""
+msgstr "Holblaðra"
#. Symbols: ./BalloonSymbols.svg
#: ../share/symbols/symbols.h:140
msgctxt "Symbol"
msgid "Circle Balloon"
-msgstr ""
+msgstr "Hringlaga blaðra"
#. Symbols: ./BalloonSymbols.svg
#: ../share/symbols/symbols.h:141
msgctxt "Symbol"
msgid "Exclaim Balloon"
-msgstr ""
+msgstr "Upphrópunarblaðra"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:142
@@ -3846,7 +3851,7 @@ msgstr "AfĂŸjappa"
#: ../share/symbols/symbols.h:155
msgctxt "Symbol"
msgid "Terminal/Interrupt"
-msgstr ""
+msgstr "Endir/Ígrip"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:156
@@ -3858,13 +3863,13 @@ msgstr "Gataspjald"
#: ../share/symbols/symbols.h:157
msgctxt "Symbol"
msgid "Punch Tape"
-msgstr ""
+msgstr "Gataborði"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:158
msgctxt "Symbol"
msgid "Online Storage"
-msgstr ""
+msgstr "Gagnahirsla ĂĄ neti"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:159
@@ -3912,13 +3917,13 @@ msgstr "Raða saman"
#: ../share/symbols/symbols.h:166
msgctxt "Symbol"
msgid "Comment/Annotation"
-msgstr ""
+msgstr "Athugasemd/GlĂłsa"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:167
msgctxt "Symbol"
msgid "Core"
-msgstr ""
+msgstr "Kjarni"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:168
@@ -3930,31 +3935,31 @@ msgstr "Fyrirframskilgreind vinnsla"
#: ../share/symbols/symbols.h:169
msgctxt "Symbol"
msgid "Magnetic Disk (Database)"
-msgstr ""
+msgstr "Seguldiskur (gagnagrunnur)"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:170
msgctxt "Symbol"
msgid "Magnetic Drum (Direct Access)"
-msgstr ""
+msgstr "Segultromla (beinn aðgangur)"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:171
msgctxt "Symbol"
msgid "Offline Storage"
-msgstr ""
+msgstr "Ótengd gagnahirsla"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:172
msgctxt "Symbol"
msgid "Logical Or"
-msgstr ""
+msgstr "Röklegt EÐA"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:173
msgctxt "Symbol"
msgid "Logical And"
-msgstr ""
+msgstr "Röklegt OG"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:174
@@ -3966,55 +3971,55 @@ msgstr "Seinkun"
#: ../share/symbols/symbols.h:175
msgctxt "Symbol"
msgid "Loop Limit Begin"
-msgstr ""
+msgstr "Mörk lykkju byrja"
#. Symbols: ./FlowSymbols.svg
#: ../share/symbols/symbols.h:176
msgctxt "Symbol"
msgid "Loop Limit End"
-msgstr ""
+msgstr "Mörk lykkju enda"
#. Symbols: ./LogicSymbols.svg
#: ../share/symbols/symbols.h:177
msgctxt "Symbol"
msgid "Logic Symbols"
-msgstr "RökrÊn tåkn"
+msgstr "Rökleg tåkn"
#. Symbols: ./LogicSymbols.svg
#: ../share/symbols/symbols.h:178
msgctxt "Symbol"
msgid "Xnor Gate"
-msgstr ""
+msgstr "XNOR hlið"
#. Symbols: ./LogicSymbols.svg
#: ../share/symbols/symbols.h:179
msgctxt "Symbol"
msgid "Xor Gate"
-msgstr ""
+msgstr "XOR hlið"
#. Symbols: ./LogicSymbols.svg
#: ../share/symbols/symbols.h:180
msgctxt "Symbol"
msgid "Nor Gate"
-msgstr ""
+msgstr "NOR hlið"
#. Symbols: ./LogicSymbols.svg
#: ../share/symbols/symbols.h:181
msgctxt "Symbol"
msgid "Or Gate"
-msgstr ""
+msgstr "OR hlið"
#. Symbols: ./LogicSymbols.svg
#: ../share/symbols/symbols.h:182
msgctxt "Symbol"
msgid "Nand Gate"
-msgstr ""
+msgstr "NAND hlið"
#. Symbols: ./LogicSymbols.svg
#: ../share/symbols/symbols.h:183
msgctxt "Symbol"
msgid "And Gate"
-msgstr ""
+msgstr "AND hlið"
#. Symbols: ./LogicSymbols.svg
#: ../share/symbols/symbols.h:184
@@ -4026,19 +4031,19 @@ msgstr "Biðminni"
#: ../share/symbols/symbols.h:185
msgctxt "Symbol"
msgid "Not Gate"
-msgstr ""
+msgstr "NOT hlið"
#. Symbols: ./LogicSymbols.svg
#: ../share/symbols/symbols.h:186
msgctxt "Symbol"
msgid "Buffer Small"
-msgstr ""
+msgstr "Lítið biðminni"
#. Symbols: ./LogicSymbols.svg
#: ../share/symbols/symbols.h:187
msgctxt "Symbol"
msgid "Not Gate Small"
-msgstr ""
+msgstr "Lítið NOT hlið"
#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:188
@@ -4056,7 +4061,7 @@ msgstr "Flugvöllur"
#: ../share/symbols/symbols.h:191 ../share/symbols/symbols.h:192
msgctxt "Symbol"
msgid "Amphitheatre"
-msgstr ""
+msgstr "Fyrirlestrasalur"
#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:193 ../share/symbols/symbols.h:194
@@ -4248,7 +4253,7 @@ msgstr "Siglingar"
#: ../share/symbols/symbols.h:261 ../share/symbols/symbols.h:262
msgctxt "Symbol"
msgid "Sanitary Disposal Station"
-msgstr ""
+msgstr "Stöð fyrir hreinlĂŠtisĂșrgang"
#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:263 ../share/symbols/symbols.h:264
@@ -4314,7 +4319,7 @@ msgstr "Neyðarsími"
#: ../share/symbols/symbols.h:285 ../share/symbols/symbols.h:286
msgctxt "Symbol"
msgid "Trailhead"
-msgstr ""
+msgstr "Upphaf slóða"
#. Symbols: ./MapSymbolsNPS.svg
#: ../share/symbols/symbols.h:287 ../share/symbols/symbols.h:288
@@ -4340,11 +4345,11 @@ msgstr "CD miði 120mmx120mm "
#: ../share/templates/templates.h:1
msgid "Simple CD Label template with disc's pattern."
-msgstr ""
+msgstr "Einfalt sniðmĂĄt fyrir CD-miða með ĂștlĂ­num disks."
#: ../share/templates/templates.h:1
msgid "CD label 120x120 disc disk"
-msgstr ""
+msgstr "CD miði 120mmx120mm diskur"
#: ../share/templates/templates.h:1
msgid "No Layers"
@@ -4352,52 +4357,52 @@ msgstr "Engin lög"
#: ../share/templates/templates.h:1
msgid "Empty sheet with no layers"
-msgstr ""
+msgstr "Autt blað með engum lögum"
#: ../share/templates/templates.h:1
msgid "no layers empty"
-msgstr ""
+msgstr "engin lög auð"
#: ../share/templates/templates.h:1
msgid "LaTeX Beamer"
-msgstr ""
+msgstr "LaTeX Beamer kynning"
#: ../share/templates/templates.h:1
msgid "LaTeX beamer template with helping grid."
-msgstr ""
+msgstr "LaTeX Beamer kynningasniðmåt með stoðlínum."
#: ../share/templates/templates.h:1
msgid "LaTex LaTeX latex grid beamer"
-msgstr ""
+msgstr "LaTex LaTeX Beamer hnitamöskvi kynningar"
#: ../share/templates/templates.h:1
msgid "Typography Canvas"
-msgstr ""
+msgstr "Myndflöt fyrir stafaframsetningu"
#: ../share/templates/templates.h:1
msgid "Empty typography canvas with helping guidelines."
-msgstr ""
+msgstr "Auður myndflötur fyrir stafaframsetningu með stoðlínum."
#: ../share/templates/templates.h:1
msgid "guidelines typography canvas"
-msgstr ""
+msgstr "stoðlínur myndflatar fyrir stafaframsetningu"
#. 3D box
-#: ../src/box3d.cpp:260 ../src/box3d.cpp:1314
+#: ../src/box3d.cpp:250 ../src/box3d.cpp:1304
#: ../src/ui/dialog/inkscape-preferences.cpp:407
msgid "3D Box"
msgstr "Þrívíddarkassi"
-#: ../src/color-profile.cpp:853
+#: ../src/color-profile.cpp:842
#, c-format
msgid "Color profiles directory (%s) is unavailable."
msgstr "Mappa fyrir litasnið (%s) er ekki tiltÊk."
-#: ../src/color-profile.cpp:912 ../src/color-profile.cpp:929
+#: ../src/color-profile.cpp:901 ../src/color-profile.cpp:918
msgid "(invalid UTF-8 string)"
msgstr "(Ăłgildur UTF-8-strengur)"
-#: ../src/color-profile.cpp:914
+#: ../src/color-profile.cpp:903
msgctxt "Profile name"
msgid "None"
msgstr "Ekkert"
@@ -4410,20 +4415,20 @@ msgstr "<b>NĂșverandi lag er falið</b>. Birtu ĂŸað til að teikna ĂĄ ĂŸað."
msgid "<b>Current layer is locked</b>. Unlock it to be able to draw on it."
msgstr "<b>NĂșverandi lag er lĂŠst</b>. Opnaðu ĂŸað til að teikna ĂĄ ĂŸað."
-#: ../src/desktop-events.cpp:236
+#: ../src/desktop-events.cpp:242
msgid "Create guide"
msgstr "BĂșa til stoðlĂ­nu"
-#: ../src/desktop-events.cpp:492
+#: ../src/desktop-events.cpp:498
msgid "Move guide"
msgstr "FÊra stoðlínu"
-#: ../src/desktop-events.cpp:499 ../src/desktop-events.cpp:557
+#: ../src/desktop-events.cpp:505 ../src/desktop-events.cpp:563
#: ../src/ui/dialog/guides.cpp:138
msgid "Delete guide"
msgstr "Eyða stoðlínu"
-#: ../src/desktop-events.cpp:537
+#: ../src/desktop-events.cpp:543
#, c-format
msgid "<b>Guideline</b>: %s"
msgstr "<b>Stoðlína</b>: %s"
@@ -4436,92 +4441,92 @@ msgstr "Enginn fyrri aðdråttur."
msgid "No next zoom."
msgstr "Enginn nÊsti aðdråttur."
-#: ../src/display/canvas-axonomgrid.cpp:353 ../src/display/canvas-grid.cpp:693
+#: ../src/display/canvas-axonomgrid.cpp:361 ../src/display/canvas-grid.cpp:701
msgid "Grid _units:"
msgstr "Einin_gar hnitanets:"
-#: ../src/display/canvas-axonomgrid.cpp:355 ../src/display/canvas-grid.cpp:695
+#: ../src/display/canvas-axonomgrid.cpp:363 ../src/display/canvas-grid.cpp:703
msgid "_Origin X:"
msgstr "X uppha_f:"
-#: ../src/display/canvas-axonomgrid.cpp:355 ../src/display/canvas-grid.cpp:695
+#: ../src/display/canvas-axonomgrid.cpp:363 ../src/display/canvas-grid.cpp:703
#: ../src/ui/dialog/inkscape-preferences.cpp:746
#: ../src/ui/dialog/inkscape-preferences.cpp:771
msgid "X coordinate of grid origin"
msgstr "X-hnit upphafspunkts hnitanets"
-#: ../src/display/canvas-axonomgrid.cpp:358 ../src/display/canvas-grid.cpp:698
+#: ../src/display/canvas-axonomgrid.cpp:366 ../src/display/canvas-grid.cpp:706
msgid "O_rigin Y:"
msgstr "Y upp_haf:"
-#: ../src/display/canvas-axonomgrid.cpp:358 ../src/display/canvas-grid.cpp:698
+#: ../src/display/canvas-axonomgrid.cpp:366 ../src/display/canvas-grid.cpp:706
#: ../src/ui/dialog/inkscape-preferences.cpp:747
#: ../src/ui/dialog/inkscape-preferences.cpp:772
msgid "Y coordinate of grid origin"
msgstr "Y-hnit upphafspunkts hnitanets"
-#: ../src/display/canvas-axonomgrid.cpp:361 ../src/display/canvas-grid.cpp:704
+#: ../src/display/canvas-axonomgrid.cpp:369 ../src/display/canvas-grid.cpp:712
msgid "Spacing _Y:"
msgstr "Millibil _Y:"
-#: ../src/display/canvas-axonomgrid.cpp:361
+#: ../src/display/canvas-axonomgrid.cpp:369
#: ../src/ui/dialog/inkscape-preferences.cpp:775
msgid "Base length of z-axis"
msgstr "Grunnlengd Z-ĂĄss"
-#: ../src/display/canvas-axonomgrid.cpp:364
+#: ../src/display/canvas-axonomgrid.cpp:372
#: ../src/ui/dialog/inkscape-preferences.cpp:778
#: ../src/widgets/box3d-toolbar.cpp:302
msgid "Angle X:"
msgstr "Horn X:"
-#: ../src/display/canvas-axonomgrid.cpp:364
+#: ../src/display/canvas-axonomgrid.cpp:372
#: ../src/ui/dialog/inkscape-preferences.cpp:778
msgid "Angle of x-axis"
msgstr "Horn X-ĂĄss"
-#: ../src/display/canvas-axonomgrid.cpp:366
+#: ../src/display/canvas-axonomgrid.cpp:374
#: ../src/ui/dialog/inkscape-preferences.cpp:779
#: ../src/widgets/box3d-toolbar.cpp:381
msgid "Angle Z:"
msgstr "Horn Z:"
-#: ../src/display/canvas-axonomgrid.cpp:366
+#: ../src/display/canvas-axonomgrid.cpp:374
#: ../src/ui/dialog/inkscape-preferences.cpp:779
msgid "Angle of z-axis"
msgstr "Horn Z-ĂĄss"
-#: ../src/display/canvas-axonomgrid.cpp:370 ../src/display/canvas-grid.cpp:709
+#: ../src/display/canvas-axonomgrid.cpp:378 ../src/display/canvas-grid.cpp:717
msgid "Minor grid line _color:"
msgstr "_Litur ĂĄ aukahnitalĂ­nu:"
-#: ../src/display/canvas-axonomgrid.cpp:370 ../src/display/canvas-grid.cpp:709
+#: ../src/display/canvas-axonomgrid.cpp:378 ../src/display/canvas-grid.cpp:717
#: ../src/ui/dialog/inkscape-preferences.cpp:730
msgid "Minor grid line color"
msgstr "Litur ĂĄ aukahnitalĂ­nu"
-#: ../src/display/canvas-axonomgrid.cpp:370 ../src/display/canvas-grid.cpp:709
+#: ../src/display/canvas-axonomgrid.cpp:378 ../src/display/canvas-grid.cpp:717
msgid "Color of the minor grid lines"
msgstr "Litur ĂĄ minni hnitalĂ­num"
-#: ../src/display/canvas-axonomgrid.cpp:375 ../src/display/canvas-grid.cpp:714
+#: ../src/display/canvas-axonomgrid.cpp:383 ../src/display/canvas-grid.cpp:722
msgid "Ma_jor grid line color:"
msgstr "Litur å _aðalåsum hnitalínu:"
-#: ../src/display/canvas-axonomgrid.cpp:375 ../src/display/canvas-grid.cpp:714
+#: ../src/display/canvas-axonomgrid.cpp:383 ../src/display/canvas-grid.cpp:722
#: ../src/ui/dialog/inkscape-preferences.cpp:732
msgid "Major grid line color"
msgstr "Litur å aðalåsum hnitalínu"
-#: ../src/display/canvas-axonomgrid.cpp:376 ../src/display/canvas-grid.cpp:715
+#: ../src/display/canvas-axonomgrid.cpp:384 ../src/display/canvas-grid.cpp:723
msgid "Color of the major (highlighted) grid lines"
msgstr "Litur å aðal hnitalínum (åherslulínum)"
-#: ../src/display/canvas-axonomgrid.cpp:380 ../src/display/canvas-grid.cpp:719
+#: ../src/display/canvas-axonomgrid.cpp:388 ../src/display/canvas-grid.cpp:727
msgid "_Major grid line every:"
msgstr "Aðal_hnitalínur hverja:"
-#: ../src/display/canvas-axonomgrid.cpp:380 ../src/display/canvas-grid.cpp:719
+#: ../src/display/canvas-axonomgrid.cpp:388 ../src/display/canvas-grid.cpp:727
msgid "lines"
msgstr "lĂ­nur"
@@ -4567,27 +4572,27 @@ msgid ""
"to invisible grids."
msgstr ""
-#: ../src/display/canvas-grid.cpp:701
+#: ../src/display/canvas-grid.cpp:709
msgid "Spacing _X:"
msgstr "Millibil _X:"
-#: ../src/display/canvas-grid.cpp:701
+#: ../src/display/canvas-grid.cpp:709
#: ../src/ui/dialog/inkscape-preferences.cpp:752
msgid "Distance between vertical grid lines"
msgstr "Lóðrétt millibil hnitanetslína"
-#: ../src/display/canvas-grid.cpp:704
+#: ../src/display/canvas-grid.cpp:712
#: ../src/ui/dialog/inkscape-preferences.cpp:753
msgid "Distance between horizontal grid lines"
msgstr "Lårétt millibil hnitanetslína"
-#: ../src/display/canvas-grid.cpp:736
+#: ../src/display/canvas-grid.cpp:744
msgid "_Show dots instead of lines"
msgstr "_SĂœna punkta Ă­ stað lĂ­na"
-#: ../src/display/canvas-grid.cpp:737
+#: ../src/display/canvas-grid.cpp:745
msgid "If set, displays dots at gridpoints instead of gridlines"
-msgstr ""
+msgstr "Ef ĂŸetta er virkjað eru sĂœndir punktar Ă­ stað hnitalĂ­na"
#. TRANSLATORS: undefined target for snapping
#: ../src/display/snap-indicator.cpp:72 ../src/display/snap-indicator.cpp:75
@@ -4613,11 +4618,11 @@ msgstr "stoðlína"
#: ../src/display/snap-indicator.cpp:91
msgid "guide intersection"
-msgstr ""
+msgstr "skurðpunktar stoðlína"
#: ../src/display/snap-indicator.cpp:94
msgid "guide origin"
-msgstr ""
+msgstr "upphafspunktur stoðlínu"
#: ../src/display/snap-indicator.cpp:97
msgid "guide (perpendicular)"
@@ -4625,15 +4630,15 @@ msgstr ""
#: ../src/display/snap-indicator.cpp:100
msgid "grid-guide intersection"
-msgstr ""
+msgstr "skurðpunktar stoðlína og hnitanets"
#: ../src/display/snap-indicator.cpp:103
msgid "cusp node"
-msgstr ""
+msgstr "frjĂĄls hnĂștur"
#: ../src/display/snap-indicator.cpp:106
msgid "smooth node"
-msgstr ""
+msgstr "mjĂșkur hnĂștur"
#: ../src/display/snap-indicator.cpp:109
msgid "path"
@@ -4641,7 +4646,7 @@ msgstr "ferill"
#: ../src/display/snap-indicator.cpp:112
msgid "path (perpendicular)"
-msgstr ""
+msgstr "ferill (hornrétt)"
#: ../src/display/snap-indicator.cpp:115
msgid "path (tangential)"
@@ -4649,11 +4654,11 @@ msgstr ""
#: ../src/display/snap-indicator.cpp:118
msgid "path intersection"
-msgstr ""
+msgstr "skurðpunktar ferla"
#: ../src/display/snap-indicator.cpp:121
msgid "guide-path intersection"
-msgstr ""
+msgstr "skurðpunktar stoðlína-ferils"
#: ../src/display/snap-indicator.cpp:124
msgid "clip-path"
@@ -4717,7 +4722,7 @@ msgstr "grunnlĂ­na texta"
#: ../src/display/snap-indicator.cpp:170
msgid "constrained angle"
-msgstr ""
+msgstr "ĂŸrepaskipt horn"
#: ../src/display/snap-indicator.cpp:173
msgid "constraint"
@@ -4737,19 +4742,19 @@ msgstr "Miðpunktur å hlið umgjarðar"
#: ../src/display/snap-indicator.cpp:196 ../src/ui/tool/node.cpp:1505
msgid "Smooth node"
-msgstr ""
+msgstr "MjĂșkur hnĂștur"
#: ../src/display/snap-indicator.cpp:199 ../src/ui/tool/node.cpp:1504
msgid "Cusp node"
-msgstr ""
+msgstr "FrjĂĄls hnĂștur"
#: ../src/display/snap-indicator.cpp:202
msgid "Line midpoint"
-msgstr ""
+msgstr "miðpunkt línu"
#: ../src/display/snap-indicator.cpp:205
msgid "Object midpoint"
-msgstr ""
+msgstr "miðpunkt hlutar"
#: ../src/display/snap-indicator.cpp:208
msgid "Object rotation center"
@@ -4761,7 +4766,7 @@ msgstr "Haldfang"
#: ../src/display/snap-indicator.cpp:215
msgid "Path intersection"
-msgstr ""
+msgstr "skurðpunktar ferla"
#: ../src/display/snap-indicator.cpp:218
msgid "Guide"
@@ -4769,7 +4774,7 @@ msgstr "Stoðlína"
#: ../src/display/snap-indicator.cpp:221
msgid "Guide origin"
-msgstr ""
+msgstr "upphafspunktur stoðlínu"
#: ../src/display/snap-indicator.cpp:224
msgid "Convex hull corner"
@@ -4777,7 +4782,7 @@ msgstr ""
#: ../src/display/snap-indicator.cpp:227
msgid "Quadrant point"
-msgstr ""
+msgstr "fjórðungspunkt"
#: ../src/display/snap-indicator.cpp:231
msgid "Corner"
@@ -4789,7 +4794,7 @@ msgstr "Textafesting"
#: ../src/display/snap-indicator.cpp:237
msgid "Multiple of grid spacing"
-msgstr ""
+msgstr "Margfeldi af millibilum hnitanets"
#: ../src/display/snap-indicator.cpp:268
msgid " to "
@@ -4809,7 +4814,7 @@ msgstr "Skjal Ă­ minni %d"
msgid "Memory document %1"
msgstr "Skjal Ă­ minni %1"
-#: ../src/document.cpp:839
+#: ../src/document.cpp:855
#, c-format
msgid "Unnamed document %d"
msgstr "Ónefnt skjal %d"
@@ -4829,7 +4834,7 @@ msgstr "_Endurgera"
#: ../src/extension/dependency.cpp:243
msgid "Dependency:"
-msgstr ""
+msgstr "HÊði:"
#: ../src/extension/dependency.cpp:244
msgid " type: "
@@ -4869,12 +4874,12 @@ msgstr ""
#: ../src/extension/error-file.cpp:67
msgid "Show dialog on startup"
-msgstr ""
+msgstr "Birta glugga við rÊsingu"
#: ../src/extension/execution-env.cpp:144
#, c-format
msgid "'%s' working, please wait..."
-msgstr ""
+msgstr "'%s' í vinnslu, bíddu aðeins..."
#. static int i = 0;
#. std::cout << "Checking module[" << i++ << "]: " << name << std::endl;
@@ -4886,7 +4891,7 @@ msgstr ""
#: ../src/extension/extension.cpp:281
msgid "the extension is designed for Windows only."
-msgstr ""
+msgstr "viðbótin er einungis hönnuð fyrir Windows."
#: ../src/extension/extension.cpp:286
msgid "an ID was not defined for it."
@@ -4911,11 +4916,11 @@ msgstr ""
#: ../src/extension/extension.cpp:325
msgid "Extension \""
-msgstr ""
+msgstr "Viðbótin \""
#: ../src/extension/extension.cpp:325
msgid "\" failed to load because "
-msgstr ""
+msgstr "\" hlóðst ekki inn vegna "
#: ../src/extension/extension.cpp:674
#, c-format
@@ -5053,9 +5058,9 @@ msgstr "BÊta við suði"
#. _settings->add_checkbutton(false, SP_ATTR_STITCHTILES, _("Stitch Tiles"), "stitch", "noStitch");
#: ../src/extension/internal/bitmap/addNoise.cpp:47
-#: ../src/extension/internal/filter/color.h:426
-#: ../src/extension/internal/filter/color.h:1497
-#: ../src/extension/internal/filter/color.h:1585
+#: ../src/extension/internal/filter/color.h:501
+#: ../src/extension/internal/filter/color.h:1572
+#: ../src/extension/internal/filter/color.h:1660
#: ../src/extension/internal/filter/distort.h:69
#: ../src/extension/internal/filter/morphology.h:60 ../src/rdf.cpp:244
#: ../src/ui/dialog/filter-effects-dialog.cpp:2842
@@ -5194,7 +5199,7 @@ msgid "Apply charcoal stylization to selected bitmap(s)"
msgstr ""
#: ../src/extension/internal/bitmap/colorize.cpp:50
-#: ../src/extension/internal/filter/color.h:317
+#: ../src/extension/internal/filter/color.h:392
msgid "Colorize"
msgstr "LitĂŸrykkja"
@@ -5203,7 +5208,7 @@ msgid "Colorize selected bitmap(s) with specified color, using given opacity"
msgstr ""
#: ../src/extension/internal/bitmap/contrast.cpp:40
-#: ../src/extension/internal/filter/color.h:1114
+#: ../src/extension/internal/filter/color.h:1189
msgid "Contrast"
msgstr "Birtuskil"
@@ -5320,7 +5325,7 @@ msgid "Implode selected bitmap(s)"
msgstr ""
#: ../src/extension/internal/bitmap/level.cpp:41
-#: ../src/extension/internal/filter/color.h:742
+#: ../src/extension/internal/filter/color.h:817
#: ../src/extension/internal/filter/image.h:56
#: ../src/extension/internal/filter/morphology.h:66
#: ../src/extension/internal/filter/paint.h:345
@@ -5353,7 +5358,7 @@ msgid "Level (with Channel)"
msgstr ""
#: ../src/extension/internal/bitmap/levelChannel.cpp:54
-#: ../src/extension/internal/filter/color.h:636
+#: ../src/extension/internal/filter/color.h:711
msgid "Channel:"
msgstr "LitrĂĄs:"
@@ -5374,7 +5379,7 @@ msgstr ""
#: ../src/extension/internal/bitmap/modulate.cpp:40
msgid "HSB Adjust"
-msgstr ""
+msgstr "Aðlaga HSB"
#: ../src/extension/internal/bitmap/modulate.cpp:42
msgid "Hue:"
@@ -5430,7 +5435,7 @@ msgstr "Ógegnséi"
#: ../src/extension/internal/bitmap/opacity.cpp:40
#: ../src/ui/dialog/filter-effects-dialog.cpp:2884
-#: ../src/ui/dialog/objects.cpp:1621 ../src/widgets/dropper-toolbar.cpp:83
+#: ../src/ui/dialog/objects.cpp:1619 ../src/widgets/dropper-toolbar.cpp:83
msgid "Opacity:"
msgstr "Ógegnséi:"
@@ -5469,7 +5474,7 @@ msgstr ""
#: ../src/extension/internal/bitmap/sample.cpp:39
msgid "Resample"
-msgstr ""
+msgstr "Endursafna"
#: ../src/extension/internal/bitmap/sample.cpp:48
msgid ""
@@ -5501,8 +5506,8 @@ msgid "Sharpen selected bitmap(s)"
msgstr ""
#: ../src/extension/internal/bitmap/solarize.cpp:39
-#: ../src/extension/internal/filter/color.h:1494
-#: ../src/extension/internal/filter/color.h:1498
+#: ../src/extension/internal/filter/color.h:1569
+#: ../src/extension/internal/filter/color.h:1573
msgid "Solarize"
msgstr "OfurlĂœsa"
@@ -5658,13 +5663,13 @@ msgstr "BlaðsíðustÊrð frålags"
#: ../src/extension/internal/cairo-ps-out.cpp:383
#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:258
msgid "Use document's page size"
-msgstr ""
+msgstr "Nota blaðsíðusstÊrð skjalsins"
#: ../src/extension/internal/cairo-ps-out.cpp:342
#: ../src/extension/internal/cairo-ps-out.cpp:384
#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:259
msgid "Use exported object's size"
-msgstr ""
+msgstr "Nota stĂŠrð Ăștflutta hlutarins"
#: ../src/extension/internal/cairo-ps-out.cpp:344
#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:261
@@ -5675,7 +5680,7 @@ msgstr "BlÊðing/Spåssía (mm):"
#: ../src/extension/internal/cairo-ps-out.cpp:387
#: ../src/extension/internal/cairo-renderer-pdf-out.cpp:262
msgid "Limit export to the object with ID:"
-msgstr ""
+msgstr "Takmarka Ăștflutning við hluti með auðkenni:"
#: ../src/extension/internal/cairo-ps-out.cpp:349
#: ../share/extensions/ps_input.inx.h:2
@@ -5787,85 +5792,85 @@ msgstr "Corel DRAW Presentation Exchange skrĂĄr (*.cmx)"
msgid "Open presentation exchange files saved in Corel DRAW"
msgstr "Opna kynningaskiptiskrår vistaðar með Corel DRAW"
-#: ../src/extension/internal/emf-inout.cpp:3553
+#: ../src/extension/internal/emf-inout.cpp:3562
msgid "EMF Input"
msgstr "EMF Ă­lag"
-#: ../src/extension/internal/emf-inout.cpp:3558
+#: ../src/extension/internal/emf-inout.cpp:3567
msgid "Enhanced Metafiles (*.emf)"
msgstr "Enhanced Metafiles (*.emf)"
-#: ../src/extension/internal/emf-inout.cpp:3559
+#: ../src/extension/internal/emf-inout.cpp:3568
msgid "Enhanced Metafiles"
msgstr "Enhanced Metafiles"
-#: ../src/extension/internal/emf-inout.cpp:3567
+#: ../src/extension/internal/emf-inout.cpp:3576
msgid "EMF Output"
msgstr "EMF frĂĄlag"
-#: ../src/extension/internal/emf-inout.cpp:3569
-#: ../src/extension/internal/wmf-inout.cpp:3144
+#: ../src/extension/internal/emf-inout.cpp:3578
+#: ../src/extension/internal/wmf-inout.cpp:3152
msgid "Convert texts to paths"
msgstr "Umbreyta textum Ă­ ferla"
-#: ../src/extension/internal/emf-inout.cpp:3570
-#: ../src/extension/internal/wmf-inout.cpp:3145
+#: ../src/extension/internal/emf-inout.cpp:3579
+#: ../src/extension/internal/wmf-inout.cpp:3153
msgid "Map Unicode to Symbol font"
-msgstr ""
+msgstr "Varpa Unicode yfir ĂĄ Symbol letur"
-#: ../src/extension/internal/emf-inout.cpp:3571
-#: ../src/extension/internal/wmf-inout.cpp:3146
+#: ../src/extension/internal/emf-inout.cpp:3580
+#: ../src/extension/internal/wmf-inout.cpp:3154
msgid "Map Unicode to Wingdings"
-msgstr ""
+msgstr "Varpa Unicode yfir ĂĄ Wingdings"
-#: ../src/extension/internal/emf-inout.cpp:3572
-#: ../src/extension/internal/wmf-inout.cpp:3147
+#: ../src/extension/internal/emf-inout.cpp:3581
+#: ../src/extension/internal/wmf-inout.cpp:3155
msgid "Map Unicode to Zapf Dingbats"
-msgstr ""
+msgstr "Varpa Unicode yfir ĂĄ Zapf Dingbats"
-#: ../src/extension/internal/emf-inout.cpp:3573
-#: ../src/extension/internal/wmf-inout.cpp:3148
+#: ../src/extension/internal/emf-inout.cpp:3582
+#: ../src/extension/internal/wmf-inout.cpp:3156
msgid "Use MS Unicode PUA (0xF020-0xF0FF) for converted characters"
-msgstr ""
+msgstr "Nota MS Unicode PUA (0xF020-0xF0FF) fyrir umbreytta stafi"
-#: ../src/extension/internal/emf-inout.cpp:3574
-#: ../src/extension/internal/wmf-inout.cpp:3149
+#: ../src/extension/internal/emf-inout.cpp:3583
+#: ../src/extension/internal/wmf-inout.cpp:3157
msgid "Compensate for PPT font bug"
-msgstr ""
+msgstr "BĂŠta upp fyrir PPT leturgalla"
-#: ../src/extension/internal/emf-inout.cpp:3575
-#: ../src/extension/internal/wmf-inout.cpp:3150
+#: ../src/extension/internal/emf-inout.cpp:3584
+#: ../src/extension/internal/wmf-inout.cpp:3158
msgid "Convert dashed/dotted lines to single lines"
-msgstr ""
+msgstr "Umbreyta strikuðum/punktalínum í einfaldar línur"
-#: ../src/extension/internal/emf-inout.cpp:3576
-#: ../src/extension/internal/wmf-inout.cpp:3151
+#: ../src/extension/internal/emf-inout.cpp:3585
+#: ../src/extension/internal/wmf-inout.cpp:3159
msgid "Convert gradients to colored polygon series"
-msgstr ""
+msgstr "Umbreyta litstiglum í runu litaðra marghyrninga"
-#: ../src/extension/internal/emf-inout.cpp:3577
+#: ../src/extension/internal/emf-inout.cpp:3586
msgid "Use native rectangular linear gradients"
-msgstr ""
+msgstr "Nota innbyggða rétthyrnda línulega litstigla"
-#: ../src/extension/internal/emf-inout.cpp:3578
+#: ../src/extension/internal/emf-inout.cpp:3587
msgid "Map all fill patterns to standard EMF hatches"
-msgstr ""
+msgstr "Varpa öllum fyllimynstrum yfir í staðlaðar EMF strikaskyggingar"
-#: ../src/extension/internal/emf-inout.cpp:3579
+#: ../src/extension/internal/emf-inout.cpp:3588
msgid "Ignore image rotations"
msgstr "Hunsa snĂșning mynda"
-#: ../src/extension/internal/emf-inout.cpp:3583
+#: ../src/extension/internal/emf-inout.cpp:3592
msgid "Enhanced Metafile (*.emf)"
-msgstr ""
+msgstr "Enhanced Metafile (*.emf)"
-#: ../src/extension/internal/emf-inout.cpp:3584
+#: ../src/extension/internal/emf-inout.cpp:3593
msgid "Enhanced Metafile"
-msgstr ""
+msgstr "EMF - Enhanced Metafile"
#: ../src/extension/internal/filter/bevels.h:53
msgid "Diffuse Light"
-msgstr ""
+msgstr "Dreift ljĂłs"
#: ../src/extension/internal/filter/bevels.h:55
#: ../src/extension/internal/filter/bevels.h:135
@@ -5891,7 +5896,7 @@ msgstr "Áttarhorn (°)"
#: ../src/extension/internal/filter/bevels.h:139
#: ../src/extension/internal/filter/bevels.h:223
msgid "Lighting color"
-msgstr ""
+msgstr "Litur lĂœsingar"
#: ../src/extension/internal/filter/bevels.h:62
#: ../src/extension/internal/filter/bevels.h:143
@@ -5903,23 +5908,24 @@ msgstr ""
#: ../src/extension/internal/filter/blurs.h:350
#: ../src/extension/internal/filter/bumps.h:141
#: ../src/extension/internal/filter/bumps.h:361
-#: ../src/extension/internal/filter/color.h:81
-#: ../src/extension/internal/filter/color.h:170
-#: ../src/extension/internal/filter/color.h:261
-#: ../src/extension/internal/filter/color.h:346
-#: ../src/extension/internal/filter/color.h:436
-#: ../src/extension/internal/filter/color.h:531
-#: ../src/extension/internal/filter/color.h:653
-#: ../src/extension/internal/filter/color.h:750
-#: ../src/extension/internal/filter/color.h:829
-#: ../src/extension/internal/filter/color.h:920
-#: ../src/extension/internal/filter/color.h:1048
-#: ../src/extension/internal/filter/color.h:1118
-#: ../src/extension/internal/filter/color.h:1211
-#: ../src/extension/internal/filter/color.h:1323
-#: ../src/extension/internal/filter/color.h:1428
-#: ../src/extension/internal/filter/color.h:1504
-#: ../src/extension/internal/filter/color.h:1615
+#: ../src/extension/internal/filter/color.h:82
+#: ../src/extension/internal/filter/color.h:171
+#: ../src/extension/internal/filter/color.h:282
+#: ../src/extension/internal/filter/color.h:336
+#: ../src/extension/internal/filter/color.h:421
+#: ../src/extension/internal/filter/color.h:511
+#: ../src/extension/internal/filter/color.h:606
+#: ../src/extension/internal/filter/color.h:728
+#: ../src/extension/internal/filter/color.h:825
+#: ../src/extension/internal/filter/color.h:904
+#: ../src/extension/internal/filter/color.h:995
+#: ../src/extension/internal/filter/color.h:1123
+#: ../src/extension/internal/filter/color.h:1193
+#: ../src/extension/internal/filter/color.h:1286
+#: ../src/extension/internal/filter/color.h:1398
+#: ../src/extension/internal/filter/color.h:1503
+#: ../src/extension/internal/filter/color.h:1579
+#: ../src/extension/internal/filter/color.h:1690
#: ../src/extension/internal/filter/distort.h:95
#: ../src/extension/internal/filter/distort.h:204
#: ../src/extension/internal/filter/filter-file.cpp:151
@@ -5959,7 +5965,7 @@ msgstr "Mattur bĂșðingur"
#: ../src/extension/internal/filter/bevels.h:136
#: ../src/extension/internal/filter/bevels.h:220
#: ../src/extension/internal/filter/blurs.h:187
-#: ../src/extension/internal/filter/color.h:74
+#: ../src/extension/internal/filter/color.h:75
msgid "Brightness"
msgstr "Birtustig"
@@ -5969,25 +5975,25 @@ msgstr ""
#: ../src/extension/internal/filter/bevels.h:217
msgid "Specular Light"
-msgstr ""
+msgstr "EndurvarpsljĂłs"
#: ../src/extension/internal/filter/blurs.h:56
#: ../src/extension/internal/filter/blurs.h:189
#: ../src/extension/internal/filter/blurs.h:329
#: ../src/extension/internal/filter/distort.h:73
msgid "Horizontal blur"
-msgstr ""
+msgstr "Lårétt móðun"
#: ../src/extension/internal/filter/blurs.h:57
#: ../src/extension/internal/filter/blurs.h:190
#: ../src/extension/internal/filter/blurs.h:330
#: ../src/extension/internal/filter/distort.h:74
msgid "Vertical blur"
-msgstr ""
+msgstr "Lóðrétt móðun"
#: ../src/extension/internal/filter/blurs.h:58
msgid "Blur content only"
-msgstr ""
+msgstr "Einungis móða innihald"
#: ../src/extension/internal/filter/blurs.h:66
msgid "Simple vertical and horizontal blur effect"
@@ -5995,7 +6001,7 @@ msgstr ""
#: ../src/extension/internal/filter/blurs.h:125
msgid "Clean Edges"
-msgstr ""
+msgstr "Hreinar brĂșnir"
#: ../src/extension/internal/filter/blurs.h:127
#: ../src/extension/internal/filter/blurs.h:262
@@ -6013,7 +6019,7 @@ msgstr ""
#: ../src/extension/internal/filter/blurs.h:185
msgid "Cross Blur"
-msgstr ""
+msgstr "Krossmóðun"
#: ../src/extension/internal/filter/blurs.h:188
msgid "Fading"
@@ -6029,11 +6035,11 @@ msgstr "Blanda:"
#: ../src/extension/internal/filter/bumps.h:131
#: ../src/extension/internal/filter/bumps.h:337
#: ../src/extension/internal/filter/bumps.h:344
-#: ../src/extension/internal/filter/color.h:329
-#: ../src/extension/internal/filter/color.h:336
-#: ../src/extension/internal/filter/color.h:1423
-#: ../src/extension/internal/filter/color.h:1596
-#: ../src/extension/internal/filter/color.h:1602
+#: ../src/extension/internal/filter/color.h:404
+#: ../src/extension/internal/filter/color.h:411
+#: ../src/extension/internal/filter/color.h:1498
+#: ../src/extension/internal/filter/color.h:1671
+#: ../src/extension/internal/filter/color.h:1677
#: ../src/extension/internal/filter/paint.h:705
#: ../src/extension/internal/filter/transparency.h:63
#: ../src/filter-enums.cpp:55
@@ -6045,12 +6051,12 @@ msgstr "Dekkja"
#: ../src/extension/internal/filter/bumps.h:132
#: ../src/extension/internal/filter/bumps.h:335
#: ../src/extension/internal/filter/bumps.h:342
-#: ../src/extension/internal/filter/color.h:327
-#: ../src/extension/internal/filter/color.h:332
-#: ../src/extension/internal/filter/color.h:647
-#: ../src/extension/internal/filter/color.h:1415
-#: ../src/extension/internal/filter/color.h:1420
-#: ../src/extension/internal/filter/color.h:1594
+#: ../src/extension/internal/filter/color.h:402
+#: ../src/extension/internal/filter/color.h:407
+#: ../src/extension/internal/filter/color.h:722
+#: ../src/extension/internal/filter/color.h:1490
+#: ../src/extension/internal/filter/color.h:1495
+#: ../src/extension/internal/filter/color.h:1669
#: ../src/extension/internal/filter/paint.h:703
#: ../src/extension/internal/filter/transparency.h:62
#: ../src/filter-enums.cpp:54 ../src/ui/dialog/input.cpp:382
@@ -6062,13 +6068,13 @@ msgstr "SkjĂĄr"
#: ../src/extension/internal/filter/bumps.h:133
#: ../src/extension/internal/filter/bumps.h:338
#: ../src/extension/internal/filter/bumps.h:345
-#: ../src/extension/internal/filter/color.h:325
-#: ../src/extension/internal/filter/color.h:333
-#: ../src/extension/internal/filter/color.h:645
-#: ../src/extension/internal/filter/color.h:1414
-#: ../src/extension/internal/filter/color.h:1421
-#: ../src/extension/internal/filter/color.h:1595
-#: ../src/extension/internal/filter/color.h:1601
+#: ../src/extension/internal/filter/color.h:400
+#: ../src/extension/internal/filter/color.h:408
+#: ../src/extension/internal/filter/color.h:720
+#: ../src/extension/internal/filter/color.h:1489
+#: ../src/extension/internal/filter/color.h:1496
+#: ../src/extension/internal/filter/color.h:1670
+#: ../src/extension/internal/filter/color.h:1676
#: ../src/extension/internal/filter/paint.h:701
#: ../src/extension/internal/filter/transparency.h:60
#: ../src/filter-enums.cpp:53
@@ -6080,10 +6086,10 @@ msgstr "Margfalda"
#: ../src/extension/internal/filter/bumps.h:134
#: ../src/extension/internal/filter/bumps.h:339
#: ../src/extension/internal/filter/bumps.h:346
-#: ../src/extension/internal/filter/color.h:328
-#: ../src/extension/internal/filter/color.h:335
-#: ../src/extension/internal/filter/color.h:1422
-#: ../src/extension/internal/filter/color.h:1593
+#: ../src/extension/internal/filter/color.h:403
+#: ../src/extension/internal/filter/color.h:410
+#: ../src/extension/internal/filter/color.h:1497
+#: ../src/extension/internal/filter/color.h:1668
#: ../src/extension/internal/filter/paint.h:704
#: ../src/extension/internal/filter/transparency.h:64
#: ../src/filter-enums.cpp:56
@@ -6092,7 +6098,7 @@ msgstr "LĂœsa"
#: ../src/extension/internal/filter/blurs.h:204
msgid "Combine vertical and horizontal blur"
-msgstr ""
+msgstr "Sameina lóðrétta og lårétta móðun"
#: ../src/extension/internal/filter/blurs.h:260
msgid "Feather"
@@ -6104,7 +6110,7 @@ msgstr ""
#: ../src/extension/internal/filter/blurs.h:325
msgid "Out of Focus"
-msgstr ""
+msgstr "Úr fókus"
#: ../src/extension/internal/filter/blurs.h:331
#: ../src/extension/internal/filter/distort.h:75
@@ -6128,28 +6134,28 @@ msgid "Erosion"
msgstr "Veðrun"
#: ../src/extension/internal/filter/blurs.h:336
-#: ../src/extension/internal/filter/color.h:1205
-#: ../src/extension/internal/filter/color.h:1317
-#: ../src/ui/dialog/document-properties.cpp:115
+#: ../src/extension/internal/filter/color.h:1280
+#: ../src/extension/internal/filter/color.h:1392
+#: ../src/ui/dialog/document-properties.cpp:122
msgid "Background color"
msgstr "Bakgrunnslitur"
#: ../src/extension/internal/filter/blurs.h:337
#: ../src/extension/internal/filter/bumps.h:129
msgid "Blend type:"
-msgstr ""
+msgstr "Tegund blöndunar:"
#: ../src/extension/internal/filter/blurs.h:338
#: ../src/extension/internal/filter/bumps.h:130
#: ../src/extension/internal/filter/bumps.h:336
#: ../src/extension/internal/filter/bumps.h:343
-#: ../src/extension/internal/filter/color.h:326
-#: ../src/extension/internal/filter/color.h:334
-#: ../src/extension/internal/filter/color.h:646
-#: ../src/extension/internal/filter/color.h:1413
-#: ../src/extension/internal/filter/color.h:1419
-#: ../src/extension/internal/filter/color.h:1586
-#: ../src/extension/internal/filter/color.h:1600
+#: ../src/extension/internal/filter/color.h:401
+#: ../src/extension/internal/filter/color.h:409
+#: ../src/extension/internal/filter/color.h:721
+#: ../src/extension/internal/filter/color.h:1488
+#: ../src/extension/internal/filter/color.h:1494
+#: ../src/extension/internal/filter/color.h:1661
+#: ../src/extension/internal/filter/color.h:1675
#: ../src/extension/internal/filter/distort.h:78
#: ../src/extension/internal/filter/paint.h:702
#: ../src/extension/internal/filter/textures.h:77
@@ -6160,7 +6166,7 @@ msgstr "Venjulegt"
#: ../src/extension/internal/filter/blurs.h:344
msgid "Blend to background"
-msgstr ""
+msgstr "Blanda við bakgrunn"
#: ../src/extension/internal/filter/blurs.h:354
msgid "Blur eroded by white or transparency"
@@ -6168,30 +6174,30 @@ msgstr ""
#: ../src/extension/internal/filter/bumps.h:80
msgid "Bump"
-msgstr ""
+msgstr "Ójöfnur"
#: ../src/extension/internal/filter/bumps.h:84
#: ../src/extension/internal/filter/bumps.h:313
msgid "Image simplification"
-msgstr ""
+msgstr "Einföldun myndar"
#: ../src/extension/internal/filter/bumps.h:85
#: ../src/extension/internal/filter/bumps.h:314
msgid "Bump simplification"
-msgstr ""
+msgstr "Einföldun ójafna"
#: ../src/extension/internal/filter/bumps.h:87
#: ../src/extension/internal/filter/bumps.h:316
msgid "Bump source"
-msgstr ""
+msgstr "Uppruni Ăłjafna"
#: ../src/extension/internal/filter/bumps.h:88
#: ../src/extension/internal/filter/bumps.h:317
-#: ../src/extension/internal/filter/color.h:157
-#: ../src/extension/internal/filter/color.h:637
-#: ../src/extension/internal/filter/color.h:821
+#: ../src/extension/internal/filter/color.h:158
+#: ../src/extension/internal/filter/color.h:712
+#: ../src/extension/internal/filter/color.h:896
#: ../src/extension/internal/filter/transparency.h:132
-#: ../src/filter-enums.cpp:128 ../src/ui/tools/flood-tool.cpp:193
+#: ../src/filter-enums.cpp:128 ../src/ui/tools/flood-tool.cpp:183
#: ../src/widgets/sp-color-icc-selector.cpp:330
#: ../src/widgets/sp-color-scales.cpp:415
#: ../src/widgets/sp-color-scales.cpp:416
@@ -6200,11 +6206,11 @@ msgstr "Rautt"
#: ../src/extension/internal/filter/bumps.h:89
#: ../src/extension/internal/filter/bumps.h:318
-#: ../src/extension/internal/filter/color.h:158
-#: ../src/extension/internal/filter/color.h:638
-#: ../src/extension/internal/filter/color.h:822
+#: ../src/extension/internal/filter/color.h:159
+#: ../src/extension/internal/filter/color.h:713
+#: ../src/extension/internal/filter/color.h:897
#: ../src/extension/internal/filter/transparency.h:133
-#: ../src/filter-enums.cpp:129 ../src/ui/tools/flood-tool.cpp:194
+#: ../src/filter-enums.cpp:129 ../src/ui/tools/flood-tool.cpp:184
#: ../src/widgets/sp-color-icc-selector.cpp:331
#: ../src/widgets/sp-color-scales.cpp:418
#: ../src/widgets/sp-color-scales.cpp:419
@@ -6213,11 +6219,11 @@ msgstr "GrĂŠnt"
#: ../src/extension/internal/filter/bumps.h:90
#: ../src/extension/internal/filter/bumps.h:319
-#: ../src/extension/internal/filter/color.h:159
-#: ../src/extension/internal/filter/color.h:639
-#: ../src/extension/internal/filter/color.h:823
+#: ../src/extension/internal/filter/color.h:160
+#: ../src/extension/internal/filter/color.h:714
+#: ../src/extension/internal/filter/color.h:898
#: ../src/extension/internal/filter/transparency.h:134
-#: ../src/filter-enums.cpp:130 ../src/ui/tools/flood-tool.cpp:195
+#: ../src/filter-enums.cpp:130 ../src/ui/tools/flood-tool.cpp:185
#: ../src/widgets/sp-color-icc-selector.cpp:332
#: ../src/widgets/sp-color-scales.cpp:421
#: ../src/widgets/sp-color-scales.cpp:422
@@ -6226,11 +6232,11 @@ msgstr "BlĂĄtt"
#: ../src/extension/internal/filter/bumps.h:91
msgid "Bump from background"
-msgstr ""
+msgstr "Ójöfnur frĂĄ bakgrunni"
#: ../src/extension/internal/filter/bumps.h:94
msgid "Lighting type:"
-msgstr ""
+msgstr "Tegund lĂœsingar:"
#: ../src/extension/internal/filter/bumps.h:95
msgid "Specular"
@@ -6243,26 +6249,26 @@ msgstr "LjĂłsdreifing"
#: ../src/extension/internal/filter/bumps.h:98
#: ../src/extension/internal/filter/bumps.h:329
#: ../src/libgdl/gdl-dock-placeholder.c:175 ../src/libgdl/gdl-dock.c:199
-#: ../src/widgets/rect-toolbar.cpp:335
+#: ../src/widgets/rect-toolbar.cpp:334
#: ../share/extensions/interp_att_g.inx.h:11
msgid "Height"
msgstr "HÊð"
#: ../src/extension/internal/filter/bumps.h:99
#: ../src/extension/internal/filter/bumps.h:330
-#: ../src/extension/internal/filter/color.h:76
-#: ../src/extension/internal/filter/color.h:824
-#: ../src/extension/internal/filter/color.h:1113
+#: ../src/extension/internal/filter/color.h:77
+#: ../src/extension/internal/filter/color.h:899
+#: ../src/extension/internal/filter/color.h:1188
#: ../src/extension/internal/filter/paint.h:86
#: ../src/extension/internal/filter/paint.h:592
#: ../src/extension/internal/filter/paint.h:707
-#: ../src/ui/tools/flood-tool.cpp:198
+#: ../src/ui/tools/flood-tool.cpp:188
#: ../src/widgets/sp-color-icc-selector.cpp:341
#: ../src/widgets/sp-color-scales.cpp:447
#: ../src/widgets/sp-color-scales.cpp:448 ../src/widgets/tweak-toolbar.cpp:318
#: ../share/extensions/color_randomize.inx.h:5
msgid "Lightness"
-msgstr "LjĂłsleiki"
+msgstr "LjĂłsleiki (L)"
#: ../src/extension/internal/filter/bumps.h:100
#: ../src/extension/internal/filter/bumps.h:331
@@ -6343,7 +6349,7 @@ msgstr "Z-mark"
#: ../src/extension/internal/filter/bumps.h:123
msgid "Specular exponent"
-msgstr ""
+msgstr "VeldisvĂ­sir endurkasts"
#: ../src/extension/internal/filter/bumps.h:124
msgid "Cone angle"
@@ -6351,19 +6357,19 @@ msgstr "Horn keilu"
#: ../src/extension/internal/filter/bumps.h:127
msgid "Image color"
-msgstr ""
+msgstr "Litur myndar"
#: ../src/extension/internal/filter/bumps.h:128
msgid "Color bump"
-msgstr ""
+msgstr "LitĂłjafna"
#: ../src/extension/internal/filter/bumps.h:145
msgid "All purposes bump filter"
-msgstr ""
+msgstr "Allrahanda ójöfnusía"
#: ../src/extension/internal/filter/bumps.h:309
msgid "Wax Bump"
-msgstr ""
+msgstr "Vaxkennd Ăłjafna"
#: ../src/extension/internal/filter/bumps.h:320
msgid "Background:"
@@ -6371,7 +6377,7 @@ msgstr "Bakgrunnur:"
#: ../src/extension/internal/filter/bumps.h:322
#: ../src/extension/internal/filter/transparency.h:57
-#: ../src/filter-enums.cpp:30 ../src/sp-image.cpp:518
+#: ../src/filter-enums.cpp:30 ../src/sp-image.cpp:509
msgid "Image"
msgstr "Mynd"
@@ -6384,25 +6390,25 @@ msgid "Background opacity"
msgstr "Ógegnséi bakgrunns"
#: ../src/extension/internal/filter/bumps.h:327
-#: ../src/extension/internal/filter/color.h:1040
+#: ../src/extension/internal/filter/color.h:1115
msgid "Lighting"
msgstr "LĂœsing"
#: ../src/extension/internal/filter/bumps.h:334
msgid "Lighting blend:"
-msgstr ""
+msgstr "Blöndun lĂœsingar:"
#: ../src/extension/internal/filter/bumps.h:341
msgid "Highlight blend:"
-msgstr ""
+msgstr "Blöndun håtóna:"
#: ../src/extension/internal/filter/bumps.h:350
msgid "Bump color"
-msgstr ""
+msgstr "Litur ójöfnu"
#: ../src/extension/internal/filter/bumps.h:351
msgid "Revert bump"
-msgstr ""
+msgstr "Afturkalla ójöfnu"
#: ../src/extension/internal/filter/bumps.h:352
msgid "Transparency type:"
@@ -6425,17 +6431,17 @@ msgstr "Inn"
msgid "Turns an image to jelly"
msgstr "Breytir mynd Ă­ bĂșðing"
-#: ../src/extension/internal/filter/color.h:72
+#: ../src/extension/internal/filter/color.h:73
msgid "Brilliance"
msgstr "GljĂĄi"
-#: ../src/extension/internal/filter/color.h:75
-#: ../src/extension/internal/filter/color.h:1417
+#: ../src/extension/internal/filter/color.h:76
+#: ../src/extension/internal/filter/color.h:1492
msgid "Over-saturation"
-msgstr ""
+msgstr "Yfir-litmettun"
-#: ../src/extension/internal/filter/color.h:77
-#: ../src/extension/internal/filter/color.h:161
+#: ../src/extension/internal/filter/color.h:78
+#: ../src/extension/internal/filter/color.h:162
#: ../src/extension/internal/filter/overlays.h:70
#: ../src/extension/internal/filter/paint.h:85
#: ../src/extension/internal/filter/paint.h:502
@@ -6444,170 +6450,214 @@ msgstr ""
msgid "Inverted"
msgstr "ViðsnĂșið"
-#: ../src/extension/internal/filter/color.h:85
+#: ../src/extension/internal/filter/color.h:86
msgid "Brightness filter"
-msgstr ""
+msgstr "BirtustigssĂ­a"
-#: ../src/extension/internal/filter/color.h:152
+#: ../src/extension/internal/filter/color.h:153
msgid "Channel Painting"
-msgstr ""
+msgstr "MĂĄlun litrĂĄsa"
-#: ../src/extension/internal/filter/color.h:156
-#: ../src/extension/internal/filter/color.h:257
+#: ../src/extension/internal/filter/color.h:157
+#: ../src/extension/internal/filter/color.h:332
#: ../src/extension/internal/filter/paint.h:87 ../src/filter-enums.cpp:66
#: ../src/ui/dialog/inkscape-preferences.cpp:952
-#: ../src/ui/tools/flood-tool.cpp:197
+#: ../src/ui/tools/flood-tool.cpp:187
#: ../src/widgets/sp-color-icc-selector.cpp:337
#: ../src/widgets/sp-color-icc-selector.cpp:342
#: ../src/widgets/sp-color-scales.cpp:444
#: ../src/widgets/sp-color-scales.cpp:445 ../src/widgets/tweak-toolbar.cpp:302
#: ../share/extensions/color_randomize.inx.h:4
msgid "Saturation"
-msgstr "Litmettun"
+msgstr "Litmettun (S)"
-#: ../src/extension/internal/filter/color.h:160
+#: ../src/extension/internal/filter/color.h:161
#: ../src/extension/internal/filter/transparency.h:135
-#: ../src/filter-enums.cpp:131 ../src/ui/tools/flood-tool.cpp:199
+#: ../src/filter-enums.cpp:131 ../src/ui/tools/flood-tool.cpp:189
msgid "Alpha"
msgstr "Alfa gegnsĂŠi"
-#: ../src/extension/internal/filter/color.h:174
+#: ../src/extension/internal/filter/color.h:175
msgid "Replace RGB by any color"
-msgstr ""
+msgstr "Skipta Ășt RGB fyrir einhvern lit"
#: ../src/extension/internal/filter/color.h:254
+msgid "Color Blindness"
+msgstr "Litblinduhermir"
+
+#: ../src/extension/internal/filter/color.h:258
+msgid "Blindness type:"
+msgstr "Tegund litblindu:"
+
+#: ../src/extension/internal/filter/color.h:259
+msgid "Rod monochromacy (atypical achromatopsia)"
+msgstr "Einlita stafir (atypical achromatopsia)"
+
+#: ../src/extension/internal/filter/color.h:260
+msgid "Cone monochromacy (typical achromatopsia)"
+msgstr "Einlita keilur (atypical achromatopsia)"
+
+#: ../src/extension/internal/filter/color.h:261
+msgid "Geen weak (deuteranomaly)"
+msgstr "GrÊn hålfgerð (deuteranomaly)"
+
+#: ../src/extension/internal/filter/color.h:262
+msgid "Green blind (deuteranopia)"
+msgstr "GrĂŠn blinda (deuteranopia)"
+
+#: ../src/extension/internal/filter/color.h:263
+msgid "Red weak (protanomaly)"
+msgstr "Rauð hålfgerð (protanomaly)"
+
+#: ../src/extension/internal/filter/color.h:264
+msgid "Red blind (protanopia)"
+msgstr "Rauð blinda (protanopia)"
+
+#: ../src/extension/internal/filter/color.h:265
+msgid "Blue weak (tritanomaly)"
+msgstr "Blå hålfgerð (tritanomaly)"
+
+#: ../src/extension/internal/filter/color.h:266
+msgid "Blue blind (tritanopia)"
+msgstr "BlĂĄ blinda (tritanopia)"
+
+#: ../src/extension/internal/filter/color.h:286
+msgid "Simulate color blindness"
+msgstr "LĂ­kja eftir litblindu"
+
+#: ../src/extension/internal/filter/color.h:329
msgid "Color Shift"
-msgstr ""
+msgstr "Hliðrun lita"
-#: ../src/extension/internal/filter/color.h:256
+#: ../src/extension/internal/filter/color.h:331
msgid "Shift (°)"
msgstr "Hnikun (°)"
-#: ../src/extension/internal/filter/color.h:265
+#: ../src/extension/internal/filter/color.h:340
msgid "Rotate and desaturate hue"
-msgstr ""
+msgstr "SnĂșa litblĂŠ og afmetta"
-#: ../src/extension/internal/filter/color.h:321
+#: ../src/extension/internal/filter/color.h:396
msgid "Harsh light"
-msgstr ""
+msgstr "Hart ljĂłs"
-#: ../src/extension/internal/filter/color.h:322
+#: ../src/extension/internal/filter/color.h:397
msgid "Normal light"
-msgstr ""
+msgstr "Venjulegt ljĂłs"
-#: ../src/extension/internal/filter/color.h:323
+#: ../src/extension/internal/filter/color.h:398
msgid "Duotone"
-msgstr ""
+msgstr "TvĂ­tĂłna (duo)"
-#: ../src/extension/internal/filter/color.h:324
-#: ../src/extension/internal/filter/color.h:1412
+#: ../src/extension/internal/filter/color.h:399
+#: ../src/extension/internal/filter/color.h:1487
msgid "Blend 1:"
msgstr "Blöndun 1:"
-#: ../src/extension/internal/filter/color.h:331
-#: ../src/extension/internal/filter/color.h:1418
+#: ../src/extension/internal/filter/color.h:406
+#: ../src/extension/internal/filter/color.h:1493
msgid "Blend 2:"
msgstr "Blöndun 2:"
-#: ../src/extension/internal/filter/color.h:350
+#: ../src/extension/internal/filter/color.h:425
msgid "Blend image or object with a flood color"
msgstr ""
-#: ../src/extension/internal/filter/color.h:424 ../src/filter-enums.cpp:23
+#: ../src/extension/internal/filter/color.h:499 ../src/filter-enums.cpp:23
msgid "Component Transfer"
msgstr ""
-#: ../src/extension/internal/filter/color.h:427 ../src/filter-enums.cpp:110
+#: ../src/extension/internal/filter/color.h:502 ../src/filter-enums.cpp:110
msgid "Identity"
msgstr "Auðkenni"
-#: ../src/extension/internal/filter/color.h:428
+#: ../src/extension/internal/filter/color.h:503
#: ../src/extension/internal/filter/paint.h:498 ../src/filter-enums.cpp:111
#: ../src/ui/dialog/filter-effects-dialog.cpp:1050
msgid "Table"
msgstr "Tafla"
-#: ../src/extension/internal/filter/color.h:429
+#: ../src/extension/internal/filter/color.h:504
#: ../src/extension/internal/filter/paint.h:499 ../src/filter-enums.cpp:112
#: ../src/ui/dialog/filter-effects-dialog.cpp:1053
msgid "Discrete"
msgstr "Óáberandi"
-#: ../src/extension/internal/filter/color.h:430 ../src/filter-enums.cpp:113
+#: ../src/extension/internal/filter/color.h:505 ../src/filter-enums.cpp:113
#: ../src/live_effects/lpe-interpolate_points.cpp:25
#: ../src/live_effects/lpe-powerstroke.cpp:194
msgid "Linear"
msgstr "LĂ­nulegt"
-#: ../src/extension/internal/filter/color.h:431 ../src/filter-enums.cpp:114
+#: ../src/extension/internal/filter/color.h:506 ../src/filter-enums.cpp:114
msgid "Gamma"
msgstr "LitrĂłf (gamma)"
-#: ../src/extension/internal/filter/color.h:440
+#: ../src/extension/internal/filter/color.h:515
msgid "Basic component transfer structure"
msgstr ""
-#: ../src/extension/internal/filter/color.h:509
+#: ../src/extension/internal/filter/color.h:584
msgid "Duochrome"
-msgstr ""
+msgstr "Tvílitað"
-#: ../src/extension/internal/filter/color.h:513
+#: ../src/extension/internal/filter/color.h:588
msgid "Fluorescence level"
-msgstr ""
+msgstr "Styrkur flĂșrljĂłmunar"
-#: ../src/extension/internal/filter/color.h:514
+#: ../src/extension/internal/filter/color.h:589
msgid "Swap:"
msgstr "VĂ­xla:"
-#: ../src/extension/internal/filter/color.h:515
+#: ../src/extension/internal/filter/color.h:590
msgid "No swap"
msgstr "Ekki vĂ­xla"
-#: ../src/extension/internal/filter/color.h:516
+#: ../src/extension/internal/filter/color.h:591
msgid "Color and alpha"
msgstr "Lit og gegnsĂŠi"
-#: ../src/extension/internal/filter/color.h:517
+#: ../src/extension/internal/filter/color.h:592
msgid "Color only"
msgstr "Bara lit"
-#: ../src/extension/internal/filter/color.h:518
+#: ../src/extension/internal/filter/color.h:593
msgid "Alpha only"
msgstr "Bara gegnsĂŠi"
-#: ../src/extension/internal/filter/color.h:522
+#: ../src/extension/internal/filter/color.h:597
msgid "Color 1"
msgstr "Litur 1"
-#: ../src/extension/internal/filter/color.h:525
+#: ../src/extension/internal/filter/color.h:600
msgid "Color 2"
msgstr "Litur 2"
-#: ../src/extension/internal/filter/color.h:535
+#: ../src/extension/internal/filter/color.h:610
msgid "Convert luminance values to a duochrome palette"
-msgstr ""
+msgstr "Umbreyta ljĂłmagildum Ă­ tveggja lita litaspjald"
-#: ../src/extension/internal/filter/color.h:634
+#: ../src/extension/internal/filter/color.h:709
msgid "Extract Channel"
msgstr "NĂĄ Ă­ litrĂĄs"
-#: ../src/extension/internal/filter/color.h:640
+#: ../src/extension/internal/filter/color.h:715
#: ../src/widgets/sp-color-icc-selector.cpp:344
#: ../src/widgets/sp-color-icc-selector.cpp:349
#: ../src/widgets/sp-color-scales.cpp:469
#: ../src/widgets/sp-color-scales.cpp:470
msgid "Cyan"
-msgstr "BlĂĄgrĂŠnt (Cyan)"
+msgstr "GrĂŠnblĂĄtt (cyan)"
-#: ../src/extension/internal/filter/color.h:641
+#: ../src/extension/internal/filter/color.h:716
#: ../src/widgets/sp-color-icc-selector.cpp:345
#: ../src/widgets/sp-color-icc-selector.cpp:350
#: ../src/widgets/sp-color-scales.cpp:472
#: ../src/widgets/sp-color-scales.cpp:473
msgid "Magenta"
-msgstr "BlĂĄrautt (Magenta)"
+msgstr "BlĂĄrautt (magenta)"
-#: ../src/extension/internal/filter/color.h:642
+#: ../src/extension/internal/filter/color.h:717
#: ../src/widgets/sp-color-icc-selector.cpp:346
#: ../src/widgets/sp-color-icc-selector.cpp:351
#: ../src/widgets/sp-color-scales.cpp:475
@@ -6615,27 +6665,27 @@ msgstr "BlĂĄrautt (Magenta)"
msgid "Yellow"
msgstr "Gult"
-#: ../src/extension/internal/filter/color.h:644
+#: ../src/extension/internal/filter/color.h:719
msgid "Background blend mode:"
-msgstr ""
+msgstr "Blöndunarhamur bakgrunns:"
-#: ../src/extension/internal/filter/color.h:649
+#: ../src/extension/internal/filter/color.h:724
msgid "Channel to alpha"
-msgstr ""
+msgstr "LitrĂĄs Ă­ alfa"
-#: ../src/extension/internal/filter/color.h:657
+#: ../src/extension/internal/filter/color.h:732
msgid "Extract color channel as a transparent image"
-msgstr ""
+msgstr "NĂĄ Ășt litrĂĄs sem gegnsĂŠrri mynd"
-#: ../src/extension/internal/filter/color.h:740
+#: ../src/extension/internal/filter/color.h:815
msgid "Fade to Black or White"
msgstr "Deyfa yfir í svart eða hvítt"
-#: ../src/extension/internal/filter/color.h:743
+#: ../src/extension/internal/filter/color.h:818
msgid "Fade to:"
msgstr "Deyfa Ă­:"
-#: ../src/extension/internal/filter/color.h:744
+#: ../src/extension/internal/filter/color.h:819
#: ../src/ui/widget/selected-style.cpp:274
#: ../src/widgets/sp-color-icc-selector.cpp:347
#: ../src/widgets/sp-color-scales.cpp:478
@@ -6643,240 +6693,244 @@ msgstr "Deyfa Ă­:"
msgid "Black"
msgstr "Svart"
-#: ../src/extension/internal/filter/color.h:745
+#: ../src/extension/internal/filter/color.h:820
#: ../src/ui/widget/selected-style.cpp:270
msgid "White"
msgstr "HvĂ­tt"
-#: ../src/extension/internal/filter/color.h:754
+#: ../src/extension/internal/filter/color.h:829
msgid "Fade to black or white"
msgstr "Deyfa yfir í svart eða hvítt"
-#: ../src/extension/internal/filter/color.h:819
+#: ../src/extension/internal/filter/color.h:894
msgid "Greyscale"
msgstr "GrĂĄtĂłna"
-#: ../src/extension/internal/filter/color.h:825
+#: ../src/extension/internal/filter/color.h:900
#: ../src/extension/internal/filter/paint.h:83
#: ../src/extension/internal/filter/paint.h:239
msgid "Transparent"
msgstr "GegnsĂŠtt"
-#: ../src/extension/internal/filter/color.h:833
+#: ../src/extension/internal/filter/color.h:908
msgid "Customize greyscale components"
-msgstr ""
+msgstr "Sérsníða gråtóna einingar"
-#: ../src/extension/internal/filter/color.h:905
+#: ../src/extension/internal/filter/color.h:980
#: ../src/ui/widget/selected-style.cpp:266
msgid "Invert"
msgstr "Umhverfa"
-#: ../src/extension/internal/filter/color.h:907
+#: ../src/extension/internal/filter/color.h:982
msgid "Invert channels:"
-msgstr ""
+msgstr "UmsnĂșa litrĂĄsum:"
-#: ../src/extension/internal/filter/color.h:908
+#: ../src/extension/internal/filter/color.h:983
msgid "No inversion"
-msgstr ""
+msgstr "Enginn umsnĂșningur"
-#: ../src/extension/internal/filter/color.h:909
+#: ../src/extension/internal/filter/color.h:984
msgid "Red and blue"
-msgstr ""
+msgstr "Rautt og blĂĄtt"
-#: ../src/extension/internal/filter/color.h:910
+#: ../src/extension/internal/filter/color.h:985
msgid "Red and green"
-msgstr ""
+msgstr "Rautt og grĂŠnt"
-#: ../src/extension/internal/filter/color.h:911
+#: ../src/extension/internal/filter/color.h:986
msgid "Green and blue"
-msgstr ""
+msgstr "GrĂŠnt og blĂĄtt"
-#: ../src/extension/internal/filter/color.h:913
+#: ../src/extension/internal/filter/color.h:988
msgid "Light transparency"
-msgstr ""
+msgstr "GegnsĂŠi ljĂłss"
-#: ../src/extension/internal/filter/color.h:914
+#: ../src/extension/internal/filter/color.h:989
msgid "Invert hue"
msgstr "Umhverfa litblĂŠ"
-#: ../src/extension/internal/filter/color.h:915
+#: ../src/extension/internal/filter/color.h:990
msgid "Invert lightness"
msgstr "UmsnĂșa ljĂłsleika"
-#: ../src/extension/internal/filter/color.h:916
+#: ../src/extension/internal/filter/color.h:991
msgid "Invert transparency"
-msgstr ""
+msgstr "UmsnĂșa gegnsĂŠi"
-#: ../src/extension/internal/filter/color.h:924
+#: ../src/extension/internal/filter/color.h:999
msgid "Manage hue, lightness and transparency inversions"
-msgstr ""
+msgstr "SĂœsla með viðsnĂșning ĂĄ litblĂŠ, ljĂłsleika og gegnsĂŠi"
-#: ../src/extension/internal/filter/color.h:1042
+#: ../src/extension/internal/filter/color.h:1117
msgid "Lights"
msgstr "LjĂłs"
-#: ../src/extension/internal/filter/color.h:1043
+#: ../src/extension/internal/filter/color.h:1118
msgid "Shadows"
msgstr "Skuggar"
-#: ../src/extension/internal/filter/color.h:1044
+#: ../src/extension/internal/filter/color.h:1119
#: ../src/extension/internal/filter/paint.h:356 ../src/filter-enums.cpp:33
#: ../src/live_effects/effect.cpp:110
#: ../src/ui/dialog/filter-effects-dialog.cpp:1047
-#: ../src/widgets/gradient-toolbar.cpp:1156
+#: ../src/widgets/gradient-toolbar.cpp:1159
msgid "Offset"
msgstr "Hliðrun"
-#: ../src/extension/internal/filter/color.h:1052
+#: ../src/extension/internal/filter/color.h:1127
msgid "Modify lights and shadows separately"
-msgstr ""
+msgstr "Breyta ljĂłsum og skuggum hvoru fyrir sig"
-#: ../src/extension/internal/filter/color.h:1111
+#: ../src/extension/internal/filter/color.h:1186
msgid "Lightness-Contrast"
msgstr "LjĂłsleiki-Birtuskil"
-#: ../src/extension/internal/filter/color.h:1122
+#: ../src/extension/internal/filter/color.h:1197
msgid "Modify lightness and contrast separately"
msgstr "Breyta ljĂłsleika og birtuskilum hvoru fyrir sig"
-#: ../src/extension/internal/filter/color.h:1190
+#: ../src/extension/internal/filter/color.h:1265
msgid "Nudge RGB"
-msgstr ""
+msgstr "Hnika til RGB"
-#: ../src/extension/internal/filter/color.h:1194
+#: ../src/extension/internal/filter/color.h:1269
msgid "Red offset"
-msgstr ""
-
-#: ../src/extension/internal/filter/color.h:1195
-#: ../src/extension/internal/filter/color.h:1198
-#: ../src/extension/internal/filter/color.h:1201
-#: ../src/extension/internal/filter/color.h:1307
-#: ../src/extension/internal/filter/color.h:1310
-#: ../src/extension/internal/filter/color.h:1313
+msgstr "Hliðrun rauðs"
+
+#: ../src/extension/internal/filter/color.h:1270
+#: ../src/extension/internal/filter/color.h:1273
+#: ../src/extension/internal/filter/color.h:1276
+#: ../src/extension/internal/filter/color.h:1382
+#: ../src/extension/internal/filter/color.h:1385
+#: ../src/extension/internal/filter/color.h:1388
#: ../src/ui/dialog/input.cpp:1616 ../src/ui/dialog/layers.cpp:917
msgid "X"
msgstr "X"
-#: ../src/extension/internal/filter/color.h:1196
-#: ../src/extension/internal/filter/color.h:1199
-#: ../src/extension/internal/filter/color.h:1202
-#: ../src/extension/internal/filter/color.h:1308
-#: ../src/extension/internal/filter/color.h:1311
-#: ../src/extension/internal/filter/color.h:1314
+#: ../src/extension/internal/filter/color.h:1271
+#: ../src/extension/internal/filter/color.h:1274
+#: ../src/extension/internal/filter/color.h:1277
+#: ../src/extension/internal/filter/color.h:1383
+#: ../src/extension/internal/filter/color.h:1386
+#: ../src/extension/internal/filter/color.h:1389
#: ../src/ui/dialog/input.cpp:1616
msgid "Y"
msgstr "Y"
-#: ../src/extension/internal/filter/color.h:1197
+#: ../src/extension/internal/filter/color.h:1272
msgid "Green offset"
-msgstr ""
+msgstr "Hliðrun grÊns"
-#: ../src/extension/internal/filter/color.h:1200
+#: ../src/extension/internal/filter/color.h:1275
msgid "Blue offset"
-msgstr ""
+msgstr "Hliðrun blås"
-#: ../src/extension/internal/filter/color.h:1215
+#: ../src/extension/internal/filter/color.h:1290
msgid ""
"Nudge RGB channels separately and blend them to different types of "
"backgrounds"
msgstr ""
+"Hnika til RGB litrĂĄsunum, hverri fyrir sig og blanda ĂŸeim við mismunandi "
+"tegundir bakgrunna"
-#: ../src/extension/internal/filter/color.h:1302
+#: ../src/extension/internal/filter/color.h:1377
msgid "Nudge CMY"
-msgstr ""
+msgstr "Hnika til CMY"
-#: ../src/extension/internal/filter/color.h:1306
+#: ../src/extension/internal/filter/color.h:1381
msgid "Cyan offset"
-msgstr ""
+msgstr "Hliðrun grÊnblås (cyan)"
-#: ../src/extension/internal/filter/color.h:1309
+#: ../src/extension/internal/filter/color.h:1384
msgid "Magenta offset"
-msgstr ""
+msgstr "Hliðrun blårauðs (magenta)"
-#: ../src/extension/internal/filter/color.h:1312
+#: ../src/extension/internal/filter/color.h:1387
msgid "Yellow offset"
-msgstr ""
+msgstr "Hliðrun guls"
-#: ../src/extension/internal/filter/color.h:1327
+#: ../src/extension/internal/filter/color.h:1402
msgid ""
"Nudge CMY channels separately and blend them to different types of "
"backgrounds"
msgstr ""
+"Hnika til CMY litrĂĄsunum, hverri fyrir sig og blanda ĂŸeim við mismunandi "
+"tegundir bakgrunna"
-#: ../src/extension/internal/filter/color.h:1408
+#: ../src/extension/internal/filter/color.h:1483
msgid "Quadritone fantasy"
-msgstr ""
+msgstr "FjĂłrtĂłna fantasĂ­a"
-#: ../src/extension/internal/filter/color.h:1410
+#: ../src/extension/internal/filter/color.h:1485
msgid "Hue distribution (°)"
-msgstr ""
+msgstr "Dreifing litblÊs (°)"
-#: ../src/extension/internal/filter/color.h:1411
+#: ../src/extension/internal/filter/color.h:1486
#: ../share/extensions/svgcalendar.inx.h:19
msgid "Colors"
msgstr "Litir"
-#: ../src/extension/internal/filter/color.h:1432
+#: ../src/extension/internal/filter/color.h:1507
msgid "Replace hue by two colors"
-msgstr ""
+msgstr "Skipta Ășt litblĂŠ fyrir tvo liti"
-#: ../src/extension/internal/filter/color.h:1496
+#: ../src/extension/internal/filter/color.h:1571
msgid "Hue rotation (°)"
-msgstr ""
+msgstr "SnĂșningur litblĂŠs (°)"
-#: ../src/extension/internal/filter/color.h:1499
+#: ../src/extension/internal/filter/color.h:1574
msgid "Moonarize"
msgstr "MĂĄnalĂœsa"
-#: ../src/extension/internal/filter/color.h:1508
+#: ../src/extension/internal/filter/color.h:1583
msgid "Classic photographic solarization effect"
-msgstr ""
+msgstr "KlassĂ­sk ofurlĂœsing (sĂłlarisering) ljĂłsmynda"
-#: ../src/extension/internal/filter/color.h:1581
+#: ../src/extension/internal/filter/color.h:1656
msgid "Tritone"
-msgstr ""
+msgstr "Þrítóna"
-#: ../src/extension/internal/filter/color.h:1587
+#: ../src/extension/internal/filter/color.h:1662
msgid "Enhance hue"
-msgstr ""
+msgstr "BĂŠta litblĂŠ"
-#: ../src/extension/internal/filter/color.h:1588
+#: ../src/extension/internal/filter/color.h:1663
msgid "Phosphorescence"
-msgstr ""
+msgstr "FosfĂłrljĂłmi"
-#: ../src/extension/internal/filter/color.h:1589
+#: ../src/extension/internal/filter/color.h:1664
msgid "Colored nights"
-msgstr ""
+msgstr "Litaðar nÊtur"
-#: ../src/extension/internal/filter/color.h:1590
+#: ../src/extension/internal/filter/color.h:1665
msgid "Hue to background"
-msgstr ""
+msgstr "LitblĂŠr ĂĄ bakgrunn"
-#: ../src/extension/internal/filter/color.h:1592
+#: ../src/extension/internal/filter/color.h:1667
msgid "Global blend:"
-msgstr ""
+msgstr "VíðvÊr blöndun:"
-#: ../src/extension/internal/filter/color.h:1598
+#: ../src/extension/internal/filter/color.h:1673
msgid "Glow"
-msgstr "Glóð"
+msgstr "Bjarmi"
-#: ../src/extension/internal/filter/color.h:1599
+#: ../src/extension/internal/filter/color.h:1674
msgid "Glow blend:"
-msgstr ""
+msgstr "Blöndun bjarma"
-#: ../src/extension/internal/filter/color.h:1604
+#: ../src/extension/internal/filter/color.h:1679
msgid "Local light"
-msgstr ""
+msgstr "Staðbundin lĂœsing"
-#: ../src/extension/internal/filter/color.h:1605
+#: ../src/extension/internal/filter/color.h:1680
msgid "Global light"
-msgstr ""
+msgstr "VíðvĂŠr lĂœsing"
-#: ../src/extension/internal/filter/color.h:1608
+#: ../src/extension/internal/filter/color.h:1683
msgid "Hue distribution (°):"
-msgstr ""
+msgstr "Dreifing litblÊs (°):"
-#: ../src/extension/internal/filter/color.h:1619
+#: ../src/extension/internal/filter/color.h:1694
msgid ""
"Create a custom tritone palette with additional glow, blend modes and hue "
"moving"
@@ -7025,7 +7079,7 @@ msgstr "SnĂșa við litum"
#: ../src/extension/internal/filter/image.h:65
msgid "Detect color edges in object"
-msgstr ""
+msgstr "Finna brĂșnir lita Ă­ hlut"
#: ../src/extension/internal/filter/morphology.h:58
msgid "Cross-smooth"
@@ -7047,7 +7101,7 @@ msgstr "Opna"
#: ../src/extension/internal/filter/morphology.h:65
#: ../src/libgdl/gdl-dock-placeholder.c:167 ../src/libgdl/gdl-dock.c:191
-#: ../src/widgets/rect-toolbar.cpp:318 ../src/widgets/spray-toolbar.cpp:116
+#: ../src/widgets/rect-toolbar.cpp:317 ../src/widgets/spray-toolbar.cpp:116
#: ../src/widgets/tweak-toolbar.cpp:128
#: ../share/extensions/interp_att_g.inx.h:10
msgid "Width"
@@ -7064,7 +7118,7 @@ msgstr "Móða innihald"
#: ../src/extension/internal/filter/morphology.h:79
msgid "Smooth edges and angles of shapes"
-msgstr ""
+msgstr "MĂœkja jaðra og horn ĂĄ formum"
#: ../src/extension/internal/filter/morphology.h:166
msgid "Outline"
@@ -7148,15 +7202,15 @@ msgstr "ÓgegnsĂŠi ĂștlĂ­nu:"
#: ../src/extension/internal/filter/morphology.h:206
msgid "Adds a colorizable outline"
-msgstr ""
+msgstr "BĂŠtir við litanlegri ĂștlĂ­nu"
#: ../src/extension/internal/filter/overlays.h:56
msgid "Noise Fill"
-msgstr ""
+msgstr "Suðfylling"
#: ../src/extension/internal/filter/overlays.h:59
#: ../src/extension/internal/filter/paint.h:690
-#: ../src/extension/internal/filter/shadows.h:60 ../src/ui/dialog/find.cpp:87
+#: ../src/extension/internal/filter/shadows.h:60 ../src/ui/dialog/find.cpp:88
#: ../src/ui/dialog/tracedialog.cpp:747
#: ../share/extensions/color_HSL_adjust.inx.h:2
#: ../share/extensions/color_custom.inx.h:2
@@ -7355,11 +7409,11 @@ msgstr "LĂ­nutegund:"
#: ../src/extension/internal/filter/paint.h:587
msgid "Smoothed"
-msgstr ""
+msgstr "MĂœkt"
#: ../src/extension/internal/filter/paint.h:588
msgid "Contrasted"
-msgstr ""
+msgstr "Með auknum birtuskilum"
#: ../src/extension/internal/filter/paint.h:591
#: ../src/live_effects/lpe-jointype.cpp:51
@@ -7402,7 +7456,7 @@ msgstr ""
#: ../src/extension/internal/filter/paint.h:850
msgid "Poster Paint"
-msgstr ""
+msgstr "VeggspjaldamĂĄlning"
#: ../src/extension/internal/filter/paint.h:856
msgid "Transfer type:"
@@ -7426,11 +7480,11 @@ msgstr ""
#: ../src/extension/internal/filter/paint.h:870
msgid "Pre-saturation"
-msgstr ""
+msgstr "For-litmettun"
#: ../src/extension/internal/filter/paint.h:871
msgid "Post-saturation"
-msgstr ""
+msgstr "Eftir-litmettun"
#: ../src/extension/internal/filter/paint.h:872
msgid "Simulate antialiasing"
@@ -7454,7 +7508,7 @@ msgstr "SnjĂłtoppur"
#: ../src/extension/internal/filter/protrusions.h:50
msgid "Drift Size"
-msgstr ""
+msgstr "StÊrð snjókorna"
#: ../src/extension/internal/filter/protrusions.h:58
msgid "Snow has fallen on object"
@@ -7478,7 +7532,7 @@ msgstr "Lóðrétt hliðrun (px)"
#: ../src/extension/internal/filter/shadows.h:64
msgid "Shadow type:"
-msgstr "Skuggagerð:"
+msgstr "Gerð skugga:"
#: ../src/extension/internal/filter/shadows.h:67
msgid "Outer cutout"
@@ -7490,19 +7544,19 @@ msgstr ""
#: ../src/extension/internal/filter/shadows.h:69
msgid "Shadow only"
-msgstr ""
+msgstr "Eingöngu skuggi"
#: ../src/extension/internal/filter/shadows.h:72
msgid "Blur color"
-msgstr ""
+msgstr "Móðunarlitur"
#: ../src/extension/internal/filter/shadows.h:74
msgid "Use object's color"
-msgstr ""
+msgstr "Nota lit hlutar"
#: ../src/extension/internal/filter/shadows.h:84
msgid "Colorizable Drop shadow"
-msgstr ""
+msgstr "Litanlegur undirskuggi"
#: ../src/extension/internal/filter/textures.h:62
msgid "Ink Blot"
@@ -7582,15 +7636,15 @@ msgstr "Hamur:"
#: ../src/extension/internal/filter/transparency.h:73
msgid "Blend objects with background images or with themselves"
-msgstr ""
+msgstr "Blanda hlutum við bakgrunnmyndir eða sjålfa sig"
#: ../src/extension/internal/filter/transparency.h:130
msgid "Channel Transparency"
-msgstr ""
+msgstr "GegnsĂŠi litrĂĄsar"
#: ../src/extension/internal/filter/transparency.h:144
msgid "Replace RGB with transparency"
-msgstr ""
+msgstr "Skipta Ășt RGB með gegnsĂŠi"
#: ../src/extension/internal/filter/transparency.h:205
msgid "Light Eraser"
@@ -7641,7 +7695,7 @@ msgstr ""
msgid "Embed"
msgstr "Ívefja"
-#: ../src/extension/internal/gdkpixbuf-input.cpp:192 ../src/sp-anchor.cpp:119
+#: ../src/extension/internal/gdkpixbuf-input.cpp:192 ../src/sp-anchor.cpp:105
#: ../src/ui/dialog/inkscape-preferences.cpp:1456
msgid "Link"
msgstr "Tengill"
@@ -7765,9 +7819,9 @@ msgid "Render"
msgstr "Myndgera"
#: ../src/extension/internal/grid.cpp:223
-#: ../src/ui/dialog/document-properties.cpp:155
+#: ../src/ui/dialog/document-properties.cpp:162
#: ../src/ui/dialog/inkscape-preferences.cpp:787
-#: ../src/widgets/toolbox.cpp:1825
+#: ../src/widgets/toolbox.cpp:1827
msgid "Grids"
msgstr "Hnitanet"
@@ -7819,28 +7873,28 @@ msgstr "OpenDocument teikningarskrĂĄ"
#. more info: http://www.acrobatusers.com/tech_corners/javascript_corner/tips/2006/page_bounds/
#: ../src/extension/internal/pdfinput/pdf-input.cpp:71
msgid "media box"
-msgstr ""
+msgstr "media box"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:72
msgid "crop box"
-msgstr ""
+msgstr "crop box"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:73
msgid "trim box"
-msgstr ""
+msgstr "trim box"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:74
msgid "bleed box"
-msgstr ""
+msgstr "bleed box"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:75
msgid "art box"
-msgstr ""
+msgstr "art box"
#. Crop settings
#: ../src/extension/internal/pdfinput/pdf-input.cpp:112
msgid "Clip to:"
-msgstr ""
+msgstr "Afmarka við:"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:123
msgid "Page settings"
@@ -7848,13 +7902,15 @@ msgstr "Stillingar blaðsíðu"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:124
msgid "Precision of approximating gradient meshes:"
-msgstr ""
+msgstr "NåkvÊmni við nålgun å litstigulsmöskvum:"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:125
msgid ""
"<b>Note</b>: setting the precision too high may result in a large SVG file "
"and slow performance."
msgstr ""
+"<b>Athugið</b>: ef nĂĄkvĂŠmni er sett of mikil getur af ĂŸvĂ­ leitt að SVG skrĂĄin "
+"verði mjög stór og afköst tölvunnar minnki."
#: ../src/extension/internal/pdfinput/pdf-input.cpp:128
msgid "import via Poppler"
@@ -7876,7 +7932,7 @@ msgstr "Flytja texta inn sem texta"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:146
msgid "Replace PDF fonts by closest-named installed fonts"
-msgstr ""
+msgstr "Skipta Ășt PDF-letri með ĂŸvĂ­ uppsetta letri sem heitir lĂ­kasta nafninu"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:149
msgid "Embed images"
@@ -7916,11 +7972,11 @@ msgstr "PDF Ă­lag"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:906
msgid "Adobe PDF (*.pdf)"
-msgstr ""
+msgstr "Adobe PDF (*.pdf)"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:907
msgid "Adobe Portable Document Format"
-msgstr ""
+msgstr "Adobe Portable Document snið"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:914
msgid "AI Input"
@@ -7928,7 +7984,7 @@ msgstr "AI Ă­lag"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:919
msgid "Adobe Illustrator 9.0 and above (*.ai)"
-msgstr ""
+msgstr "Adobe Illustrator 9.0 og hĂŠrra (*.ai)"
#: ../src/extension/internal/pdfinput/pdf-input.cpp:920
msgid "Open files saved in Adobe Illustrator 9.0 and newer versions"
@@ -7940,7 +7996,7 @@ msgstr "PovRay frĂĄlag"
#: ../src/extension/internal/pov-out.cpp:720
msgid "PovRay (*.pov) (paths and shapes only)"
-msgstr ""
+msgstr "PovRay (*.pov) (einungis ferlar og form)"
#: ../src/extension/internal/pov-out.cpp:721
msgid "PovRay Raytracer File"
@@ -7956,7 +8012,7 @@ msgstr "Scalable Vector Graphic vigurteikning (*.svg)"
#: ../src/extension/internal/svg.cpp:106
msgid "Inkscape native file format and W3C standard"
-msgstr ""
+msgstr "Innbyggt snið fyrir Inkscape og staðall frå W3C"
#: ../src/extension/internal/svg.cpp:114
msgid "SVG Output Inkscape"
@@ -7980,7 +8036,7 @@ msgstr "Hreint SVG (*.svg)"
#: ../src/extension/internal/svg.cpp:134
msgid "Scalable Vector Graphics format as defined by the W3C"
-msgstr ""
+msgstr "SVG vigurteikning eins og sniðið er skilgreint af W3C"
#: ../src/extension/internal/svgz.cpp:46
msgid "SVGZ Input"
@@ -7992,7 +8048,7 @@ msgstr "Þjappað Inkscape SVG (*.svgz)"
#: ../src/extension/internal/svgz.cpp:53
msgid "SVG file format compressed with GZip"
-msgstr ""
+msgstr "SVG skrĂĄasnið ĂŸjappað með GZip"
#: ../src/extension/internal/svgz.cpp:61 ../src/extension/internal/svgz.cpp:75
msgid "SVGZ Output"
@@ -8000,7 +8056,7 @@ msgstr "SVGZ frĂĄlag"
#: ../src/extension/internal/svgz.cpp:67
msgid "Inkscape's native file format compressed with GZip"
-msgstr ""
+msgstr "Innbyggt snið fyrir Inkscape, ĂŸjappað með GZip"
#: ../src/extension/internal/svgz.cpp:80
msgid "Compressed plain SVG (*.svgz)"
@@ -8008,7 +8064,7 @@ msgstr "Þjappað hreint SVG (*.svgz)"
#: ../src/extension/internal/svgz.cpp:81
msgid "Scalable Vector Graphics format compressed with GZip"
-msgstr ""
+msgstr "SVG vigurteikningasnið ĂŸjappað með GZip"
#: ../src/extension/internal/vsd-input.cpp:301
msgid "VSD Input"
@@ -8020,7 +8076,7 @@ msgstr "Microsoft Visio skĂœringamynd (*.vsd)"
#: ../src/extension/internal/vsd-input.cpp:307
msgid "File format used by Microsoft Visio 6 and later"
-msgstr ""
+msgstr "Skråasnið notað af Microsoft Visio 6 og síðar"
#: ../src/extension/internal/vsd-input.cpp:314
msgid "VDX Input"
@@ -8032,7 +8088,7 @@ msgstr "Microsoft Visio XML skĂœringamynd (*.vdx)"
#: ../src/extension/internal/vsd-input.cpp:320
msgid "File format used by Microsoft Visio 2010 and later"
-msgstr ""
+msgstr "Skråasnið notað af Microsoft Visio 2010 og síðar"
#: ../src/extension/internal/vsd-input.cpp:327
msgid "VSDM Input"
@@ -8045,7 +8101,7 @@ msgstr "Microsoft Visio 2013 teikning (*.vsdm)"
#: ../src/extension/internal/vsd-input.cpp:333
#: ../src/extension/internal/vsd-input.cpp:346
msgid "File format used by Microsoft Visio 2013 and later"
-msgstr ""
+msgstr "Skråasnið notað af Microsoft Visio 2013 og síðar"
#: ../src/extension/internal/vsd-input.cpp:340
msgid "VSDX Input"
@@ -8055,33 +8111,33 @@ msgstr "VSDX Ă­lag"
msgid "Microsoft Visio 2013 drawing (*.vsdx)"
msgstr "Microsoft Visio 2013 teikning (*.vsdx)"
-#: ../src/extension/internal/wmf-inout.cpp:3128
+#: ../src/extension/internal/wmf-inout.cpp:3136
msgid "WMF Input"
msgstr "WMF Ă­lag"
-#: ../src/extension/internal/wmf-inout.cpp:3133
+#: ../src/extension/internal/wmf-inout.cpp:3141
msgid "Windows Metafiles (*.wmf)"
msgstr "Windows Metafile (*.wmf)"
-#: ../src/extension/internal/wmf-inout.cpp:3134
+#: ../src/extension/internal/wmf-inout.cpp:3142
msgid "Windows Metafiles"
msgstr "Windows Metafile"
-#: ../src/extension/internal/wmf-inout.cpp:3142
+#: ../src/extension/internal/wmf-inout.cpp:3150
msgid "WMF Output"
msgstr "WMF frĂĄlag"
-#: ../src/extension/internal/wmf-inout.cpp:3152
+#: ../src/extension/internal/wmf-inout.cpp:3160
msgid "Map all fill patterns to standard WMF hatches"
-msgstr ""
+msgstr "Varpa öllum fyllimynstrum yfir í staðlaðar WMF strikaskyggingar"
-#: ../src/extension/internal/wmf-inout.cpp:3156
+#: ../src/extension/internal/wmf-inout.cpp:3164
#: ../share/extensions/wmf_input.inx.h:2
#: ../share/extensions/wmf_output.inx.h:2
msgid "Windows Metafile (*.wmf)"
msgstr "Windows Metafile (*.wmf)"
-#: ../src/extension/internal/wmf-inout.cpp:3157
+#: ../src/extension/internal/wmf-inout.cpp:3165
msgid "Windows Metafile"
msgstr "Windows Metafile"
@@ -8095,7 +8151,7 @@ msgstr "WordPerfect Graphics (*.wpg)"
#: ../src/extension/internal/wpg-input.cpp:150
msgid "Vector graphics format used by Corel WordPerfect"
-msgstr ""
+msgstr "Vigurteikningasnið notað af Corel WordPerfect"
#: ../src/extension/prefdialog.cpp:276
msgid "Live preview"
@@ -8113,116 +8169,118 @@ msgstr ""
msgid "default.svg"
msgstr "sjålfgefið.svg"
-#: ../src/file.cpp:322
+#: ../src/file.cpp:328
msgid "Broken links have been changed to point to existing files."
msgstr ""
-#: ../src/file.cpp:333 ../src/file.cpp:1249
+#: ../src/file.cpp:339 ../src/file.cpp:1255
#, c-format
msgid "Failed to load the requested file %s"
msgstr ""
-#: ../src/file.cpp:359
+#: ../src/file.cpp:365
msgid "Document not saved yet. Cannot revert."
msgstr ""
-#: ../src/file.cpp:365
+#: ../src/file.cpp:371
msgid "Changes will be lost! Are you sure you want to reload document %1?"
msgstr ""
-#: ../src/file.cpp:391
+#: ../src/file.cpp:397
msgid "Document reverted."
msgstr ""
-#: ../src/file.cpp:393
+#: ../src/file.cpp:399
msgid "Document not reverted."
msgstr ""
-#: ../src/file.cpp:543
+#: ../src/file.cpp:549
msgid "Select file to open"
msgstr "Veldu skrå til að opna"
-#: ../src/file.cpp:625
+#: ../src/file.cpp:631
msgid "Clean up document"
msgstr "Hreinsa skjalið"
-#: ../src/file.cpp:632
+#: ../src/file.cpp:638
#, c-format
msgid "Removed <b>%i</b> unused definition in &lt;defs&gt;."
msgid_plural "Removed <b>%i</b> unused definitions in &lt;defs&gt;."
msgstr[0] ""
msgstr[1] ""
-#: ../src/file.cpp:637
+#: ../src/file.cpp:643
msgid "No unused definitions in &lt;defs&gt;."
msgstr ""
-#: ../src/file.cpp:669
+#: ../src/file.cpp:675
#, c-format
msgid ""
"No Inkscape extension found to save document (%s). This may have been "
"caused by an unknown filename extension."
msgstr ""
+"Fann ekki Inkscape-viðbót til að vista skjalið (%s). Það géti stafað af "
+"ĂłĂŸekktri skrĂĄarendingu."
-#: ../src/file.cpp:670 ../src/file.cpp:678 ../src/file.cpp:686
-#: ../src/file.cpp:692 ../src/file.cpp:697
+#: ../src/file.cpp:676 ../src/file.cpp:684 ../src/file.cpp:692
+#: ../src/file.cpp:698 ../src/file.cpp:703
msgid "Document not saved."
msgstr "Skjalið ekki vistað."
-#: ../src/file.cpp:677
+#: ../src/file.cpp:683
#, c-format
msgid ""
"File %s is write protected. Please remove write protection and try again."
msgstr "Skråin %s er ritvarin. Taktu ritvörnina af og reyndu aftur."
-#: ../src/file.cpp:685
+#: ../src/file.cpp:691
#, c-format
msgid "File %s could not be saved."
-msgstr "Ekki tókst að vista skråna %s"
+msgstr "Ekki tókst að vista skråna %s."
-#: ../src/file.cpp:715 ../src/file.cpp:717
+#: ../src/file.cpp:721 ../src/file.cpp:723
msgid "Document saved."
msgstr "Skjalið vistað."
#. We are saving for the first time; create a unique default filename
-#: ../src/file.cpp:860 ../src/file.cpp:1408
+#: ../src/file.cpp:866 ../src/file.cpp:1414
msgid "drawing"
msgstr "teikning"
-#: ../src/file.cpp:865
+#: ../src/file.cpp:871
msgid "drawing-%1"
msgstr "teikning-%1"
-#: ../src/file.cpp:882
+#: ../src/file.cpp:888
msgid "Select file to save a copy to"
msgstr "Veldu skrå til að vista afrit í"
-#: ../src/file.cpp:884
+#: ../src/file.cpp:890
msgid "Select file to save to"
msgstr "Veldu skrå til að vista í"
-#: ../src/file.cpp:989 ../src/file.cpp:991
+#: ../src/file.cpp:995 ../src/file.cpp:997
msgid "No changes need to be saved."
msgstr "Engar breytingar ĂŸarf að vista."
-#: ../src/file.cpp:1010
+#: ../src/file.cpp:1016
msgid "Saving document..."
-msgstr ""
+msgstr "Vista skjal..."
-#: ../src/file.cpp:1246 ../src/ui/dialog/inkscape-preferences.cpp:1450
+#: ../src/file.cpp:1252 ../src/ui/dialog/inkscape-preferences.cpp:1450
#: ../src/ui/dialog/ocaldialogs.cpp:1244
msgid "Import"
msgstr "Flytja inn"
-#: ../src/file.cpp:1296
+#: ../src/file.cpp:1302
msgid "Select file to import"
msgstr "Veldu skrå til að flytja inn"
-#: ../src/file.cpp:1429
+#: ../src/file.cpp:1435
msgid "Select file to export to"
msgstr "Veldu skrĂĄ til að flytja Ășt Ă­"
-#: ../src/file.cpp:1682
+#: ../src/file.cpp:1688
msgid "Import Clip Art"
msgstr "Flytja inn klippimynd"
@@ -8315,14 +8373,14 @@ msgstr "Mismunur"
msgid "Exclusion"
msgstr "Útilokun"
-#: ../src/filter-enums.cpp:65 ../src/ui/tools/flood-tool.cpp:196
+#: ../src/filter-enums.cpp:65 ../src/ui/tools/flood-tool.cpp:186
#: ../src/widgets/sp-color-icc-selector.cpp:336
#: ../src/widgets/sp-color-icc-selector.cpp:340
#: ../src/widgets/sp-color-scales.cpp:441
#: ../src/widgets/sp-color-scales.cpp:442 ../src/widgets/tweak-toolbar.cpp:286
#: ../share/extensions/color_randomize.inx.h:3
msgid "Hue"
-msgstr "LitblĂŠr"
+msgstr "LitblĂŠr (H)"
#: ../src/filter-enums.cpp:68
msgid "Luminosity"
@@ -8338,7 +8396,7 @@ msgstr "Metta"
#: ../src/filter-enums.cpp:80
msgid "Hue Rotate"
-msgstr ""
+msgstr "SnĂșa litblĂŠ"
#: ../src/filter-enums.cpp:81
msgid "Luminance to Alpha"
@@ -8432,53 +8490,53 @@ msgstr ""
msgid "Reverse gradient"
msgstr ""
-#: ../src/gradient-chemistry.cpp:1619 ../src/widgets/gradient-selector.cpp:227
+#: ../src/gradient-chemistry.cpp:1619 ../src/widgets/gradient-selector.cpp:222
msgid "Delete swatch"
msgstr ""
-#: ../src/gradient-drag.cpp:97 ../src/ui/tools/gradient-tool.cpp:100
+#: ../src/gradient-drag.cpp:97 ../src/ui/tools/gradient-tool.cpp:90
msgid "Linear gradient <b>start</b>"
-msgstr ""
+msgstr "<b>Upphaf</b> lĂ­nulegs litstiguls"
#. POINT_LG_BEGIN
-#: ../src/gradient-drag.cpp:98 ../src/ui/tools/gradient-tool.cpp:101
+#: ../src/gradient-drag.cpp:98 ../src/ui/tools/gradient-tool.cpp:91
msgid "Linear gradient <b>end</b>"
-msgstr ""
+msgstr "<b>Endir</b> lĂ­nulegs litstiguls"
-#: ../src/gradient-drag.cpp:99 ../src/ui/tools/gradient-tool.cpp:102
+#: ../src/gradient-drag.cpp:99 ../src/ui/tools/gradient-tool.cpp:92
msgid "Linear gradient <b>mid stop</b>"
-msgstr ""
+msgstr "<b>Miðjumerki</b> línulegs litstiguls"
-#: ../src/gradient-drag.cpp:100 ../src/ui/tools/gradient-tool.cpp:103
+#: ../src/gradient-drag.cpp:100 ../src/ui/tools/gradient-tool.cpp:93
msgid "Radial gradient <b>center</b>"
-msgstr ""
+msgstr "<b>Miðja</b> hringlaga litstiguls"
#: ../src/gradient-drag.cpp:101 ../src/gradient-drag.cpp:102
-#: ../src/ui/tools/gradient-tool.cpp:104 ../src/ui/tools/gradient-tool.cpp:105
+#: ../src/ui/tools/gradient-tool.cpp:94 ../src/ui/tools/gradient-tool.cpp:95
msgid "Radial gradient <b>radius</b>"
-msgstr ""
+msgstr "<b>RadĂ­us</b> hringlaga litstiguls"
-#: ../src/gradient-drag.cpp:103 ../src/ui/tools/gradient-tool.cpp:106
+#: ../src/gradient-drag.cpp:103 ../src/ui/tools/gradient-tool.cpp:96
msgid "Radial gradient <b>focus</b>"
-msgstr ""
+msgstr "<b>Brennipunktur</b> hringlaga litstiguls"
#. POINT_RG_FOCUS
#: ../src/gradient-drag.cpp:104 ../src/gradient-drag.cpp:105
-#: ../src/ui/tools/gradient-tool.cpp:107 ../src/ui/tools/gradient-tool.cpp:108
+#: ../src/ui/tools/gradient-tool.cpp:97 ../src/ui/tools/gradient-tool.cpp:98
msgid "Radial gradient <b>mid stop</b>"
-msgstr ""
+msgstr "<b>Miðjumerki</b> hringlaga litstiguls"
-#: ../src/gradient-drag.cpp:106 ../src/ui/tools/mesh-tool.cpp:103
+#: ../src/gradient-drag.cpp:106 ../src/ui/tools/mesh-tool.cpp:93
msgid "Mesh gradient <b>corner</b>"
-msgstr ""
+msgstr "<b>Horn</b> litstigulsmöskva"
-#: ../src/gradient-drag.cpp:107 ../src/ui/tools/mesh-tool.cpp:104
+#: ../src/gradient-drag.cpp:107 ../src/ui/tools/mesh-tool.cpp:94
msgid "Mesh gradient <b>handle</b>"
-msgstr ""
+msgstr "<b>Haldfang</b> litstigulsmöskva"
-#: ../src/gradient-drag.cpp:108 ../src/ui/tools/mesh-tool.cpp:105
+#: ../src/gradient-drag.cpp:108 ../src/ui/tools/mesh-tool.cpp:95
msgid "Mesh gradient <b>tensor</b>"
-msgstr ""
+msgstr "<b>Strekkjari</b> litstigulsmöskva"
#: ../src/gradient-drag.cpp:567
msgid "Added patch row or column"
@@ -8486,16 +8544,16 @@ msgstr ""
#: ../src/gradient-drag.cpp:799
msgid "Merge gradient handles"
-msgstr ""
+msgstr "Sameina litstigulshaldföng"
#. we did an undoable action
#: ../src/gradient-drag.cpp:1105
msgid "Move gradient handle"
-msgstr ""
+msgstr "FĂŠra litstigulshaldfang"
#: ../src/gradient-drag.cpp:1164 ../src/widgets/gradient-vector.cpp:827
msgid "Delete gradient stop"
-msgstr ""
+msgstr "Eyða stoppmerki í litstigli"
#: ../src/gradient-drag.cpp:1427
#, c-format
@@ -8534,15 +8592,15 @@ msgstr[1] ""
#: ../src/gradient-drag.cpp:2378
msgid "Move gradient handle(s)"
-msgstr ""
+msgstr "FÊra litstigulshaldföng"
#: ../src/gradient-drag.cpp:2414
msgid "Move gradient mid stop(s)"
-msgstr ""
+msgstr "FÊra miðjumerki litstiguls"
#: ../src/gradient-drag.cpp:2703
msgid "Delete gradient stop(s)"
-msgstr ""
+msgstr "Eyða stoppmerkjum í litstigli"
#: ../src/inkscape.cpp:246
msgid "Autosave failed! Cannot create directory %1."
@@ -8559,11 +8617,12 @@ msgstr "SjĂĄlfvirk vistun skjala..."
#: ../src/inkscape.cpp:339
msgid "Autosave failed! Could not find inkscape extension to save document."
msgstr ""
+"Sjålfvirk vistun mistókst! Fann ekki Inkscape-viðbót til að vista skjalið."
#: ../src/inkscape.cpp:342 ../src/inkscape.cpp:349
#, c-format
msgid "Autosave failed! File %s could not be saved."
-msgstr ""
+msgstr "Sjålfvirk vistun mistókst! Ekki tókst að vista skråna %s."
#: ../src/inkscape.cpp:364
msgid "Autosave complete."
@@ -8590,7 +8649,7 @@ msgstr ""
#: ../src/knot.cpp:346
msgid "Node or handle drag canceled."
-msgstr ""
+msgstr "HĂŠtt við drĂĄtt ĂĄ haldfangi eða hnĂșt."
#: ../src/knotholder.cpp:170
msgid "Change handle"
@@ -8611,7 +8670,7 @@ msgstr ""
#: ../src/knotholder.cpp:284 ../src/knotholder.cpp:306
msgid "<b>Rotate</b> the pattern fill; with <b>Ctrl</b> to snap angle"
-msgstr ""
+msgstr "<b>SnĂșa</b> mynsturfyllingu; með <b>Ctrl</b> til að ĂŸrepa horn"
#: ../src/libgdl/gdl-dock-bar.c:105
msgid "Master"
@@ -8647,7 +8706,7 @@ msgid "Dockitem which 'owns' this grip"
msgstr ""
#. Name
-#: ../src/libgdl/gdl-dock-item.c:298 ../src/widgets/ruler.cpp:191
+#: ../src/libgdl/gdl-dock-item.c:298 ../src/widgets/ruler.cpp:192
#: ../src/widgets/text-toolbar.cpp:1405
#: ../share/extensions/gcodetools_graffiti.inx.h:9
#: ../share/extensions/gcodetools_orientation_points.inx.h:2
@@ -8778,7 +8837,7 @@ msgstr ""
#: ../src/libgdl/gdl-dock-notebook.c:132
#: ../src/ui/dialog/align-and-distribute.cpp:1002
-#: ../src/ui/dialog/document-properties.cpp:153
+#: ../src/ui/dialog/document-properties.cpp:160
#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1537
#: ../src/widgets/desktop-widget.cpp:1992
#: ../share/extensions/empty_page.inx.h:1
@@ -8794,7 +8853,7 @@ msgstr ""
#: ../src/live_effects/parameter/originalpatharray.cpp:86
#: ../src/ui/dialog/inkscape-preferences.cpp:1511
#: ../src/ui/widget/page-sizer.cpp:258
-#: ../src/widgets/gradient-selector.cpp:140
+#: ../src/widgets/gradient-selector.cpp:150
#: ../src/widgets/sp-xmlview-attr-list.cpp:49
msgid "Name"
msgstr "Heiti"
@@ -8805,7 +8864,7 @@ msgstr ""
#: ../src/libgdl/gdl-dock-object.c:133
msgid "Long name"
-msgstr ""
+msgstr "Langt heiti"
#: ../src/libgdl/gdl-dock-object.c:134
msgid "Human readable name for the dock object"
@@ -8860,7 +8919,7 @@ msgid ""
"Attempt to bind to %p an already bound dock object %p (current master: %p)"
msgstr ""
-#: ../src/libgdl/gdl-dock-paned.c:130 ../src/widgets/ruler.cpp:229
+#: ../src/libgdl/gdl-dock-paned.c:130 ../src/widgets/ruler.cpp:230
msgid "Position"
msgstr "Staðsetning"
@@ -8951,7 +9010,7 @@ msgstr ""
#: ../src/libgdl/gdl-dock.c:176 ../src/ui/dialog/inkscape-preferences.cpp:642
#: ../src/ui/dialog/inkscape-preferences.cpp:685
msgid "Floating"
-msgstr ""
+msgstr "FljĂłtandi"
#: ../src/libgdl/gdl-dock.c:177
msgid "Whether the dock is floating in its own window"
@@ -9000,12 +9059,12 @@ msgstr ""
#: ../src/live_effects/effect.cpp:100
msgid "Angle bisector"
-msgstr ""
+msgstr "HelmingalĂ­na horns"
#. TRANSLATORS: boolean operations
#: ../src/live_effects/effect.cpp:102
msgid "Boolops"
-msgstr ""
+msgstr "BĂłlskar lykkjur"
#: ../src/live_effects/effect.cpp:103
msgid "Circle (by center and radius)"
@@ -9017,15 +9076,15 @@ msgstr "Hringur af ĂŸremur punktum"
#: ../src/live_effects/effect.cpp:105
msgid "Dynamic stroke"
-msgstr ""
+msgstr "Breytileg stroka"
#: ../src/live_effects/effect.cpp:106 ../share/extensions/extrude.inx.h:1
msgid "Extrude"
-msgstr ""
+msgstr "Pressa Ășt"
#: ../src/live_effects/effect.cpp:107
msgid "Lattice Deformation"
-msgstr ""
+msgstr "Afmyndun grindar"
#: ../src/live_effects/effect.cpp:108
msgid "Line Segment"
@@ -9033,7 +9092,7 @@ msgstr "LĂ­nubĂștur"
#: ../src/live_effects/effect.cpp:109
msgid "Mirror symmetry"
-msgstr ""
+msgstr "Samhverfa speglunar"
#: ../src/live_effects/effect.cpp:111
msgid "Parallel"
@@ -9041,36 +9100,36 @@ msgstr "Samhliða"
#: ../src/live_effects/effect.cpp:112
msgid "Path length"
-msgstr ""
+msgstr "Lengd ferils"
#: ../src/live_effects/effect.cpp:113
msgid "Perpendicular bisector"
-msgstr ""
+msgstr "Hornrétt helmingaskipting"
#: ../src/live_effects/effect.cpp:114
msgid "Perspective path"
-msgstr ""
+msgstr "FjarvĂ­ddarferill"
#: ../src/live_effects/effect.cpp:115
msgid "Rotate copies"
-msgstr ""
+msgstr "SnĂșa afritum"
#: ../src/live_effects/effect.cpp:116
msgid "Recursive skeleton"
-msgstr ""
+msgstr "EndurkvĂŠm grind"
#: ../src/live_effects/effect.cpp:117
msgid "Tangent to curve"
-msgstr ""
+msgstr "Tangens ĂĄ feril"
#: ../src/live_effects/effect.cpp:118
msgid "Text label"
-msgstr ""
+msgstr "TextalĂœsing"
#. 0.46
#: ../src/live_effects/effect.cpp:121
msgid "Bend"
-msgstr ""
+msgstr "Beygja"
#: ../src/live_effects/effect.cpp:122
msgid "Gears"
@@ -9078,12 +9137,12 @@ msgstr "GĂ­rhjĂłl"
#: ../src/live_effects/effect.cpp:123
msgid "Pattern Along Path"
-msgstr ""
+msgstr "Mynstur eftir ferli"
#. for historic reasons, this effect is called skeletal(strokes) in Inkscape:SVG
#: ../src/live_effects/effect.cpp:124
msgid "Stitch Sub-Paths"
-msgstr ""
+msgstr "Sauma saman undirferla"
#. 0.47
#: ../src/live_effects/effect.cpp:126
@@ -9092,23 +9151,23 @@ msgstr "VonKoch"
#: ../src/live_effects/effect.cpp:127
msgid "Knot"
-msgstr ""
+msgstr "HnĂștur"
#: ../src/live_effects/effect.cpp:128
msgid "Construct grid"
-msgstr ""
+msgstr "Stoðnet"
#: ../src/live_effects/effect.cpp:129
msgid "Spiro spline"
-msgstr ""
+msgstr "Spiro-splĂ­na"
#: ../src/live_effects/effect.cpp:130
msgid "Envelope Deformation"
-msgstr ""
+msgstr "Afmyndun umgjarðar"
#: ../src/live_effects/effect.cpp:131
msgid "Interpolate Sub-Paths"
-msgstr ""
+msgstr "BrĂșun undirferla"
#: ../src/live_effects/effect.cpp:132
msgid "Hatches (rough)"
@@ -9158,7 +9217,7 @@ msgstr ""
msgid "Fill between strokes"
msgstr ""
-#: ../src/live_effects/effect.cpp:147 ../src/selection-chemistry.cpp:2926
+#: ../src/live_effects/effect.cpp:147 ../src/selection-chemistry.cpp:2916
msgid "Fill between many"
msgstr ""
@@ -9176,7 +9235,7 @@ msgstr ""
#: ../src/live_effects/effect.cpp:153
msgid "Perspective/Envelope"
-msgstr ""
+msgstr "Fjarvídd/Umgjörð"
#: ../src/live_effects/effect.cpp:154
msgid "Fillet/Chamfer"
@@ -9188,7 +9247,7 @@ msgstr ""
#: ../src/live_effects/effect.cpp:362
msgid "Is visible?"
-msgstr ""
+msgstr "SĂœnilegt?"
#: ../src/live_effects/effect.cpp:362
msgid ""
@@ -9198,7 +9257,7 @@ msgstr ""
#: ../src/live_effects/effect.cpp:384
msgid "No effect"
-msgstr ""
+msgstr "Engin brella"
#: ../src/live_effects/effect.cpp:492
#, c-format
@@ -9208,7 +9267,7 @@ msgstr ""
#: ../src/live_effects/effect.cpp:759
#, c-format
msgid "Editing parameter <b>%s</b>."
-msgstr ""
+msgstr "Viðfang breytingar <b>%s</b>."
#: ../src/live_effects/effect.cpp:764
msgid "None of the applied path effect's parameters can be edited on-canvas."
@@ -9292,7 +9351,7 @@ msgstr "_Breidd:"
#: ../src/live_effects/lpe-bendpath.cpp:54
msgid "Width of the path"
-msgstr ""
+msgstr "Breidd ferilsins"
#: ../src/live_effects/lpe-bendpath.cpp:55
msgid "W_idth in units of length"
@@ -9331,47 +9390,50 @@ msgstr ""
msgid "Uses the visual bounding box"
msgstr "Notar myndrÊna umgjörð"
-#. initialise your parameters here:
-#. testpointA(_("Test Point A"), _("Test A"), "ptA", &wr, this,
-#. Geom::Point(100,100)),
-#: ../src/live_effects/lpe-bspline.cpp:60
+#: ../src/live_effects/lpe-bspline.cpp:57
msgid "Steps with CTRL:"
msgstr ""
-#: ../src/live_effects/lpe-bspline.cpp:60
+#: ../src/live_effects/lpe-bspline.cpp:57
msgid "Change number of steps with CTRL pressed"
msgstr ""
-#: ../src/live_effects/lpe-bspline.cpp:61
+#: ../src/live_effects/lpe-bspline.cpp:58
+#: ../src/live_effects/lpe-simplify.cpp:33
+msgid "Helper size:"
+msgstr ""
+
+#: ../src/live_effects/lpe-bspline.cpp:58
+#: ../src/live_effects/lpe-simplify.cpp:33
+msgid "Helper size"
+msgstr ""
+
+#: ../src/live_effects/lpe-bspline.cpp:59
msgid "Ignore cusp nodes"
msgstr "Hunsa frjĂĄlsa hnĂșta"
-#: ../src/live_effects/lpe-bspline.cpp:61
+#: ../src/live_effects/lpe-bspline.cpp:59
msgid "Change ignoring cusp nodes"
msgstr ""
-#: ../src/live_effects/lpe-bspline.cpp:62
+#: ../src/live_effects/lpe-bspline.cpp:60
#: ../src/live_effects/lpe-fillet-chamfer.cpp:57
msgid "Change only selected nodes"
msgstr ""
-#: ../src/live_effects/lpe-bspline.cpp:63
-msgid "Show helper paths"
-msgstr ""
-
-#: ../src/live_effects/lpe-bspline.cpp:64
+#: ../src/live_effects/lpe-bspline.cpp:61
msgid "Change weight:"
msgstr ""
-#: ../src/live_effects/lpe-bspline.cpp:64
+#: ../src/live_effects/lpe-bspline.cpp:61
msgid "Change weight of the effect"
msgstr ""
-#: ../src/live_effects/lpe-bspline.cpp:291
+#: ../src/live_effects/lpe-bspline.cpp:290
msgid "Default weight"
msgstr ""
-#: ../src/live_effects/lpe-bspline.cpp:296
+#: ../src/live_effects/lpe-bspline.cpp:295
msgid "Make cusp"
msgstr ""
@@ -9592,7 +9654,7 @@ msgstr "MĂŠlieining:"
#. initialise your parameters here:
#: ../src/live_effects/lpe-fillet-chamfer.cpp:60
#: ../src/live_effects/lpe-roughen.cpp:39 ../src/live_effects/lpe-ruler.cpp:42
-#: ../src/widgets/ruler.cpp:201
+#: ../src/widgets/ruler.cpp:202
msgid "Unit"
msgstr "Eining"
@@ -9747,7 +9809,7 @@ msgstr "Hornskeyting"
#: ../src/live_effects/lpe-jointype.cpp:34
#: ../src/live_effects/lpe-taperstroke.cpp:65
-#: ../src/widgets/gradient-toolbar.cpp:1115
+#: ../src/widgets/gradient-toolbar.cpp:1118
msgid "Reflected"
msgstr "Endurkastað"
@@ -9892,202 +9954,294 @@ msgid "Control handle 0:"
msgstr "StjĂłrnhaldfang 0:"
#: ../src/live_effects/lpe-lattice2.cpp:47
-msgid "Control handle 0 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 0 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 0 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
+msgstr ""
+"Stjórnhaldfang 0 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:48
msgid "Control handle 1:"
msgstr "StjĂłrnhaldfang 1:"
#: ../src/live_effects/lpe-lattice2.cpp:48
-msgid "Control handle 1 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 1 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 1 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
+msgstr ""
+"Stjórnhaldfang 1 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:49
msgid "Control handle 2:"
msgstr "StjĂłrnhaldfang 2:"
#: ../src/live_effects/lpe-lattice2.cpp:49
-msgid "Control handle 2 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 2 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 2 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
+msgstr ""
+"Stjórnhaldfang 2 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:50
msgid "Control handle 3:"
msgstr "StjĂłrnhaldfang 3:"
#: ../src/live_effects/lpe-lattice2.cpp:50
-msgid "Control handle 3 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 3 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 3 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
+msgstr ""
+"Stjórnhaldfang 3 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:51
msgid "Control handle 4:"
msgstr "StjĂłrnhaldfang 4:"
#: ../src/live_effects/lpe-lattice2.cpp:51
-msgid "Control handle 4 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 4 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 4 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
+msgstr ""
+"Stjórnhaldfang 4 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:52
msgid "Control handle 5:"
msgstr "StjĂłrnhaldfang 5:"
#: ../src/live_effects/lpe-lattice2.cpp:52
-msgid "Control handle 5 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 5 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 5 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
+msgstr ""
+"Stjórnhaldfang 5 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:53
msgid "Control handle 6:"
msgstr "StjĂłrnhaldfang 6:"
#: ../src/live_effects/lpe-lattice2.cpp:53
-msgid "Control handle 6 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 6 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 6 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
+msgstr ""
+"Stjórnhaldfang 6 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:54
msgid "Control handle 7:"
msgstr "StjĂłrnhaldfang 7:"
#: ../src/live_effects/lpe-lattice2.cpp:54
-msgid "Control handle 7 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 7 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 7 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
+msgstr ""
+"Stjórnhaldfang 7 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:55
msgid "Control handle 8x9:"
msgstr "StjĂłrnhaldfang 8x9:"
#: ../src/live_effects/lpe-lattice2.cpp:55
-msgid "Control handle 8x9 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 8x9 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 8x9 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 8x9 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:56
msgid "Control handle 10x11:"
msgstr "StjĂłrnhaldfang 10x11:"
#: ../src/live_effects/lpe-lattice2.cpp:56
-msgid "Control handle 10x11 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 10x11 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 10x11 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 10x11 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</"
+"b>: fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:57
msgid "Control handle 12:"
msgstr "StjĂłrnhaldfang 12:"
#: ../src/live_effects/lpe-lattice2.cpp:57
-msgid "Control handle 12 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 12 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 12 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 12 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:58
msgid "Control handle 13:"
msgstr "StjĂłrnhaldfang 13:"
#: ../src/live_effects/lpe-lattice2.cpp:58
-msgid "Control handle 13 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 13 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 13 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 13 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:59
msgid "Control handle 14:"
msgstr "StjĂłrnhaldfang 14:"
#: ../src/live_effects/lpe-lattice2.cpp:59
-msgid "Control handle 14 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 14 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 14 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 14 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:60
msgid "Control handle 15:"
msgstr "StjĂłrnhaldfang 15:"
#: ../src/live_effects/lpe-lattice2.cpp:60
-msgid "Control handle 15 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 15 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 15 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 15 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:61
msgid "Control handle 16:"
msgstr "StjĂłrnhaldfang 16:"
#: ../src/live_effects/lpe-lattice2.cpp:61
-msgid "Control handle 16 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 16 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 16 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 16 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:62
msgid "Control handle 17:"
msgstr "StjĂłrnhaldfang 17:"
#: ../src/live_effects/lpe-lattice2.cpp:62
-msgid "Control handle 17 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 17 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 17 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 17 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:63
msgid "Control handle 18:"
msgstr "StjĂłrnhaldfang 18:"
#: ../src/live_effects/lpe-lattice2.cpp:63
-msgid "Control handle 18 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 18 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 18 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 18 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:64
msgid "Control handle 19:"
msgstr "StjĂłrnhaldfang 19:"
#: ../src/live_effects/lpe-lattice2.cpp:64
-msgid "Control handle 19 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 19 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 19 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 19 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:65
msgid "Control handle 20x21:"
msgstr "StjĂłrnhaldfang 20x21:"
#: ../src/live_effects/lpe-lattice2.cpp:65
-msgid "Control handle 20x21 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 20x21 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 20x21 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 20x21 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</"
+"b>: fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:66
msgid "Control handle 22x23:"
msgstr "StjĂłrnhaldfang 22x23:"
#: ../src/live_effects/lpe-lattice2.cpp:66
-msgid "Control handle 22x23 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 22x23 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 22x23 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 22x23 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</"
+"b>: fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:67
msgid "Control handle 24x26:"
msgstr "StjĂłrnhaldfang 24x26:"
#: ../src/live_effects/lpe-lattice2.cpp:67
-msgid "Control handle 24x26 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 24x26 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 24x26 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 24x26 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</"
+"b>: fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:68
msgid "Control handle 25x27:"
msgstr "StjĂłrnhaldfang 25x27:"
#: ../src/live_effects/lpe-lattice2.cpp:68
-msgid "Control handle 25x27 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 25x27 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 25x27 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 25x27 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</"
+"b>: fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:69
msgid "Control handle 28x30:"
msgstr "StjĂłrnhaldfang 28x30:"
#: ../src/live_effects/lpe-lattice2.cpp:69
-msgid "Control handle 28x30 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 28x30 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 28x30 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 28x30 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</"
+"b>: fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:70
msgid "Control handle 29x31:"
msgstr "StjĂłrnhaldfang 29x31:"
#: ../src/live_effects/lpe-lattice2.cpp:70
-msgid "Control handle 29x31 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 29x31 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 29x31 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along "
+"axes"
+msgstr ""
+"Stjórnhaldfang 29x31 - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</"
+"b>: fÊra meðfram åsum"
#: ../src/live_effects/lpe-lattice2.cpp:71
msgid "Control handle 32x33x34x35:"
msgstr "StjĂłrnhaldfang 32x33x34x35:"
#: ../src/live_effects/lpe-lattice2.cpp:71
-msgid "Control handle 32x33x34x35 - Ctrl+Alt+Click to reset"
-msgstr "Stjórnhaldfang 32x33x34x35 - Ctrl+Alt+Smella til að frumstilla"
+msgid ""
+"Control handle 32x33x34x35 - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move "
+"along axes"
+msgstr ""
+"Stjórnhaldfang 32x33x34x35 - <b>Ctrl+Alt+Click</b>: til að frumstilla, "
+"<b>Ctrl</b>: fÊra meðfram åsum"
-#: ../src/live_effects/lpe-lattice2.cpp:221
+#: ../src/live_effects/lpe-lattice2.cpp:224
msgid "Reset grid"
msgstr ""
@@ -10129,7 +10283,7 @@ msgstr ""
#: ../src/live_effects/lpe-patternalongpath.cpp:62
msgid "Width of the pattern"
-msgstr ""
+msgstr "Breidd mynstursins"
#: ../src/live_effects/lpe-patternalongpath.cpp:63
msgid "Wid_th in units of length"
@@ -10191,7 +10345,7 @@ msgstr "FjarvĂ­dd"
#: ../src/live_effects/lpe-perspective-envelope.cpp:38
msgid "Envelope deformation"
-msgstr ""
+msgstr "Afmyndun umgjarðar"
#. initialise your parameters here:
#: ../src/live_effects/lpe-perspective-envelope.cpp:46
@@ -10200,43 +10354,51 @@ msgstr "Tegund"
#: ../src/live_effects/lpe-perspective-envelope.cpp:46
msgid "Select the type of deformation"
-msgstr ""
+msgstr "Veldu tegund afmyndunar"
#: ../src/live_effects/lpe-perspective-envelope.cpp:47
msgid "Top Left"
msgstr "Uppi til vinstri"
#: ../src/live_effects/lpe-perspective-envelope.cpp:47
-msgid "Top Left - Ctrl+Alt+Click to reset"
-msgstr "Uppi til vinstri - Ctrl+Alt+Smella til að frumstilla"
+msgid "Top Left - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
+msgstr ""
+"Uppi til vinstri - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-perspective-envelope.cpp:48
msgid "Top Right"
msgstr "Uppi til hĂŠgri"
#: ../src/live_effects/lpe-perspective-envelope.cpp:48
-msgid "Top Right - Ctrl+Alt+Click to reset"
-msgstr "Uppi til hÊgri - Ctrl+Alt+Smella til að frumstilla"
+msgid "Top Right - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
+msgstr ""
+"Uppi til hÊgri - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-perspective-envelope.cpp:49
msgid "Down Left"
msgstr "Niðri til vinstri"
#: ../src/live_effects/lpe-perspective-envelope.cpp:49
-msgid "Down Left - Ctrl+Alt+Click to reset"
-msgstr "Niðri til vinstri - Ctrl+Alt+Smella til að frumstilla"
+msgid "Down Left - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
+msgstr ""
+"Niðri til vinstri - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-perspective-envelope.cpp:50
msgid "Down Right"
msgstr "Niðri til hÊgri"
#: ../src/live_effects/lpe-perspective-envelope.cpp:50
-msgid "Down Right - Ctrl+Alt+Click to reset"
-msgstr "Niðri til hÊgri - Ctrl+Alt+Smella til að frumstilla"
+msgid "Down Right - <b>Ctrl+Alt+Click</b>: reset, <b>Ctrl</b>: move along axes"
+msgstr ""
+"Niðri til hÊgri - <b>Ctrl+Alt+Click</b>: til að frumstilla, <b>Ctrl</b>: "
+"fÊra meðfram åsum"
#: ../src/live_effects/lpe-perspective-envelope.cpp:257
msgid "Handles:"
-msgstr ""
+msgstr "Haldföng:"
#: ../src/live_effects/lpe-powerstroke.cpp:193
msgid "CubicBezierSmooth"
@@ -10290,7 +10452,7 @@ msgstr ""
#: ../src/live_effects/lpe-powerstroke.cpp:244
#: ../src/widgets/stroke-style.cpp:278
msgid "Maximum length of the miter (in units of stroke width)"
-msgstr ""
+msgstr "HĂĄmarkslengd hornskeytingar (Ă­ einingum lĂ­nubreiddar)"
#: ../src/live_effects/lpe-powerstroke.cpp:245
msgid "End cap:"
@@ -10486,7 +10648,7 @@ msgstr "Aðferð"
#: ../src/live_effects/lpe-roughen.cpp:40
msgid "Division method"
-msgstr ""
+msgstr "Aðferð við deilingu"
#: ../src/live_effects/lpe-roughen.cpp:42
msgid "Max. segment size"
@@ -10629,7 +10791,7 @@ msgstr ""
#: ../src/live_effects/lpe-show_handles.cpp:25
msgid "Show nodes"
-msgstr ""
+msgstr "SĂœna hnĂșta"
#: ../src/live_effects/lpe-show_handles.cpp:27
msgid "Show path"
@@ -10651,55 +10813,55 @@ msgid ""
"you are applying it to. If this is not what you want, click Cancel."
msgstr ""
-#: ../src/live_effects/lpe-simplify.cpp:29
+#: ../src/live_effects/lpe-simplify.cpp:30
msgid "Steps:"
msgstr "Þrep:"
-#: ../src/live_effects/lpe-simplify.cpp:29
+#: ../src/live_effects/lpe-simplify.cpp:30
msgid "Change number of simplify steps "
msgstr ""
-#: ../src/live_effects/lpe-simplify.cpp:30
+#: ../src/live_effects/lpe-simplify.cpp:31
msgid "Roughly threshold:"
msgstr ""
-#: ../src/live_effects/lpe-simplify.cpp:31
-msgid "Helper size:"
+#: ../src/live_effects/lpe-simplify.cpp:32
+msgid "Smooth angles:"
msgstr ""
-#: ../src/live_effects/lpe-simplify.cpp:31
-msgid "Helper size"
+#: ../src/live_effects/lpe-simplify.cpp:32
+msgid "Max degree difference on handles to preform a smooth"
msgstr ""
-#: ../src/live_effects/lpe-simplify.cpp:32
+#: ../src/live_effects/lpe-simplify.cpp:34
msgid "Helper nodes"
-msgstr ""
+msgstr "HjĂĄlparhnĂștar"
-#: ../src/live_effects/lpe-simplify.cpp:32
+#: ../src/live_effects/lpe-simplify.cpp:34
msgid "Show helper nodes"
-msgstr ""
+msgstr "SĂœna hjĂĄlparhnĂșta"
-#: ../src/live_effects/lpe-simplify.cpp:34
+#: ../src/live_effects/lpe-simplify.cpp:36
msgid "Helper handles"
-msgstr ""
+msgstr "Hjålparhaldföng"
-#: ../src/live_effects/lpe-simplify.cpp:34
+#: ../src/live_effects/lpe-simplify.cpp:36
msgid "Show helper handles"
-msgstr ""
+msgstr "SĂœna hjĂĄlparhaldföng"
-#: ../src/live_effects/lpe-simplify.cpp:36
+#: ../src/live_effects/lpe-simplify.cpp:38
msgid "Paths separately"
msgstr ""
-#: ../src/live_effects/lpe-simplify.cpp:36
+#: ../src/live_effects/lpe-simplify.cpp:38
msgid "Simplifying paths (separately)"
msgstr ""
-#: ../src/live_effects/lpe-simplify.cpp:38
+#: ../src/live_effects/lpe-simplify.cpp:40
msgid "Just coalesce"
msgstr ""
-#: ../src/live_effects/lpe-simplify.cpp:38
+#: ../src/live_effects/lpe-simplify.cpp:40
msgid "Simplify just coalesce"
msgstr ""
@@ -10996,7 +11158,7 @@ msgid "Select original"
msgstr "Velja upprunalegt"
#: ../src/live_effects/parameter/originalpatharray.cpp:94
-#: ../src/widgets/gradient-toolbar.cpp:1202
+#: ../src/widgets/gradient-toolbar.cpp:1205
msgid "Reverse"
msgstr "SnĂșa við"
@@ -11011,12 +11173,12 @@ msgid "Remove Path"
msgstr "FjarlÊgja slóð"
#: ../src/live_effects/parameter/originalpatharray.cpp:183
-#: ../src/ui/dialog/objects.cpp:1847
+#: ../src/ui/dialog/objects.cpp:1823
msgid "Move Down"
msgstr "FÊra niður"
#: ../src/live_effects/parameter/originalpatharray.cpp:195
-#: ../src/ui/dialog/objects.cpp:1862
+#: ../src/ui/dialog/objects.cpp:1831
msgid "Move Up"
msgstr "FĂŠra upp"
@@ -11056,8 +11218,7 @@ msgstr ""
msgid "Paste path parameter"
msgstr ""
-#: ../src/live_effects/parameter/point.cpp:89
-#: ../src/live_effects/parameter/pointreseteable.cpp:103
+#: ../src/live_effects/parameter/point.cpp:103
msgid "Change point parameter"
msgstr ""
@@ -11223,14 +11384,16 @@ msgstr ""
#: ../src/main.cpp:392
msgid "Export document to plain SVG file (no sodipodi or inkscape namespaces)"
msgstr ""
+"Flytja skjal Ășt sem venjulega SVG-skrĂĄ (ekki sodipodi eða inkscape "
+"nafnaskilgreiningar)"
#: ../src/main.cpp:397
msgid "Export document to a PS file"
-msgstr ""
+msgstr "Flytja skjal Ășt sem PS-skrĂĄ"
#: ../src/main.cpp:402
msgid "Export document to an EPS file"
-msgstr ""
+msgstr "Flytja skjal Ășt sem EPS-skrĂĄ"
#: ../src/main.cpp:407
msgid ""
@@ -11244,7 +11407,7 @@ msgstr "PS stig"
#: ../src/main.cpp:413
msgid "Export document to a PDF file"
-msgstr ""
+msgstr "Flytja skjal Ășt sem PDF-skrĂĄ"
#. TRANSLATORS: "--export-pdf-version" is an Inkscape command line option; see "inkscape --help"
#: ../src/main.cpp:419
@@ -11266,7 +11429,7 @@ msgstr ""
#: ../src/main.cpp:429
msgid "Export document to an Enhanced Metafile (EMF) File"
-msgstr ""
+msgstr "Flytja skjal Ășt sem Enhanced Metafile (EMF)"
#: ../src/main.cpp:434
msgid "Export document to a Windows Metafile (WMF) File"
@@ -11412,7 +11575,7 @@ msgstr "_Birtingarhamur"
#. " <verb verb-id=\"DialogPrintColorsPreview\" />\n"
#: ../src/menus-skeleton.h:121
msgid "_Color display mode"
-msgstr ""
+msgstr "_Litbirtingarhamur"
#. Better location in menu needs to be found
#. " <verb verb-id=\"ViewColorModePrintColorsPreview\" radio=\"yes\"/>\n"
@@ -11433,7 +11596,7 @@ msgstr "_Hlutur"
#: ../src/menus-skeleton.h:189
msgid "Cli_p"
-msgstr "_Klemma"
+msgstr "_Afmarka"
#: ../src/menus-skeleton.h:193
msgid "Mas_k"
@@ -11447,7 +11610,7 @@ msgstr "_Mynstur"
msgid "_Path"
msgstr "_Ferill"
-#: ../src/menus-skeleton.h:249 ../src/ui/dialog/find.cpp:77
+#: ../src/menus-skeleton.h:249 ../src/ui/dialog/find.cpp:78
#: ../src/ui/dialog/text-edit.cpp:71
msgid "_Text"
msgstr "_Texti"
@@ -11470,7 +11633,7 @@ msgstr "Leiðbeiningar"
#: ../src/path-chemistry.cpp:54
msgid "Select <b>object(s)</b> to combine."
-msgstr "Veldu <b>hlut</b> sem å að sameina."
+msgstr "Veldu <b>hluti</b> sem å að sameina."
#: ../src/path-chemistry.cpp:58
msgid "Combining paths..."
@@ -11482,15 +11645,15 @@ msgstr "Sameina"
#: ../src/path-chemistry.cpp:181
msgid "<b>No path(s)</b> to combine in the selection."
-msgstr ""
+msgstr "<b>Engir ferlar</b> í valinu til að sameina."
#: ../src/path-chemistry.cpp:193
msgid "Select <b>path(s)</b> to break apart."
-msgstr ""
+msgstr "Veldu <b>feril/ferla</b> til að rjĂșfa Ă­ sundur."
#: ../src/path-chemistry.cpp:197
msgid "Breaking apart paths..."
-msgstr ""
+msgstr "Sundra ferlum..."
#: ../src/path-chemistry.cpp:287
msgid "Break apart"
@@ -11498,11 +11661,11 @@ msgstr "Sundra"
#: ../src/path-chemistry.cpp:289
msgid "<b>No path(s)</b> to break apart in the selection."
-msgstr ""
+msgstr "<b>Engir ferlar</b> Ă­ valinu til að rjĂșfa Ă­ sundur."
#: ../src/path-chemistry.cpp:299
msgid "Select <b>object(s)</b> to convert to path."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að umbreyta í ferla."
#: ../src/path-chemistry.cpp:305
msgid "Converting objects to paths..."
@@ -11518,25 +11681,25 @@ msgstr "<b>Engir hlutir</b> í valinu sem hÊgt er að breyta í feril."
#: ../src/path-chemistry.cpp:618
msgid "Select <b>path(s)</b> to reverse."
-msgstr ""
+msgstr "Veldu <b>feril/ferla</b> til að snĂșa við."
#: ../src/path-chemistry.cpp:627
msgid "Reversing paths..."
-msgstr ""
+msgstr "SnĂœ við ferlum..."
#: ../src/path-chemistry.cpp:662
msgid "Reverse path"
-msgstr ""
+msgstr "SnĂșa við ferlum"
#: ../src/path-chemistry.cpp:664
msgid "<b>No paths</b> to reverse in the selection."
-msgstr ""
+msgstr "<b>Engir ferlar</b> Ă­ valinu til að snĂșa við."
-#: ../src/persp3d.cpp:333
+#: ../src/persp3d.cpp:323
msgid "Toggle vanishing point"
msgstr ""
-#: ../src/persp3d.cpp:344
+#: ../src/persp3d.cpp:334
msgid "Toggle multiple vanishing points"
msgstr ""
@@ -11562,7 +11725,7 @@ msgstr "Slettandi"
#: ../src/preferences-skeleton.h:107
msgid "Tracing"
-msgstr ""
+msgstr "LĂ­nuteiknun"
#: ../src/preferences.cpp:136
msgid ""
@@ -11575,7 +11738,7 @@ msgstr ""
#: ../src/preferences.cpp:151
#, c-format
msgid "Cannot create profile directory %s."
-msgstr ""
+msgstr "Get ekki bĂșið til sniðmöppu %s."
#. The profile dir is not actually a directory
#. _reportError(Glib::ustring::compose(_("%1 is not a valid directory."),
@@ -11583,7 +11746,7 @@ msgstr ""
#: ../src/preferences.cpp:169
#, c-format
msgid "%s is not a valid directory."
-msgstr ""
+msgstr "%s er ekki gild mappa."
#. The write failed.
#. _reportError(Glib::ustring::compose(_("Failed to create the preferences file %1."),
@@ -11591,7 +11754,7 @@ msgstr ""
#: ../src/preferences.cpp:180
#, c-format
msgid "Failed to create the preferences file %s."
-msgstr ""
+msgstr "MistĂłkst að bĂșa til kjörstillingaskrĂĄna %s."
#: ../src/preferences.cpp:216
#, c-format
@@ -11649,8 +11812,10 @@ msgstr "FreeArt"
msgid "Open Font License"
msgstr "Open Font notkunarleyfi"
+#. Create the Title label and edit control
#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/linking.html#AElementXLinkTitleAttribute
-#: ../src/rdf.cpp:235 ../src/ui/dialog/object-attributes.cpp:57
+#: ../src/rdf.cpp:235 ../src/ui/dialog/filedialogimpl-win32.cpp:1952
+#: ../src/ui/dialog/object-attributes.cpp:57
msgid "Title:"
msgstr "Titill:"
@@ -11802,11 +11967,11 @@ msgstr ""
#: ../src/selection-chemistry.cpp:433
#: ../src/ui/dialog/calligraphic-profile-rename.cpp:75
-#: ../src/ui/dialog/swatches.cpp:277 ../src/ui/tools/text-tool.cpp:974
+#: ../src/ui/dialog/swatches.cpp:277 ../src/ui/tools/text-tool.cpp:965
#: ../src/widgets/eraser-toolbar.cpp:93
-#: ../src/widgets/gradient-toolbar.cpp:1178
-#: ../src/widgets/gradient-toolbar.cpp:1192
-#: ../src/widgets/gradient-toolbar.cpp:1206
+#: ../src/widgets/gradient-toolbar.cpp:1181
+#: ../src/widgets/gradient-toolbar.cpp:1195
+#: ../src/widgets/gradient-toolbar.cpp:1209
#: ../src/widgets/node-toolbar.cpp:401
msgid "Delete"
msgstr "Eyða"
@@ -11830,19 +11995,19 @@ msgstr "HĂłpur"
#: ../src/selection-chemistry.cpp:801
msgid "Select a <b>group</b> to ungroup."
-msgstr ""
+msgstr "Veldu <b>hóp</b> til að skipta upp."
#: ../src/selection-chemistry.cpp:816
msgid "<b>No groups</b> to ungroup in the selection."
msgstr ""
-#: ../src/selection-chemistry.cpp:874 ../src/sp-item-group.cpp:571
+#: ../src/selection-chemistry.cpp:874 ../src/sp-item-group.cpp:575
msgid "Ungroup"
msgstr "Skipta upp hĂłp"
#: ../src/selection-chemistry.cpp:956
msgid "Select <b>object(s)</b> to raise."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að hÊkka."
#: ../src/selection-chemistry.cpp:962 ../src/selection-chemistry.cpp:1019
#: ../src/selection-chemistry.cpp:1047 ../src/selection-chemistry.cpp:1109
@@ -11858,7 +12023,7 @@ msgstr "HĂŠkka"
#: ../src/selection-chemistry.cpp:1011
msgid "Select <b>object(s)</b> to raise to top."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að hÊkka efst."
#: ../src/selection-chemistry.cpp:1034
msgid "Raise to top"
@@ -11866,7 +12031,7 @@ msgstr "Setja efst"
#: ../src/selection-chemistry.cpp:1041
msgid "Select <b>object(s)</b> to lower."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að lÊkka."
#. TRANSLATORS: "Lower" means "to lower an object" in the undo history
#: ../src/selection-chemistry.cpp:1093
@@ -11876,7 +12041,7 @@ msgstr "LĂŠkka"
#: ../src/selection-chemistry.cpp:1101
msgid "Select <b>object(s)</b> to lower to bottom."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að lÊkka neðst."
#: ../src/selection-chemistry.cpp:1136
msgid "Lower to bottom"
@@ -11912,7 +12077,7 @@ msgstr ""
#: ../src/selection-chemistry.cpp:1292
msgid "Select <b>object(s)</b> to remove filters from."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að fjarlÊgja síur af."
#: ../src/selection-chemistry.cpp:1302
#: ../src/ui/dialog/filter-effects-dialog.cpp:1678
@@ -11927,274 +12092,275 @@ msgstr "Líma stÊrð"
msgid "Paste size separately"
msgstr "Líma stÊrð sér"
-#: ../src/selection-chemistry.cpp:1330
+#: ../src/selection-chemistry.cpp:1349
msgid "Select <b>object(s)</b> to move to the layer above."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að fÊra å lagið fyrir ofan."
-#: ../src/selection-chemistry.cpp:1356
+#: ../src/selection-chemistry.cpp:1376
msgid "Raise to next layer"
msgstr "HĂŠkka Ă­ nĂŠsta lag"
-#: ../src/selection-chemistry.cpp:1363
+#: ../src/selection-chemistry.cpp:1383
msgid "No more layers above."
-msgstr ""
+msgstr "Engin fleiri lög fyrir ofan."
-#: ../src/selection-chemistry.cpp:1375
+#: ../src/selection-chemistry.cpp:1395
msgid "Select <b>object(s)</b> to move to the layer below."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að fÊra å lagið fyrir neðan."
-#: ../src/selection-chemistry.cpp:1401
+#: ../src/selection-chemistry.cpp:1422
msgid "Lower to previous layer"
msgstr "LĂŠkka Ă­ fyrra lag"
-#: ../src/selection-chemistry.cpp:1408
+#: ../src/selection-chemistry.cpp:1429
msgid "No more layers below."
-msgstr ""
+msgstr "Engin fleiri lög fyrir neðan."
-#: ../src/selection-chemistry.cpp:1420
+#: ../src/selection-chemistry.cpp:1441
msgid "Select <b>object(s)</b> to move."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að fÊra."
-#: ../src/selection-chemistry.cpp:1437 ../src/verbs.cpp:2656
+#: ../src/selection-chemistry.cpp:1459 ../src/verbs.cpp:2656
msgid "Move selection to layer"
-msgstr ""
+msgstr "Flytja val å lagið"
#. An SVG element cannot have a transform. We could change 'x' and 'y' in response
#. to a translation... but leave that for another day.
-#: ../src/selection-chemistry.cpp:1527 ../src/seltrans.cpp:388
+#: ../src/selection-chemistry.cpp:1549 ../src/seltrans.cpp:388
msgid "Cannot transform an embedded SVG."
msgstr ""
-#: ../src/selection-chemistry.cpp:1698
+#: ../src/selection-chemistry.cpp:1720
msgid "Remove transform"
msgstr "FjarlĂŠgja ummyndun"
-#: ../src/selection-chemistry.cpp:1805
+#: ../src/selection-chemistry.cpp:1827
msgid "Rotate 90° CCW"
msgstr "SnĂșa 90° rangsĂŠlis"
-#: ../src/selection-chemistry.cpp:1805
+#: ../src/selection-chemistry.cpp:1827
msgid "Rotate 90° CW"
msgstr "SnĂșa 90° rĂ©ttsĂŠlis"
-#: ../src/selection-chemistry.cpp:1826 ../src/seltrans.cpp:483
+#: ../src/selection-chemistry.cpp:1848 ../src/seltrans.cpp:483
#: ../src/ui/dialog/transformation.cpp:893
msgid "Rotate"
msgstr "SnĂșa"
-#: ../src/selection-chemistry.cpp:2214
+#: ../src/selection-chemistry.cpp:2204
msgid "Rotate by pixels"
msgstr "SnĂșa eftir mynddĂ­lum"
-#: ../src/selection-chemistry.cpp:2244 ../src/seltrans.cpp:480
+#: ../src/selection-chemistry.cpp:2234 ../src/seltrans.cpp:480
#: ../src/ui/dialog/transformation.cpp:868
#: ../share/extensions/interp_att_g.inx.h:12
msgid "Scale"
msgstr "Kvarði"
-#: ../src/selection-chemistry.cpp:2269
+#: ../src/selection-chemistry.cpp:2259
msgid "Scale by whole factor"
msgstr ""
-#: ../src/selection-chemistry.cpp:2284
+#: ../src/selection-chemistry.cpp:2274
msgid "Move vertically"
msgstr "FÊra lóðrétt"
-#: ../src/selection-chemistry.cpp:2287
+#: ../src/selection-chemistry.cpp:2277
msgid "Move horizontally"
msgstr "FÊra lårétt"
-#: ../src/selection-chemistry.cpp:2290 ../src/selection-chemistry.cpp:2316
+#: ../src/selection-chemistry.cpp:2280 ../src/selection-chemistry.cpp:2306
#: ../src/seltrans.cpp:477 ../src/ui/dialog/transformation.cpp:806
msgid "Move"
msgstr "FĂŠra"
-#: ../src/selection-chemistry.cpp:2310
+#: ../src/selection-chemistry.cpp:2300
msgid "Move vertically by pixels"
msgstr "FÊra lóðrétt um mynddíla"
-#: ../src/selection-chemistry.cpp:2313
+#: ../src/selection-chemistry.cpp:2303
msgid "Move horizontally by pixels"
msgstr "FÊra lårétt um mynddíla"
-#: ../src/selection-chemistry.cpp:2445
+#: ../src/selection-chemistry.cpp:2435
msgid "The selection has no applied path effect."
msgstr ""
-#: ../src/selection-chemistry.cpp:2617 ../src/ui/dialog/clonetiler.cpp:2223
+#: ../src/selection-chemistry.cpp:2607 ../src/ui/dialog/clonetiler.cpp:2223
msgid "Select an <b>object</b> to clone."
msgstr "Veldu <b>hlut</b> sem å að klóna."
-#: ../src/selection-chemistry.cpp:2653
+#: ../src/selection-chemistry.cpp:2643
msgctxt "Action"
msgid "Clone"
msgstr "KlĂłna"
-#: ../src/selection-chemistry.cpp:2669
+#: ../src/selection-chemistry.cpp:2659
msgid "Select <b>clones</b> to relink."
msgstr ""
-#: ../src/selection-chemistry.cpp:2676
+#: ../src/selection-chemistry.cpp:2666
msgid "Copy an <b>object</b> to clipboard to relink clones to."
msgstr ""
-#: ../src/selection-chemistry.cpp:2699
+#: ../src/selection-chemistry.cpp:2689
msgid "<b>No clones to relink</b> in the selection."
msgstr ""
-#: ../src/selection-chemistry.cpp:2702
+#: ../src/selection-chemistry.cpp:2692
msgid "Relink clone"
msgstr "Endurtengja klĂłna"
-#: ../src/selection-chemistry.cpp:2716
+#: ../src/selection-chemistry.cpp:2706
msgid "Select <b>clones</b> to unlink."
msgstr ""
-#: ../src/selection-chemistry.cpp:2772
+#: ../src/selection-chemistry.cpp:2762
msgid "<b>No clones to unlink</b> in the selection."
msgstr ""
-#: ../src/selection-chemistry.cpp:2776
+#: ../src/selection-chemistry.cpp:2766
msgid "Unlink clone"
msgstr "Aftengja klĂłn"
-#: ../src/selection-chemistry.cpp:2789
+#: ../src/selection-chemistry.cpp:2779
msgid ""
"Select a <b>clone</b> to go to its original. Select a <b>linked offset</b> "
"to go to its source. Select a <b>text on path</b> to go to the path. Select "
"a <b>flowed text</b> to go to its frame."
msgstr ""
-#: ../src/selection-chemistry.cpp:2837
+#: ../src/selection-chemistry.cpp:2827
msgid ""
"<b>Cannot find</b> the object to select (orphaned clone, offset, textpath, "
"flowed text?)"
msgstr ""
-#: ../src/selection-chemistry.cpp:2843
+#: ../src/selection-chemistry.cpp:2833
msgid ""
"The object you're trying to select is <b>not visible</b> (it is in &lt;"
"defs&gt;)"
msgstr ""
-#: ../src/selection-chemistry.cpp:2932
+#: ../src/selection-chemistry.cpp:2922
msgid "Select path(s) to fill."
-msgstr ""
+msgstr "Veldu feril/ferla til að fylla."
-#: ../src/selection-chemistry.cpp:2950
+#: ../src/selection-chemistry.cpp:2940
msgid "Select <b>object(s)</b> to convert to marker."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að umbreyta í línumerki."
-#: ../src/selection-chemistry.cpp:3025
+#: ../src/selection-chemistry.cpp:3015
msgid "Objects to marker"
msgstr "Hlutir að merkipunktum"
-#: ../src/selection-chemistry.cpp:3050
+#: ../src/selection-chemistry.cpp:3040
msgid "Select <b>object(s)</b> to convert to guides."
-msgstr "Veldu <b>hlut</b> sem å að umbreyta í stoðlínur."
+msgstr "Veldu <b>hluti</b> sem å að umbreyta í stoðlínur."
-#: ../src/selection-chemistry.cpp:3073
+#: ../src/selection-chemistry.cpp:3063
msgid "Objects to guides"
msgstr "Hlutir að stoðlínum"
-#: ../src/selection-chemistry.cpp:3109
+#: ../src/selection-chemistry.cpp:3099
msgid "Select <b>objects</b> to convert to symbol."
msgstr "Veldu <b>hlut</b> sem å að umbreyta í tåkn."
-#: ../src/selection-chemistry.cpp:3212
+#: ../src/selection-chemistry.cpp:3202
msgid "Group to symbol"
msgstr ""
-#: ../src/selection-chemistry.cpp:3231
+#: ../src/selection-chemistry.cpp:3221
msgid "Select a <b>symbol</b> to extract objects from."
msgstr ""
-#: ../src/selection-chemistry.cpp:3240
+#: ../src/selection-chemistry.cpp:3230
msgid "Select only one <b>symbol</b> in Symbol dialog to convert to group."
msgstr ""
-#: ../src/selection-chemistry.cpp:3298
+#: ../src/selection-chemistry.cpp:3288
msgid "Group from symbol"
msgstr ""
-#: ../src/selection-chemistry.cpp:3316
+#: ../src/selection-chemistry.cpp:3306
msgid "Select <b>object(s)</b> to convert to pattern."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að umbreyta í mynstur."
-#: ../src/selection-chemistry.cpp:3415
+#: ../src/selection-chemistry.cpp:3405
msgid "Objects to pattern"
msgstr "Hlutir að mynstri"
-#: ../src/selection-chemistry.cpp:3431
+#: ../src/selection-chemistry.cpp:3421
msgid "Select an <b>object with pattern fill</b> to extract objects from."
msgstr ""
-#: ../src/selection-chemistry.cpp:3492
+#: ../src/selection-chemistry.cpp:3482
msgid "<b>No pattern fills</b> in the selection."
msgstr ""
-#: ../src/selection-chemistry.cpp:3495
+#: ../src/selection-chemistry.cpp:3485
msgid "Pattern to objects"
msgstr ""
-#: ../src/selection-chemistry.cpp:3586
+#: ../src/selection-chemistry.cpp:3576
msgid "Select <b>object(s)</b> to make a bitmap copy."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að gera afrit af sem bitamynd."
-#: ../src/selection-chemistry.cpp:3590
+#: ../src/selection-chemistry.cpp:3580
msgid "Rendering bitmap..."
msgstr "Myndgeri bitamynd..."
-#: ../src/selection-chemistry.cpp:3777
+#: ../src/selection-chemistry.cpp:3767
msgid "Create bitmap"
msgstr "BĂșa til bitamynd"
-#: ../src/selection-chemistry.cpp:3802 ../src/selection-chemistry.cpp:3921
+#: ../src/selection-chemistry.cpp:3792 ../src/selection-chemistry.cpp:3911
msgid "Select <b>object(s)</b> to create clippath or mask from."
msgstr ""
+"Veldu <b>hluti</b> ĂŸar sem ĂĄ að bĂșa til afmörkunarferlil eða laghulu Ășr."
-#: ../src/selection-chemistry.cpp:3895
+#: ../src/selection-chemistry.cpp:3885
msgid "Create Clip Group"
-msgstr ""
+msgstr "BĂșa til afmarkandi hĂłp"
-#: ../src/selection-chemistry.cpp:3924
+#: ../src/selection-chemistry.cpp:3914
msgid "Select mask object and <b>object(s)</b> to apply clippath or mask to."
msgstr ""
-#: ../src/selection-chemistry.cpp:4105
+#: ../src/selection-chemistry.cpp:4095
msgid "Set clipping path"
msgstr "Setja afmörkunarferil"
-#: ../src/selection-chemistry.cpp:4107
+#: ../src/selection-chemistry.cpp:4097
msgid "Set mask"
msgstr "Setja hulu"
-#: ../src/selection-chemistry.cpp:4122
+#: ../src/selection-chemistry.cpp:4112
msgid "Select <b>object(s)</b> to remove clippath or mask from."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að fjarlÊgja afmörkunarferla eða laghulur af."
-#: ../src/selection-chemistry.cpp:4242
+#: ../src/selection-chemistry.cpp:4232
msgid "Release clipping path"
msgstr "Sleppa afmörkunarferli"
-#: ../src/selection-chemistry.cpp:4244
+#: ../src/selection-chemistry.cpp:4234
msgid "Release mask"
msgstr "Sleppa hulu"
-#: ../src/selection-chemistry.cpp:4263
+#: ../src/selection-chemistry.cpp:4253
msgid "Select <b>object(s)</b> to fit canvas to."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að aðlaga myndflöt að."
#. Fit Page
-#: ../src/selection-chemistry.cpp:4283 ../src/verbs.cpp:2992
+#: ../src/selection-chemistry.cpp:4273 ../src/verbs.cpp:2992
msgid "Fit Page to Selection"
msgstr "Laga síðu að vali"
-#: ../src/selection-chemistry.cpp:4312 ../src/verbs.cpp:2994
+#: ../src/selection-chemistry.cpp:4302 ../src/verbs.cpp:2994
msgid "Fit Page to Drawing"
msgstr "Laga síðu að teikningu"
-#: ../src/selection-chemistry.cpp:4333 ../src/verbs.cpp:2996
+#: ../src/selection-chemistry.cpp:4323 ../src/verbs.cpp:2996
msgid "Fit Page to Selection or Drawing"
msgstr "Laga síðu að vali eða teikningu"
@@ -12229,7 +12395,7 @@ msgstr " Ă­ %s"
#: ../src/selection-describer.cpp:177
msgid " hidden in definitions"
-msgstr ""
+msgstr "falið í skilgreiningum"
#: ../src/selection-describer.cpp:179
#, c-format
@@ -12277,8 +12443,8 @@ msgstr ""
#: ../src/selection-describer.cpp:236
#, c-format
-msgid "<b>%i</b> objects selected of type %s"
-msgid_plural "<b>%i</b> objects selected of types %s"
+msgid "<b>%1$i</b> objects selected of type %2$s"
+msgid_plural "<b>%1$i</b> objects selected of types %2$s"
msgstr[0] ""
msgstr[1] ""
@@ -12345,14 +12511,14 @@ msgstr ""
#: ../src/seltrans.cpp:1199
#, c-format
msgid "<b>Skew</b>: %0.2f&#176;; with <b>Ctrl</b> to snap angle"
-msgstr ""
+msgstr "<b>Skekkja</b>: %0.2f&#176;; með <b>Ctrl</b> til að ĂŸrepa horn"
#. TRANSLATORS: don't modify the first ";"
#. (it will NOT be displayed as ";" - only the second one will be)
#: ../src/seltrans.cpp:1274
#, c-format
msgid "<b>Rotate</b>: %0.2f&#176;; with <b>Ctrl</b> to snap angle"
-msgstr ""
+msgstr "<b>SnĂșa</b>: %0.2f&#176;; með <b>Ctrl</b> til að ĂŸrepa horn"
#: ../src/seltrans.cpp:1311
#, c-format
@@ -12378,38 +12544,38 @@ msgstr "Veldu skrĂĄarheiti til Ăștflutnings"
#: ../src/shortcuts.cpp:370
msgid "Select a file to import"
-msgstr ""
+msgstr "Veldu skrå til að flytja inn"
-#: ../src/sp-anchor.cpp:125
+#: ../src/sp-anchor.cpp:111
#, c-format
msgid "to %s"
-msgstr ""
+msgstr "Ă­ %s"
-#: ../src/sp-anchor.cpp:129
+#: ../src/sp-anchor.cpp:115
msgid "without URI"
-msgstr ""
+msgstr "ån URI-slóðar"
-#: ../src/sp-ellipse.cpp:373
+#: ../src/sp-ellipse.cpp:344
msgid "Segment"
msgstr "Hluti"
-#: ../src/sp-ellipse.cpp:375
+#: ../src/sp-ellipse.cpp:346
msgid "Arc"
msgstr "Bogi"
#. Ellipse
-#: ../src/sp-ellipse.cpp:378 ../src/sp-ellipse.cpp:385
+#: ../src/sp-ellipse.cpp:349 ../src/sp-ellipse.cpp:356
#: ../src/ui/dialog/inkscape-preferences.cpp:412
#: ../src/widgets/pencil-toolbar.cpp:163
msgid "Ellipse"
msgstr "Sporbaugur"
-#: ../src/sp-ellipse.cpp:382
+#: ../src/sp-ellipse.cpp:353
msgid "Circle"
msgstr "Hringur"
#. TRANSLATORS: "Flow region" is an area where text is allowed to flow
-#: ../src/sp-flowregion.cpp:195
+#: ../src/sp-flowregion.cpp:181
msgid "Flow Region"
msgstr ""
@@ -12417,88 +12583,88 @@ msgstr ""
#. * flow excluded region. flowRegionExclude in SVG 1.2: see
#. * http://www.w3.org/TR/2004/WD-SVG12-20041027/flow.html#flowRegion-elem and
#. * http://www.w3.org/TR/2004/WD-SVG12-20041027/flow.html#flowRegionExclude-elem.
-#: ../src/sp-flowregion.cpp:348
+#: ../src/sp-flowregion.cpp:334
msgid "Flow Excluded Region"
msgstr ""
-#: ../src/sp-flowtext.cpp:290
+#: ../src/sp-flowtext.cpp:280
msgid "Flowed Text"
-msgstr ""
+msgstr "FlÊðitexti"
-#: ../src/sp-flowtext.cpp:292
+#: ../src/sp-flowtext.cpp:282
msgid "Linked Flowed Text"
-msgstr ""
+msgstr "Tengdur flÊðitexti"
-#: ../src/sp-flowtext.cpp:298 ../src/sp-text.cpp:381
-#: ../src/ui/tools/text-tool.cpp:1566
+#: ../src/sp-flowtext.cpp:288 ../src/sp-text.cpp:367
+#: ../src/ui/tools/text-tool.cpp:1557
msgid " [truncated]"
-msgstr ""
+msgstr " [afskorið]"
-#: ../src/sp-flowtext.cpp:300
+#: ../src/sp-flowtext.cpp:290
#, c-format
msgid "(%d character%s)"
msgid_plural "(%d characters%s)"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "(%d stafur%s)"
+msgstr[1] "(%d stafir%s)"
-#: ../src/sp-guide.cpp:249
+#: ../src/sp-guide.cpp:246
msgid "Create Guides Around the Page"
msgstr "BĂșa til stoðlĂ­nur Ă­ kringum síðu"
-#: ../src/sp-guide.cpp:261 ../src/verbs.cpp:2549
+#: ../src/sp-guide.cpp:258 ../src/verbs.cpp:2549
msgid "Delete All Guides"
msgstr "Eyða öllum stoðlínum"
#. Guide has probably been deleted and no longer has an attached namedview.
-#: ../src/sp-guide.cpp:448
+#: ../src/sp-guide.cpp:445
msgid "Deleted"
msgstr "Eytt"
-#: ../src/sp-guide.cpp:457
+#: ../src/sp-guide.cpp:454
msgid ""
"<b>Shift+drag</b> to rotate, <b>Ctrl+drag</b> to move origin, <b>Del</b> to "
"delete"
msgstr ""
-#: ../src/sp-guide.cpp:461
+#: ../src/sp-guide.cpp:458
#, c-format
msgid "vertical, at %s"
-msgstr ""
+msgstr "lóðrétt, við %s"
-#: ../src/sp-guide.cpp:464
+#: ../src/sp-guide.cpp:461
#, c-format
msgid "horizontal, at %s"
-msgstr ""
+msgstr "lårétt, við %s"
-#: ../src/sp-guide.cpp:469
+#: ../src/sp-guide.cpp:466
#, c-format
msgid "at %d degrees, through (%s,%s)"
msgstr "við %d gråður, gegnum (%s,%s)"
-#: ../src/sp-image.cpp:526
+#: ../src/sp-image.cpp:517
msgid "embedded"
-msgstr ""
+msgstr "ívafið"
-#: ../src/sp-image.cpp:534
+#: ../src/sp-image.cpp:525
#, c-format
msgid "[bad reference]: %s"
-msgstr ""
+msgstr "[gölluð tilvísun]: %s"
-#: ../src/sp-image.cpp:535
+#: ../src/sp-image.cpp:526
#, c-format
msgid "%d &#215; %d: %s"
msgstr "%d &#215; %d: %s"
-#: ../src/sp-item-group.cpp:332
+#: ../src/sp-item-group.cpp:322
msgid "Group"
msgstr "HĂłpur"
-#: ../src/sp-item-group.cpp:338 ../src/sp-switch.cpp:82
+#: ../src/sp-item-group.cpp:328 ../src/sp-switch.cpp:68
#, c-format
msgid "of <b>%d</b> object"
msgstr "af <b>%d</b> hlut"
-#: ../src/sp-item-group.cpp:338 ../src/sp-switch.cpp:82
+#: ../src/sp-item-group.cpp:328 ../src/sp-switch.cpp:68
#, c-format
msgid "of <b>%d</b> objects"
msgstr "af <b>%d</b> hlutum"
@@ -12527,7 +12693,7 @@ msgstr "%s; <i>síað (%s)</i>"
msgid "%s; <i>filtered</i>"
msgstr "%s; <i>síað</i>"
-#: ../src/sp-line.cpp:126
+#: ../src/sp-line.cpp:113
msgid "Line"
msgstr "LĂ­na"
@@ -12535,101 +12701,101 @@ msgstr "LĂ­na"
msgid "An exception occurred during execution of the Path Effect."
msgstr ""
-#: ../src/sp-offset.cpp:339
+#: ../src/sp-offset.cpp:329
msgid "Linked Offset"
msgstr "Tengd hliðrun"
-#: ../src/sp-offset.cpp:341
+#: ../src/sp-offset.cpp:331
msgid "Dynamic Offset"
msgstr "Breytileg hliðrun"
#. TRANSLATORS COMMENT: %s is either "outset" or "inset" depending on sign
-#: ../src/sp-offset.cpp:347
+#: ../src/sp-offset.cpp:337
#, c-format
msgid "%s by %f pt"
msgstr "%s um %f pt"
-#: ../src/sp-offset.cpp:348
+#: ../src/sp-offset.cpp:338
msgid "outset"
msgstr "Ăștsetja"
-#: ../src/sp-offset.cpp:348
+#: ../src/sp-offset.cpp:338
msgid "inset"
msgstr "innfella"
-#: ../src/sp-path.cpp:70
+#: ../src/sp-path.cpp:60
msgid "Path"
msgstr "Ferill"
-#: ../src/sp-path.cpp:95
+#: ../src/sp-path.cpp:85
#, c-format
msgid ", path effect: %s"
-msgstr ""
+msgstr ", ferilbrella: %s"
-#: ../src/sp-path.cpp:98
+#: ../src/sp-path.cpp:88
#, c-format
msgid "%i node%s"
-msgstr ""
+msgstr "%i hnĂștur%s"
-#: ../src/sp-path.cpp:98
+#: ../src/sp-path.cpp:88
#, c-format
msgid "%i nodes%s"
-msgstr ""
+msgstr "%i hnĂștar%s"
-#: ../src/sp-polygon.cpp:185
+#: ../src/sp-polygon.cpp:173
msgid "<b>Polygon</b>"
msgstr "<b>Marghyrningur</b>"
-#: ../src/sp-polyline.cpp:131
+#: ../src/sp-polyline.cpp:121
msgid "<b>Polyline</b>"
msgstr "<b>Fjöllína</b>"
#. Rectangle
-#: ../src/sp-rect.cpp:163 ../src/ui/dialog/inkscape-preferences.cpp:402
+#: ../src/sp-rect.cpp:153 ../src/ui/dialog/inkscape-preferences.cpp:402
msgid "Rectangle"
msgstr "Rétthyrningur"
#. Spiral
-#: ../src/sp-spiral.cpp:230 ../src/ui/dialog/inkscape-preferences.cpp:420
+#: ../src/sp-spiral.cpp:220 ../src/ui/dialog/inkscape-preferences.cpp:420
#: ../share/extensions/gcodetools_area.inx.h:11
msgid "Spiral"
msgstr "SpĂ­rall"
#. TRANSLATORS: since turn count isn't an integer, please adjust the
#. string as needed to deal with an localized plural forms.
-#: ../src/sp-spiral.cpp:236
+#: ../src/sp-spiral.cpp:226
#, c-format
msgid "with %3f turns"
msgstr "með %3f beygjum"
#. Star
-#: ../src/sp-star.cpp:256 ../src/ui/dialog/inkscape-preferences.cpp:416
+#: ../src/sp-star.cpp:246 ../src/ui/dialog/inkscape-preferences.cpp:416
#: ../src/widgets/star-toolbar.cpp:471
msgid "Star"
msgstr "Stjarna"
-#: ../src/sp-star.cpp:257 ../src/widgets/star-toolbar.cpp:464
+#: ../src/sp-star.cpp:247 ../src/widgets/star-toolbar.cpp:464
msgid "Polygon"
msgstr "Marghyrningur"
#. while there will never be less than 3 vertices, we still need to
#. make calls to ngettext because the pluralization may be different
#. for various numbers >=3. The singular form is used as the index.
-#: ../src/sp-star.cpp:264
+#: ../src/sp-star.cpp:254
#, c-format
msgid "with %d vertex"
-msgstr ""
+msgstr "með %d hlið"
-#: ../src/sp-star.cpp:264
+#: ../src/sp-star.cpp:254
#, c-format
msgid "with %d vertices"
-msgstr ""
+msgstr "með %d hliðum"
-#: ../src/sp-switch.cpp:76
+#: ../src/sp-switch.cpp:62
msgid "Conditional Group"
-msgstr ""
+msgstr "Skilyrtur hĂłpur"
-#: ../src/sp-text.cpp:365 ../src/verbs.cpp:348
+#: ../src/sp-text.cpp:351 ../src/verbs.cpp:348
#: ../share/extensions/lorem_ipsum.inx.h:8
#: ../share/extensions/replace_font.inx.h:11
#: ../share/extensions/split.inx.h:10 ../share/extensions/text_braille.inx.h:2
@@ -12644,56 +12810,56 @@ msgstr ""
msgid "Text"
msgstr "Texti"
-#: ../src/sp-text.cpp:385
+#: ../src/sp-text.cpp:371
#, c-format
msgid "on path%s (%s, %s)"
msgstr "ĂĄ ferli%s (%s, %s)"
-#: ../src/sp-text.cpp:386
+#: ../src/sp-text.cpp:372
#, c-format
msgid "%s (%s, %s)"
msgstr "%s (%s, %s)"
-#: ../src/sp-tref.cpp:230
+#: ../src/sp-tref.cpp:218
msgid "Cloned Character Data"
msgstr ""
-#: ../src/sp-tref.cpp:246
+#: ../src/sp-tref.cpp:234
msgid " from "
msgstr " frĂĄ "
-#: ../src/sp-tref.cpp:252 ../src/sp-use.cpp:281
+#: ../src/sp-tref.cpp:240 ../src/sp-use.cpp:269
msgid "[orphaned]"
-msgstr ""
+msgstr "[munaðarlaust]"
-#: ../src/sp-tspan.cpp:218
+#: ../src/sp-tspan.cpp:203
msgid "Text Span"
msgstr ""
-#: ../src/sp-use.cpp:244
+#: ../src/sp-use.cpp:232
msgid "Symbol"
msgstr "TĂĄkn"
-#: ../src/sp-use.cpp:246
+#: ../src/sp-use.cpp:234
msgid "Clone"
msgstr "KlĂłni"
-#: ../src/sp-use.cpp:254 ../src/sp-use.cpp:256 ../src/sp-use.cpp:258
+#: ../src/sp-use.cpp:242 ../src/sp-use.cpp:244 ../src/sp-use.cpp:246
#, c-format
msgid "called %s"
msgstr "kallað %s"
-#: ../src/sp-use.cpp:258
+#: ../src/sp-use.cpp:246
msgid "Unnamed Symbol"
msgstr "Ónefnt tákn"
#. TRANSLATORS: Used for statusbar description for long <use> chains:
#. * "Clone of: Clone of: ... in Layer 1".
-#: ../src/sp-use.cpp:267
+#: ../src/sp-use.cpp:255
msgid "..."
msgstr "..."
-#: ../src/sp-use.cpp:276
+#: ../src/sp-use.cpp:264
#, c-format
msgid "of: %s"
msgstr "af: %s"
@@ -12825,10 +12991,12 @@ msgstr ""
#: ../src/text-chemistry.cpp:115
msgid "The flowed text(s) must be <b>visible</b> in order to be put on a path."
msgstr ""
+"FlÊðitextinn verður að vera <b>sĂœnilegur</b> svo hĂŠgt sĂ© að setja hann ĂĄ "
+"feril."
#: ../src/text-chemistry.cpp:185 ../src/verbs.cpp:2571
msgid "Put text on path"
-msgstr ""
+msgstr "Setja texta ĂĄ feril"
#: ../src/text-chemistry.cpp:197
msgid "Select <b>a text on path</b> to remove it from path."
@@ -12840,7 +13008,7 @@ msgstr ""
#: ../src/text-chemistry.cpp:221 ../src/verbs.cpp:2573
msgid "Remove text from path"
-msgstr ""
+msgstr "FjarlĂŠgja texta af ferli"
#: ../src/text-chemistry.cpp:262 ../src/text-chemistry.cpp:283
msgid "Select <b>text(s)</b> to remove kerns from."
@@ -12870,19 +13038,20 @@ msgstr ""
#: ../src/text-chemistry.cpp:484
msgid "Select <b>flowed text(s)</b> to convert."
-msgstr ""
+msgstr "Veldu <b>flÊðitexta</b> til að umbreyta."
#: ../src/text-chemistry.cpp:502
msgid "The flowed text(s) must be <b>visible</b> in order to be converted."
msgstr ""
+"FlÊðitextinn verður að vera <b>sĂœnilegur</b> svo hĂŠgt sĂ© að umbreyta honum."
#: ../src/text-chemistry.cpp:530
msgid "Convert flowed text to text"
-msgstr ""
+msgstr "Umbreyta flÊðitexta í venjulegan texta"
#: ../src/text-chemistry.cpp:535
msgid "<b>No flowed text(s)</b> to convert in the selection."
-msgstr ""
+msgstr "<b>Enginn flÊðitexti</b> í valinu sem hÊgt er að umbreyta."
#: ../src/text-editing.cpp:44
msgid "You cannot edit <b>cloned character data</b>."
@@ -12891,42 +13060,42 @@ msgstr ""
#: ../src/trace/potrace/inkscape-potrace.cpp:512
#: ../src/trace/potrace/inkscape-potrace.cpp:575
msgid "Trace: %1. %2 nodes"
-msgstr ""
+msgstr "LĂ­nuteiknun: %1. %2 hnĂștar"
#: ../src/trace/trace.cpp:59 ../src/trace/trace.cpp:124
#: ../src/trace/trace.cpp:132 ../src/trace/trace.cpp:225
#: ../src/ui/dialog/pixelartdialog.cpp:370
#: ../src/ui/dialog/pixelartdialog.cpp:402
msgid "Select an <b>image</b> to trace"
-msgstr "Veldu <b>mynd</b> til að draga línur eftir (trace)"
+msgstr "Veldu <b>mynd</b> til að draga línur eftir"
#: ../src/trace/trace.cpp:94
msgid "Select only one <b>image</b> to trace"
-msgstr ""
+msgstr "Veldu aðeins eina <b>mynd</b> til að draga línur eftir"
#: ../src/trace/trace.cpp:112
msgid "Select one image and one or more shapes above it"
-msgstr ""
+msgstr "Veldu eina mynd og eitt eða fleiri form fyrir ofan hana"
#: ../src/trace/trace.cpp:216
msgid "Trace: No active desktop"
-msgstr ""
+msgstr "Línuteiknun: Ekkert virkt skjåborð"
#: ../src/trace/trace.cpp:313
msgid "Invalid SIOX result"
-msgstr ""
+msgstr "Ógild SIOX Ăștkoma"
#: ../src/trace/trace.cpp:406
msgid "Trace: No active document"
-msgstr ""
+msgstr "LĂ­nuteiknun: Ekkert vikt skjal"
#: ../src/trace/trace.cpp:438
msgid "Trace: Image has no bitmap data"
-msgstr ""
+msgstr "Línuteiknun: Myndin er ekki með nein bitamyndagögn"
#: ../src/trace/trace.cpp:445
msgid "Trace: Starting trace..."
-msgstr ""
+msgstr "LĂ­nuteiknun: Hef rakningu..."
#. ## inform the document, so we can undo
#: ../src/trace/trace.cpp:548
@@ -12936,33 +13105,33 @@ msgstr "LĂ­nuteikna bitamynd"
#: ../src/trace/trace.cpp:552
#, c-format
msgid "Trace: Done. %ld nodes created"
-msgstr ""
+msgstr "LĂ­nuteiknun: Lokið. Gerði %ld hnĂșta"
#. check whether something is selected
#: ../src/ui/clipboard.cpp:262
msgid "Nothing was copied."
-msgstr ""
+msgstr "Ekkert var afritað."
#: ../src/ui/clipboard.cpp:393 ../src/ui/clipboard.cpp:605
#: ../src/ui/clipboard.cpp:634
msgid "Nothing on the clipboard."
-msgstr ""
+msgstr "Ekkert ĂĄ klippispjaldi."
#: ../src/ui/clipboard.cpp:451
msgid "Select <b>object(s)</b> to paste style to."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að líma stíla å."
#: ../src/ui/clipboard.cpp:462 ../src/ui/clipboard.cpp:479
msgid "No style on the clipboard."
-msgstr ""
+msgstr "Enginn stĂ­ll ĂĄ klippispjaldi."
#: ../src/ui/clipboard.cpp:504
msgid "Select <b>object(s)</b> to paste size to."
-msgstr ""
+msgstr "Veldu <b>hluti</b> sem å að líma stÊrð å."
#: ../src/ui/clipboard.cpp:511
msgid "No size on the clipboard."
-msgstr ""
+msgstr "Engin stÊrð å klippispjaldi."
#: ../src/ui/clipboard.cpp:567
msgid "Select <b>object(s)</b> to paste live path effect to."
@@ -12971,11 +13140,11 @@ msgstr ""
#. no_effect:
#: ../src/ui/clipboard.cpp:592
msgid "No effect on the clipboard."
-msgstr ""
+msgstr "Engin brella ĂĄ klippispjaldi."
#: ../src/ui/clipboard.cpp:611 ../src/ui/clipboard.cpp:648
msgid "Clipboard does not contain a path."
-msgstr "Klippiborðið inniheldur ekki nothÊfan feril."
+msgstr "Klippispjaldið inniheldur ekki nothÊfan feril."
#. *
#. * Constructor
@@ -13033,7 +13202,7 @@ msgstr "Dreifa"
#: ../src/ui/dialog/align-and-distribute.cpp:420
msgid "Minimum horizontal gap (in px units) between bounding boxes"
-msgstr ""
+msgstr "Lågmarks lårétt millibil (í punktum) milli umgjarða"
#. TRANSLATORS: "H:" stands for horizontal gap
#: ../src/ui/dialog/align-and-distribute.cpp:422
@@ -13043,7 +13212,7 @@ msgstr "_H:"
#: ../src/ui/dialog/align-and-distribute.cpp:430
msgid "Minimum vertical gap (in px units) between bounding boxes"
-msgstr ""
+msgstr "Lågmarks lóðrétt millibil (í punktum) milli umgjarða"
#. TRANSLATORS: Vertical gap
#: ../src/ui/dialog/align-and-distribute.cpp:432
@@ -13064,7 +13233,7 @@ msgstr "Laga til tengilĂ­nunet"
#: ../src/ui/dialog/align-and-distribute.cpp:591
msgid "Exchange Positions"
-msgstr ""
+msgstr "Víxla staðsetningum"
#: ../src/ui/dialog/align-and-distribute.cpp:625
msgid "Unclump"
@@ -13087,7 +13256,7 @@ msgid "Rearrange"
msgstr "Endurraða"
#: ../src/ui/dialog/align-and-distribute.cpp:855
-#: ../src/widgets/toolbox.cpp:1727
+#: ../src/widgets/toolbox.cpp:1729
msgid "Nodes"
msgstr "HnĂștar"
@@ -13103,52 +13272,52 @@ msgstr "_Meðhöndla valið sem : hóp"
#: ../src/ui/dialog/align-and-distribute.cpp:876 ../src/verbs.cpp:3024
#: ../src/verbs.cpp:3025
msgid "Align right edges of objects to the left edge of the anchor"
-msgstr ""
+msgstr "Jafna hÊgri jaðra hluta við vinstri jaðar festipunktsins"
#: ../src/ui/dialog/align-and-distribute.cpp:879 ../src/verbs.cpp:3026
#: ../src/verbs.cpp:3027
msgid "Align left edges"
-msgstr ""
+msgstr "Jafna vinstri jaðra"
#: ../src/ui/dialog/align-and-distribute.cpp:882 ../src/verbs.cpp:3028
#: ../src/verbs.cpp:3029
msgid "Center on vertical axis"
-msgstr ""
+msgstr "Miðja å lóðréttum ås"
#: ../src/ui/dialog/align-and-distribute.cpp:885 ../src/verbs.cpp:3030
#: ../src/verbs.cpp:3031
msgid "Align right sides"
-msgstr ""
+msgstr "Jafna hÊgri jaðra"
#: ../src/ui/dialog/align-and-distribute.cpp:888 ../src/verbs.cpp:3032
#: ../src/verbs.cpp:3033
msgid "Align left edges of objects to the right edge of the anchor"
-msgstr ""
+msgstr "Jafna vinstri jaðra hluta við hÊgri jaðar festipunktsins"
#: ../src/ui/dialog/align-and-distribute.cpp:891 ../src/verbs.cpp:3034
#: ../src/verbs.cpp:3035
msgid "Align bottom edges of objects to the top edge of the anchor"
-msgstr ""
+msgstr "Jafna neðri jaðra hluta við efri jaðar festipunktsins"
#: ../src/ui/dialog/align-and-distribute.cpp:894 ../src/verbs.cpp:3036
#: ../src/verbs.cpp:3037
msgid "Align top edges"
-msgstr ""
+msgstr "Jafna efri jaðra"
#: ../src/ui/dialog/align-and-distribute.cpp:897 ../src/verbs.cpp:3038
#: ../src/verbs.cpp:3039
msgid "Center on horizontal axis"
-msgstr ""
+msgstr "Miðja å låréttum ås"
#: ../src/ui/dialog/align-and-distribute.cpp:900 ../src/verbs.cpp:3040
#: ../src/verbs.cpp:3041
msgid "Align bottom edges"
-msgstr ""
+msgstr "Jafna neðri jaðra"
#: ../src/ui/dialog/align-and-distribute.cpp:903 ../src/verbs.cpp:3042
#: ../src/verbs.cpp:3043
msgid "Align top edges of objects to the bottom edge of the anchor"
-msgstr ""
+msgstr "Jafna efri jaðra hluta við neðri jaðar festipunktsins"
#: ../src/ui/dialog/align-and-distribute.cpp:908
msgid "Align baseline anchors of texts horizontally"
@@ -13160,35 +13329,35 @@ msgstr "Jafna grunnlĂ­nur texta"
#: ../src/ui/dialog/align-and-distribute.cpp:916
msgid "Make horizontal gaps between objects equal"
-msgstr ""
+msgstr "Gera lårétt millibil hluta jöfn"
#: ../src/ui/dialog/align-and-distribute.cpp:920
msgid "Distribute left edges equidistantly"
-msgstr ""
+msgstr "Dreifa vinstri jöðrum með jöfnu millibili"
#: ../src/ui/dialog/align-and-distribute.cpp:923
msgid "Distribute centers equidistantly horizontally"
-msgstr ""
+msgstr "Dreifa miðjum með jöfnu millibili lårétt"
#: ../src/ui/dialog/align-and-distribute.cpp:926
msgid "Distribute right edges equidistantly"
-msgstr ""
+msgstr "Dreifa hÊgri jöðrum með jöfnu millibili"
#: ../src/ui/dialog/align-and-distribute.cpp:930
msgid "Make vertical gaps between objects equal"
-msgstr ""
+msgstr "Gera lóðrétt millibil hluta jöfn"
#: ../src/ui/dialog/align-and-distribute.cpp:934
msgid "Distribute top edges equidistantly"
-msgstr ""
+msgstr "Dreifa efri jöðrum með jöfnu millibili"
#: ../src/ui/dialog/align-and-distribute.cpp:937
msgid "Distribute centers equidistantly vertically"
-msgstr ""
+msgstr "Dreifa miðjum með jöfnu millibili lóðrétt"
#: ../src/ui/dialog/align-and-distribute.cpp:940
msgid "Distribute bottom edges equidistantly"
-msgstr ""
+msgstr "Dreifa neðri jöðrum með jöfnu millibili"
#: ../src/ui/dialog/align-and-distribute.cpp:945
msgid "Distribute baseline anchors of texts horizontally"
@@ -13205,15 +13374,15 @@ msgstr "Laga fallega til valið tengilínunet"
#: ../src/ui/dialog/align-and-distribute.cpp:957
msgid "Exchange positions of selected objects - selection order"
-msgstr ""
+msgstr "Víxla staðsetningum å völdum hlutum - röð vals"
#: ../src/ui/dialog/align-and-distribute.cpp:960
msgid "Exchange positions of selected objects - stacking order"
-msgstr ""
+msgstr "Víxla staðsetningum å völdum hlutum - röð stöflunar"
#: ../src/ui/dialog/align-and-distribute.cpp:963
msgid "Exchange positions of selected objects - clockwise rotate"
-msgstr ""
+msgstr "VĂ­xla staðsetningum ĂĄ völdum hlutum - snĂșið rĂ©ttsĂŠlis"
#: ../src/ui/dialog/align-and-distribute.cpp:968
msgid "Randomize centers in both dimensions"
@@ -13221,21 +13390,22 @@ msgstr "Slembigera miðjur í båðar åttir"
#: ../src/ui/dialog/align-and-distribute.cpp:971
msgid "Unclump objects: try to equalize edge-to-edge distances"
-msgstr ""
+msgstr "Afklumpa hluti: reyna að jafna Ășt fjarlĂŠgðir jaðar-Ă­-jaðar"
#: ../src/ui/dialog/align-and-distribute.cpp:976
msgid ""
"Move objects as little as possible so that their bounding boxes do not "
"overlap"
msgstr ""
+"FĂŠra hluti eins lĂ­tið og mögulegt er til að umgjarðir ĂŸeirra skarist ekki"
#: ../src/ui/dialog/align-and-distribute.cpp:984
msgid "Align selected nodes to a common horizontal line"
-msgstr ""
+msgstr "Jafna valda hnĂșta ĂĄ sameiginlega lĂĄrĂ©tta lĂ­nu"
#: ../src/ui/dialog/align-and-distribute.cpp:987
msgid "Align selected nodes to a common vertical line"
-msgstr ""
+msgstr "Jafna valda hnĂșta ĂĄ sameiginlega lóðrĂ©tta lĂ­nu"
#: ../src/ui/dialog/align-and-distribute.cpp:990
msgid "Distribute selected nodes horizontally"
@@ -13248,19 +13418,19 @@ msgstr "Dreifa völdum hnĂștum lóðrĂ©tt"
#. Rest of the widgetry
#: ../src/ui/dialog/align-and-distribute.cpp:998
msgid "Last selected"
-msgstr ""
+msgstr "Síðast valinn"
#: ../src/ui/dialog/align-and-distribute.cpp:999
msgid "First selected"
-msgstr ""
+msgstr "Fyrst valinn"
#: ../src/ui/dialog/align-and-distribute.cpp:1000
msgid "Biggest object"
-msgstr ""
+msgstr "StĂŠrsta hlutinn"
#: ../src/ui/dialog/align-and-distribute.cpp:1001
msgid "Smallest object"
-msgstr ""
+msgstr "Minnsta hlutinn"
#: ../src/ui/dialog/align-and-distribute.cpp:1004
msgid "Selection Area"
@@ -13660,7 +13830,7 @@ msgstr "Breyta litblĂŠ flĂ­sar um ĂŸessa prĂłsentu fyrir hverja röð"
#: ../src/ui/dialog/clonetiler.cpp:692
msgid "Change the tile hue by this percentage for each column"
-msgstr "Breyta libblĂŠ flĂ­sar um ĂŸessa prĂłsentu fyrir hvern dĂĄlk"
+msgstr "Breyta litblĂŠ flĂ­sar um ĂŸessa prĂłsentu fyrir hvern dĂĄlk"
#: ../src/ui/dialog/clonetiler.cpp:698
msgid "Randomize the tile hue by this percentage"
@@ -13967,26 +14137,26 @@ msgid ""
"If you want to clone several objects, <b>group</b> them and <b>clone the "
"group</b>."
msgstr ""
-"Ef ĂŸĂș villt klĂłna marga hluti, <b>hĂłpaðu</b> ĂŸĂĄ saman og <b>klĂłnaðu "
-"hĂłpinn</b>."
+"Ef ĂŸĂș villt klĂłna marga hluti, <b>hĂłpaðu</b> ĂŸĂĄ saman og <b>klĂłnaðu hĂłpinn</"
+"b>."
#: ../src/ui/dialog/clonetiler.cpp:2238
msgid "<small>Creating tiled clones...</small>"
msgstr "<small>BĂœ til tigluð klĂłn...</small>"
-#: ../src/ui/dialog/clonetiler.cpp:2651
+#: ../src/ui/dialog/clonetiler.cpp:2654
msgid "Create tiled clones"
msgstr "BĂșa til tiglaða klĂłna"
-#: ../src/ui/dialog/clonetiler.cpp:2884
+#: ../src/ui/dialog/clonetiler.cpp:2887
msgid "<small>Per row:</small>"
msgstr "<small>Á röð:</small>"
-#: ../src/ui/dialog/clonetiler.cpp:2902
+#: ../src/ui/dialog/clonetiler.cpp:2905
msgid "<small>Per column:</small>"
msgstr "<small>Á dålk:</small>"
-#: ../src/ui/dialog/clonetiler.cpp:2910
+#: ../src/ui/dialog/clonetiler.cpp:2913
msgid "<small>Randomize:</small>"
msgstr "<small>Slembigert:</small>"
@@ -14043,287 +14213,287 @@ msgid "Release log messages"
msgstr "Sleppa meldingum"
#: ../src/ui/dialog/document-metadata.cpp:88
-#: ../src/ui/dialog/document-properties.cpp:159
+#: ../src/ui/dialog/document-properties.cpp:166
msgid "Metadata"
msgstr "LĂœsigögn"
#: ../src/ui/dialog/document-metadata.cpp:89
-#: ../src/ui/dialog/document-properties.cpp:160
+#: ../src/ui/dialog/document-properties.cpp:167
msgid "License"
msgstr "Notkunarleyfi"
#: ../src/ui/dialog/document-metadata.cpp:126
-#: ../src/ui/dialog/document-properties.cpp:1007
+#: ../src/ui/dialog/document-properties.cpp:978
msgid "<b>Dublin Core Entities</b>"
msgstr "<b>Dublin Core einindi</b>"
#: ../src/ui/dialog/document-metadata.cpp:168
-#: ../src/ui/dialog/document-properties.cpp:1069
+#: ../src/ui/dialog/document-properties.cpp:1040
msgid "<b>License</b>"
msgstr "<b>Notkunarleyfi</b>"
#. ---------------------------------------------------------------
-#: ../src/ui/dialog/document-properties.cpp:111
+#: ../src/ui/dialog/document-properties.cpp:118
msgid "Use antialiasing"
msgstr "Nota afstöllun"
-#: ../src/ui/dialog/document-properties.cpp:111
+#: ../src/ui/dialog/document-properties.cpp:118
msgid "If unset, no antialiasing will be done on the drawing"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:112
+#: ../src/ui/dialog/document-properties.cpp:119
msgid "Show page _border"
msgstr "SĂœna _jaðar síðu"
-#: ../src/ui/dialog/document-properties.cpp:112
+#: ../src/ui/dialog/document-properties.cpp:119
msgid "If set, rectangular page border is shown"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:113
+#: ../src/ui/dialog/document-properties.cpp:120
msgid "Border on _top of drawing"
msgstr "Jaðar ofan å _teikningu"
-#: ../src/ui/dialog/document-properties.cpp:113
+#: ../src/ui/dialog/document-properties.cpp:120
msgid "If set, border is always on top of the drawing"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:114
+#: ../src/ui/dialog/document-properties.cpp:121
msgid "_Show border shadow"
msgstr "_SĂœna skugga jaðars"
-#: ../src/ui/dialog/document-properties.cpp:114
+#: ../src/ui/dialog/document-properties.cpp:121
msgid "If set, page border shows a shadow on its right and lower side"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:115
+#: ../src/ui/dialog/document-properties.cpp:122
msgid "Back_ground color:"
msgstr "Bak_grunnslitur:"
-#: ../src/ui/dialog/document-properties.cpp:115
+#: ../src/ui/dialog/document-properties.cpp:122
msgid ""
"Color of the page background. Note: transparency setting ignored while "
"editing but used when exporting to bitmap."
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:116
+#: ../src/ui/dialog/document-properties.cpp:123
msgid "Border _color:"
msgstr "Lit_ur jaðars:"
-#: ../src/ui/dialog/document-properties.cpp:116
+#: ../src/ui/dialog/document-properties.cpp:123
msgid "Page border color"
msgstr "Litur síðujaðra"
-#: ../src/ui/dialog/document-properties.cpp:116
+#: ../src/ui/dialog/document-properties.cpp:123
msgid "Color of the page border"
msgstr "Litur å jaðri síðu"
-#: ../src/ui/dialog/document-properties.cpp:117
+#: ../src/ui/dialog/document-properties.cpp:124
msgid "Display _units:"
-msgstr ""
+msgstr "SĂœ_na einingar:"
#. ---------------------------------------------------------------
#. General snap options
-#: ../src/ui/dialog/document-properties.cpp:121
+#: ../src/ui/dialog/document-properties.cpp:128
msgid "Show _guides"
msgstr "SĂœna st_oðlĂ­nur"
-#: ../src/ui/dialog/document-properties.cpp:121
+#: ../src/ui/dialog/document-properties.cpp:128
msgid "Show or hide guides"
msgstr "SĂœna eða fela stoðlĂ­nur"
-#: ../src/ui/dialog/document-properties.cpp:122
+#: ../src/ui/dialog/document-properties.cpp:129
msgid "Guide co_lor:"
msgstr "_Litur stoðlínu:"
-#: ../src/ui/dialog/document-properties.cpp:122
+#: ../src/ui/dialog/document-properties.cpp:129
msgid "Guideline color"
msgstr "Litur stoðlínu"
-#: ../src/ui/dialog/document-properties.cpp:122
+#: ../src/ui/dialog/document-properties.cpp:129
msgid "Color of guidelines"
msgstr "Litur stoðlína"
-#: ../src/ui/dialog/document-properties.cpp:123
+#: ../src/ui/dialog/document-properties.cpp:130
msgid "_Highlight color:"
msgstr "Litur ĂĄ ljĂł_mun:"
-#: ../src/ui/dialog/document-properties.cpp:123
+#: ../src/ui/dialog/document-properties.cpp:130
msgid "Highlighted guideline color"
-msgstr ""
+msgstr "Litur stoðlínu við ljómun"
-#: ../src/ui/dialog/document-properties.cpp:123
+#: ../src/ui/dialog/document-properties.cpp:130
msgid "Color of a guideline when it is under mouse"
msgstr "Litur stoðlĂ­nu ĂŸegar hĂșn er undir mĂșsarbendlinum"
#. ---------------------------------------------------------------
-#: ../src/ui/dialog/document-properties.cpp:125
+#: ../src/ui/dialog/document-properties.cpp:132
msgid "Snap _distance"
msgstr "_GripfjarlÊgð"
-#: ../src/ui/dialog/document-properties.cpp:125
+#: ../src/ui/dialog/document-properties.cpp:132
msgid "Snap only when _closer than:"
-msgstr "GrĂ­pa Ă­ ĂŸegar verið er nĂŠr en:"
+msgstr "Aðeins _grĂ­pa Ă­ ĂŸegar verið er nĂŠr en:"
-#: ../src/ui/dialog/document-properties.cpp:125
-#: ../src/ui/dialog/document-properties.cpp:130
-#: ../src/ui/dialog/document-properties.cpp:135
+#: ../src/ui/dialog/document-properties.cpp:132
+#: ../src/ui/dialog/document-properties.cpp:137
+#: ../src/ui/dialog/document-properties.cpp:142
msgid "Always snap"
msgstr "Alltaf grĂ­pa"
-#: ../src/ui/dialog/document-properties.cpp:126
+#: ../src/ui/dialog/document-properties.cpp:133
msgid "Snapping distance, in screen pixels, for snapping to objects"
-msgstr ""
+msgstr "GripfjarlÊgð, í skjådílum, við grip í hluti"
-#: ../src/ui/dialog/document-properties.cpp:126
+#: ../src/ui/dialog/document-properties.cpp:133
msgid "Always snap to objects, regardless of their distance"
-msgstr ""
+msgstr "Alltaf grípa í hluti, sama hver fjarlÊgðin er"
-#: ../src/ui/dialog/document-properties.cpp:127
+#: ../src/ui/dialog/document-properties.cpp:134
msgid ""
"If set, objects only snap to another object when it's within the range "
"specified below"
msgstr ""
#. Options for snapping to grids
-#: ../src/ui/dialog/document-properties.cpp:130
+#: ../src/ui/dialog/document-properties.cpp:137
msgid "Snap d_istance"
msgstr "Gri_pfjarlÊgð"
-#: ../src/ui/dialog/document-properties.cpp:130
+#: ../src/ui/dialog/document-properties.cpp:137
msgid "Snap only when c_loser than:"
-msgstr "G_rĂ­pa Ă­ ĂŸegar verið er nĂŠr en:"
+msgstr "Aðeins grĂ­_pa Ă­ ĂŸegar verið er nĂŠr en:"
-#: ../src/ui/dialog/document-properties.cpp:131
+#: ../src/ui/dialog/document-properties.cpp:138
msgid "Snapping distance, in screen pixels, for snapping to grid"
-msgstr ""
+msgstr "GripfjarlÊgð, í skjådílum, við grip í hnitanet"
-#: ../src/ui/dialog/document-properties.cpp:131
+#: ../src/ui/dialog/document-properties.cpp:138
msgid "Always snap to grids, regardless of the distance"
-msgstr ""
+msgstr "Alltaf grípa í hnitanet, sama hver fjarlÊgðin er"
-#: ../src/ui/dialog/document-properties.cpp:132
+#: ../src/ui/dialog/document-properties.cpp:139
msgid ""
"If set, objects only snap to a grid line when it's within the range "
"specified below"
msgstr ""
#. Options for snapping to guides
-#: ../src/ui/dialog/document-properties.cpp:135
+#: ../src/ui/dialog/document-properties.cpp:142
msgid "Snap dist_ance"
msgstr "Grip_fjarlÊgð"
-#: ../src/ui/dialog/document-properties.cpp:135
+#: ../src/ui/dialog/document-properties.cpp:142
msgid "Snap only when close_r than:"
msgstr "GrĂ­pa Ă­ ĂŸegar verið er nĂŠr _en:"
-#: ../src/ui/dialog/document-properties.cpp:136
+#: ../src/ui/dialog/document-properties.cpp:143
msgid "Snapping distance, in screen pixels, for snapping to guides"
-msgstr ""
+msgstr "GripfjarlÊgð, í skjådílum, við grip í stoðlínur"
-#: ../src/ui/dialog/document-properties.cpp:136
+#: ../src/ui/dialog/document-properties.cpp:143
msgid "Always snap to guides, regardless of the distance"
-msgstr ""
+msgstr "Alltaf grípa í stoðlínur, sama hver fjarlÊgðin er"
-#: ../src/ui/dialog/document-properties.cpp:137
+#: ../src/ui/dialog/document-properties.cpp:144
msgid ""
"If set, objects only snap to a guide when it's within the range specified "
"below"
msgstr ""
#. ---------------------------------------------------------------
-#: ../src/ui/dialog/document-properties.cpp:140
+#: ../src/ui/dialog/document-properties.cpp:147
msgid "Snap to clip paths"
-msgstr ""
+msgstr "Grípa í afmörkunarferla"
-#: ../src/ui/dialog/document-properties.cpp:140
+#: ../src/ui/dialog/document-properties.cpp:147
msgid "When snapping to paths, then also try snapping to clip paths"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:141
+#: ../src/ui/dialog/document-properties.cpp:148
msgid "Snap to mask paths"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:141
+#: ../src/ui/dialog/document-properties.cpp:148
msgid "When snapping to paths, then also try snapping to mask paths"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:142
+#: ../src/ui/dialog/document-properties.cpp:149
msgid "Snap perpendicularly"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:142
+#: ../src/ui/dialog/document-properties.cpp:149
msgid ""
"When snapping to paths or guides, then also try snapping perpendicularly"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:143
+#: ../src/ui/dialog/document-properties.cpp:150
msgid "Snap tangentially"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:143
+#: ../src/ui/dialog/document-properties.cpp:150
msgid "When snapping to paths or guides, then also try snapping tangentially"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:146
+#: ../src/ui/dialog/document-properties.cpp:153
msgctxt "Grid"
msgid "_New"
msgstr "_NĂœtt"
-#: ../src/ui/dialog/document-properties.cpp:146
+#: ../src/ui/dialog/document-properties.cpp:153
msgid "Create new grid."
msgstr "BĂșa til nĂœtt hnitanet."
-#: ../src/ui/dialog/document-properties.cpp:147
+#: ../src/ui/dialog/document-properties.cpp:154
msgctxt "Grid"
msgid "_Remove"
msgstr "_FjarlĂŠgja"
-#: ../src/ui/dialog/document-properties.cpp:147
+#: ../src/ui/dialog/document-properties.cpp:154
msgid "Remove selected grid."
msgstr "FjarlÊgja valið hnitanet."
-#: ../src/ui/dialog/document-properties.cpp:154
-#: ../src/widgets/toolbox.cpp:1834
+#: ../src/ui/dialog/document-properties.cpp:161
+#: ../src/widgets/toolbox.cpp:1836
msgid "Guides"
msgstr "Stoðlínur"
-#: ../src/ui/dialog/document-properties.cpp:156 ../src/verbs.cpp:2827
+#: ../src/ui/dialog/document-properties.cpp:163 ../src/verbs.cpp:2827
msgid "Snap"
msgstr "Grip"
-#: ../src/ui/dialog/document-properties.cpp:158
+#: ../src/ui/dialog/document-properties.cpp:165
msgid "Scripting"
msgstr "Skriftun"
-#: ../src/ui/dialog/document-properties.cpp:322
+#: ../src/ui/dialog/document-properties.cpp:329
msgid "<b>General</b>"
msgstr "<b>Almennt</b>"
-#: ../src/ui/dialog/document-properties.cpp:324
+#: ../src/ui/dialog/document-properties.cpp:331
msgid "<b>Page Size</b>"
msgstr "<b>BlaðsíðustÊrð</b>"
-#: ../src/ui/dialog/document-properties.cpp:326
+#: ../src/ui/dialog/document-properties.cpp:333
msgid "<b>Display</b>"
msgstr "<b>Birting</b>"
-#: ../src/ui/dialog/document-properties.cpp:361
+#: ../src/ui/dialog/document-properties.cpp:368
msgid "<b>Guides</b>"
msgstr "<b>Stoðlínur</b>"
-#: ../src/ui/dialog/document-properties.cpp:379
+#: ../src/ui/dialog/document-properties.cpp:386
msgid "<b>Snap to objects</b>"
msgstr "<b>GrĂ­pa Ă­ hluti</b>"
-#: ../src/ui/dialog/document-properties.cpp:381
+#: ../src/ui/dialog/document-properties.cpp:388
msgid "<b>Snap to grids</b>"
msgstr "<b>GrĂ­pa Ă­ hnitanet</b>"
-#: ../src/ui/dialog/document-properties.cpp:383
+#: ../src/ui/dialog/document-properties.cpp:390
msgid "<b>Snap to guides</b>"
msgstr "<b>Grípa í stoðlínur</b>"
-#: ../src/ui/dialog/document-properties.cpp:385
+#: ../src/ui/dialog/document-properties.cpp:392
msgid "<b>Miscellaneous</b>"
msgstr "<b>Ýmislegt</b>"
@@ -14331,135 +14501,135 @@ msgstr "<b>Ýmislegt</b>"
#. Inkscape::GC::release(defsRepr);
#. inform the document, so we can undo
#. Color Management
-#: ../src/ui/dialog/document-properties.cpp:498 ../src/verbs.cpp:3008
+#: ../src/ui/dialog/document-properties.cpp:505 ../src/verbs.cpp:3008
msgid "Link Color Profile"
msgstr "Tengja litasnið"
-#: ../src/ui/dialog/document-properties.cpp:599
+#: ../src/ui/dialog/document-properties.cpp:606
msgid "Remove linked color profile"
msgstr "FjarlÊgja tengt litasnið"
-#: ../src/ui/dialog/document-properties.cpp:613
+#: ../src/ui/dialog/document-properties.cpp:620
msgid "<b>Linked Color Profiles:</b>"
msgstr "<b>Tengd litasnið:</b>"
-#: ../src/ui/dialog/document-properties.cpp:615
+#: ../src/ui/dialog/document-properties.cpp:622
msgid "<b>Available Color Profiles:</b>"
msgstr "<b>TiltÊk litasnið:</b>"
-#: ../src/ui/dialog/document-properties.cpp:617
+#: ../src/ui/dialog/document-properties.cpp:624
msgid "Link Profile"
msgstr "Tengja litasnið"
-#: ../src/ui/dialog/document-properties.cpp:626
+#: ../src/ui/dialog/document-properties.cpp:627
msgid "Unlink Profile"
msgstr "Aftengja litasnið"
-#: ../src/ui/dialog/document-properties.cpp:710
+#: ../src/ui/dialog/document-properties.cpp:705
msgid "Profile Name"
msgstr "Heiti litasniðs"
-#: ../src/ui/dialog/document-properties.cpp:746
+#: ../src/ui/dialog/document-properties.cpp:741
msgid "External scripts"
msgstr "Ytri skriftuskrĂĄr"
-#: ../src/ui/dialog/document-properties.cpp:747
+#: ../src/ui/dialog/document-properties.cpp:742
msgid "Embedded scripts"
-msgstr ""
+msgstr "ívafðar skriftur"
-#: ../src/ui/dialog/document-properties.cpp:752
+#: ../src/ui/dialog/document-properties.cpp:747
msgid "<b>External script files:</b>"
msgstr "<b>Ytri skriftuskrĂĄr:</b>"
-#: ../src/ui/dialog/document-properties.cpp:754
+#: ../src/ui/dialog/document-properties.cpp:749
msgid "Add the current file name or browse for a file"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:763
-#: ../src/ui/dialog/document-properties.cpp:852
+#: ../src/ui/dialog/document-properties.cpp:752
+#: ../src/ui/dialog/document-properties.cpp:829
#: ../src/ui/widget/selected-style.cpp:356
msgid "Remove"
msgstr "FjarlĂŠgja"
-#: ../src/ui/dialog/document-properties.cpp:833
+#: ../src/ui/dialog/document-properties.cpp:816
msgid "Filename"
msgstr "SkrĂĄarheiti"
-#: ../src/ui/dialog/document-properties.cpp:841
+#: ../src/ui/dialog/document-properties.cpp:824
msgid "<b>Embedded script files:</b>"
-msgstr ""
+msgstr "<b>Ívafðar skriftuskrár:</b>"
-#: ../src/ui/dialog/document-properties.cpp:843
+#: ../src/ui/dialog/document-properties.cpp:826
msgid "New"
msgstr "NĂœtt"
-#: ../src/ui/dialog/document-properties.cpp:922
+#: ../src/ui/dialog/document-properties.cpp:893
msgid "Script id"
-msgstr ""
+msgstr "Auðkenni skriftu"
-#: ../src/ui/dialog/document-properties.cpp:928
+#: ../src/ui/dialog/document-properties.cpp:899
msgid "<b>Content:</b>"
msgstr "<b>Innihald:</b>"
-#: ../src/ui/dialog/document-properties.cpp:1045
+#: ../src/ui/dialog/document-properties.cpp:1016
msgid "_Save as default"
msgstr "Vi_sta sem sjålfgefið"
-#: ../src/ui/dialog/document-properties.cpp:1046
+#: ../src/ui/dialog/document-properties.cpp:1017
msgid "Save this metadata as the default metadata"
msgstr ""
-#: ../src/ui/dialog/document-properties.cpp:1047
+#: ../src/ui/dialog/document-properties.cpp:1018
msgid "Use _default"
msgstr "Nota _sjålfgefið"
-#: ../src/ui/dialog/document-properties.cpp:1048
+#: ../src/ui/dialog/document-properties.cpp:1019
msgid "Use the previously saved default metadata here"
msgstr ""
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1121
+#: ../src/ui/dialog/document-properties.cpp:1092
msgid "Add external script..."
msgstr "BÊta við ytri skriftuskrå..."
-#: ../src/ui/dialog/document-properties.cpp:1160
+#: ../src/ui/dialog/document-properties.cpp:1131
msgid "Select a script to load"
-msgstr ""
+msgstr "Veldu skriftu til að hlaða inn"
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1188
+#: ../src/ui/dialog/document-properties.cpp:1159
msgid "Add embedded script..."
-msgstr ""
+msgstr "BÊta við ívafinni skriftu..."
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1219
+#: ../src/ui/dialog/document-properties.cpp:1190
msgid "Remove external script"
msgstr "FjarlĂŠgja skriftuskrĂĄ"
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1249
+#: ../src/ui/dialog/document-properties.cpp:1220
msgid "Remove embedded script"
-msgstr ""
+msgstr "FjarlÊgja ívafða skriftu"
#. TODO repr->set_content(_EmbeddedContent.get_buffer()->get_text());
#. inform the document, so we can undo
-#: ../src/ui/dialog/document-properties.cpp:1346
+#: ../src/ui/dialog/document-properties.cpp:1317
msgid "Edit embedded script"
-msgstr ""
+msgstr "Breyta Ă­vafinni skriftu"
-#: ../src/ui/dialog/document-properties.cpp:1434
+#: ../src/ui/dialog/document-properties.cpp:1405
msgid "<b>Creation</b>"
msgstr "<b>ÚtbĂșa</b>"
-#: ../src/ui/dialog/document-properties.cpp:1435
+#: ../src/ui/dialog/document-properties.cpp:1406
msgid "<b>Defined grids</b>"
msgstr "<b>Skilgreind hnitanet</b>"
-#: ../src/ui/dialog/document-properties.cpp:1682
+#: ../src/ui/dialog/document-properties.cpp:1653
msgid "Remove grid"
msgstr "FjarlĂŠgja hnitanet"
-#: ../src/ui/dialog/document-properties.cpp:1770
+#: ../src/ui/dialog/document-properties.cpp:1741
msgid "Changed default display unit"
msgstr ""
@@ -14491,7 +14661,7 @@ msgstr "_Flytja Ășt sem..."
#: ../src/ui/dialog/export.cpp:174
msgid "B_atch export all selected objects"
-msgstr "Magnflytja Ășt alla valda hluti"
+msgstr "_Magnflytja Ășt alla valda hluti"
#: ../src/ui/dialog/export.cpp:174
msgid ""
@@ -14515,7 +14685,7 @@ msgstr "Loka ĂŸegar er bĂșið"
#: ../src/ui/dialog/export.cpp:177
msgid "Once the export completes, close this dialog"
-msgstr ""
+msgstr "Loka ĂŸessum skilaboðaglugga ĂŸegar Ăștflutningi er lokið"
#: ../src/ui/dialog/export.cpp:179
msgid "_Export"
@@ -14585,8 +14755,8 @@ msgstr "Flytja Ășt bitamyndarskrĂĄ með ĂŸessum stillingum"
#, c-format
msgid "B_atch export %d selected object"
msgid_plural "B_atch export %d selected objects"
-msgstr[0] "Magnflytja Ășt %d valinn hlut"
-msgstr[1] "Magnflytja Ășt %d valda hluti"
+msgstr[0] "M_agnflytja Ășt %d valinn hlut"
+msgstr[1] "M_agnflytja Ășt %d valda hluti"
#: ../src/ui/dialog/export.cpp:927
msgid "Export in progress"
@@ -14613,7 +14783,7 @@ msgstr "Gat ekki flutt Ășt Ă­ skrĂĄarnafnið %s.\n"
#: ../src/ui/dialog/export.cpp:1077
#, c-format
msgid "Could not export to filename <b>%s</b>."
-msgstr ""
+msgstr "Gat ekki flutt Ășt Ă­ skrĂĄarheitið <b>%s</b>."
#: ../src/ui/dialog/export.cpp:1092
#, c-format
@@ -14781,12 +14951,12 @@ msgstr "Allar bitamyndir"
#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1042
#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1600
msgid "Append filename extension automatically"
-msgstr ""
+msgstr "BÊta skråarendingu við sjålfkrafa"
#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1215
#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1468
msgid "Guess from extension"
-msgstr ""
+msgstr "Giska Ășt frĂĄ endingu"
#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1487
msgid "Left edge of source"
@@ -14822,10 +14992,12 @@ msgstr ""
#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1495
msgid "Resolution (dots per inch)"
-msgstr ""
+msgstr "Upplausn (mynddílar å tommu - PÁT)"
-#. #########################################. ## EXTRA WIDGET -- SOURCE SIDE
-#. #########################################. ##### Export options buttons/spinners, etc
+#. #########################################
+#. ## EXTRA WIDGET -- SOURCE SIDE
+#. #########################################
+#. ##### Export options buttons/spinners, etc
#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1533
msgid "Document"
msgstr "Skjal"
@@ -14863,7 +15035,7 @@ msgstr "Forskoða"
#: ../src/ui/dialog/filedialogimpl-win32.cpp:744
msgid "No file selected"
-msgstr ""
+msgstr "Engin skrĂĄ valin"
#: ../src/ui/dialog/fill-and-stroke.cpp:62
msgid "_Fill"
@@ -14898,7 +15070,7 @@ msgstr "MyndskrĂĄ"
#: ../src/ui/dialog/filter-effects-dialog.cpp:659
msgid "Selected SVG Element"
-msgstr ""
+msgstr "Valið SVG eigindi"
#. TODO: any image, not just svg
#: ../src/ui/dialog/filter-effects-dialog.cpp:729
@@ -14974,11 +15146,11 @@ msgstr "Z hnit"
#: ../src/ui/dialog/filter-effects-dialog.cpp:1205
msgid "Points At"
-msgstr ""
+msgstr "Beinist að"
#: ../src/ui/dialog/filter-effects-dialog.cpp:1206
msgid "Specular Exponent"
-msgstr ""
+msgstr "VeldisvĂ­sir endurkasts"
#: ../src/ui/dialog/filter-effects-dialog.cpp:1206
msgid "Exponent value controlling the focus for the light source"
@@ -14998,7 +15170,7 @@ msgstr ""
#: ../src/ui/dialog/filter-effects-dialog.cpp:1274
msgid "New light source"
-msgstr ""
+msgstr "NĂœr ljĂłsgjafi"
#: ../src/ui/dialog/filter-effects-dialog.cpp:1325
msgid "_Duplicate"
@@ -15034,7 +15206,7 @@ msgstr ""
#: ../src/ui/dialog/filter-effects-dialog.cpp:1793
msgid "_Effect"
-msgstr "SjĂłnbrella"
+msgstr "SjĂłn_brella"
#: ../src/ui/dialog/filter-effects-dialog.cpp:1803
msgid "Connections"
@@ -15054,11 +15226,11 @@ msgstr ""
#: ../src/ui/dialog/filter-effects-dialog.cpp:2729
msgid "Add Effect:"
-msgstr ""
+msgstr "BÊta við sjónhverfingu:"
#: ../src/ui/dialog/filter-effects-dialog.cpp:2730
msgid "No effect selected"
-msgstr ""
+msgstr "Engin brella valin"
#: ../src/ui/dialog/filter-effects-dialog.cpp:2731
msgid "No filter selected"
@@ -15066,7 +15238,7 @@ msgstr "Engin sĂ­a valin"
#: ../src/ui/dialog/filter-effects-dialog.cpp:2776
msgid "Effect parameters"
-msgstr ""
+msgstr "Viðföng sjónbrellu"
#: ../src/ui/dialog/filter-effects-dialog.cpp:2777
msgid "Filter General Settings"
@@ -15094,11 +15266,11 @@ msgstr "Hlutföll:"
#: ../src/ui/dialog/filter-effects-dialog.cpp:2836
msgid "Width of filter effects region"
-msgstr ""
+msgstr "Breidd åhrifasvÊðis síu"
#: ../src/ui/dialog/filter-effects-dialog.cpp:2836
msgid "Height of filter effects region"
-msgstr ""
+msgstr "HÊð åhrifasvÊðis síu"
#: ../src/ui/dialog/filter-effects-dialog.cpp:2842
msgid ""
@@ -15194,7 +15366,7 @@ msgstr ""
#. TRANSLATORS: for info on "Kernel", see http://en.wikipedia.org/wiki/Kernel_(matrix)
#: ../src/ui/dialog/filter-effects-dialog.cpp:2863
msgid "Kernel:"
-msgstr ""
+msgstr "Kjarni:"
#: ../src/ui/dialog/filter-effects-dialog.cpp:2863
msgid ""
@@ -15241,7 +15413,7 @@ msgstr ""
#: ../src/ui/dialog/filter-effects-dialog.cpp:2868
msgid "Preserve Alpha"
-msgstr "Varðveita Alfa"
+msgstr "Varðveita alfa"
#: ../src/ui/dialog/filter-effects-dialog.cpp:2868
msgid "If set, the alpha channel won't be altered by this filter primitive."
@@ -15510,316 +15682,318 @@ msgstr ""
msgid "Set filter primitive attribute"
msgstr ""
-#: ../src/ui/dialog/find.cpp:71
+#: ../src/ui/dialog/find.cpp:72
msgid "F_ind:"
msgstr "F_inna:"
-#: ../src/ui/dialog/find.cpp:71
+#: ../src/ui/dialog/find.cpp:72
msgid "Find objects by their content or properties (exact or partial match)"
msgstr ""
-#: ../src/ui/dialog/find.cpp:72
+#: ../src/ui/dialog/find.cpp:73
msgid "R_eplace:"
-msgstr "Skipt_a Ășt"
+msgstr "Skipt_a Ășt:"
-#: ../src/ui/dialog/find.cpp:72
+#: ../src/ui/dialog/find.cpp:73
msgid "Replace match with this value"
msgstr ""
-#: ../src/ui/dialog/find.cpp:74
+#: ../src/ui/dialog/find.cpp:75
msgid "_All"
msgstr "_Allt"
-#: ../src/ui/dialog/find.cpp:74
+#: ../src/ui/dialog/find.cpp:75
msgid "Search in all layers"
msgstr ""
-#: ../src/ui/dialog/find.cpp:75
+#: ../src/ui/dialog/find.cpp:76
msgid "Current _layer"
msgstr "NĂșverandi _lag"
-#: ../src/ui/dialog/find.cpp:75
+#: ../src/ui/dialog/find.cpp:76
msgid "Limit search to the current layer"
msgstr "Takmarka leit við nĂșverandi lag"
-#: ../src/ui/dialog/find.cpp:76
+#: ../src/ui/dialog/find.cpp:77
msgid "Sele_ction"
msgstr "Myn_dval"
-#: ../src/ui/dialog/find.cpp:76
+#: ../src/ui/dialog/find.cpp:77
msgid "Limit search to the current selection"
-msgstr ""
+msgstr "Takmarka leit við nĂșverandi val"
-#: ../src/ui/dialog/find.cpp:77
+#: ../src/ui/dialog/find.cpp:78
msgid "Search in text objects"
msgstr ""
-#: ../src/ui/dialog/find.cpp:78
+#: ../src/ui/dialog/find.cpp:79
msgid "_Properties"
msgstr "_Eiginleikar"
-#: ../src/ui/dialog/find.cpp:78
+#: ../src/ui/dialog/find.cpp:79
msgid "Search in object properties, styles, attributes and IDs"
msgstr ""
-#: ../src/ui/dialog/find.cpp:80
+#: ../src/ui/dialog/find.cpp:81
msgid "Search in"
msgstr "Leita Ă­"
-#: ../src/ui/dialog/find.cpp:81
+#: ../src/ui/dialog/find.cpp:82
msgid "Scope"
msgstr "Umfang"
-#: ../src/ui/dialog/find.cpp:83
+#: ../src/ui/dialog/find.cpp:84
msgid "Case sensiti_ve"
msgstr "_NÊmt fyrir hå og lågstöfum"
-#: ../src/ui/dialog/find.cpp:83
+#: ../src/ui/dialog/find.cpp:84
msgid "Match upper/lower case"
msgstr "Passa við stafstöðu"
-#: ../src/ui/dialog/find.cpp:84
+#: ../src/ui/dialog/find.cpp:85
msgid "E_xact match"
msgstr "Nå_kvÊm samsvörun"
-#: ../src/ui/dialog/find.cpp:84
+#: ../src/ui/dialog/find.cpp:85
msgid "Match whole objects only"
msgstr "Passa eingöngu við heila hluti"
-#: ../src/ui/dialog/find.cpp:85
+#: ../src/ui/dialog/find.cpp:86
msgid "Include _hidden"
msgstr "Hafa með _falið"
-#: ../src/ui/dialog/find.cpp:85
+#: ../src/ui/dialog/find.cpp:86
msgid "Include hidden objects in search"
-msgstr ""
+msgstr "Hafa falda hluti með í leit"
-#: ../src/ui/dialog/find.cpp:86
+#: ../src/ui/dialog/find.cpp:87
msgid "Include loc_ked"
msgstr "Hafa með _lÊst"
-#: ../src/ui/dialog/find.cpp:86
+#: ../src/ui/dialog/find.cpp:87
msgid "Include locked objects in search"
-msgstr ""
+msgstr "Hafa lÊsta hluti með í leit"
-#: ../src/ui/dialog/find.cpp:88
+#: ../src/ui/dialog/find.cpp:89
msgid "General"
msgstr "Almennt"
-#: ../src/ui/dialog/find.cpp:90
+#: ../src/ui/dialog/find.cpp:91
msgid "_ID"
msgstr "Auðkenni (_ID)"
-#: ../src/ui/dialog/find.cpp:90
+#: ../src/ui/dialog/find.cpp:91
msgid "Search id name"
msgstr ""
-#: ../src/ui/dialog/find.cpp:91
+#: ../src/ui/dialog/find.cpp:92
msgid "Attribute _name"
msgstr ""
-#: ../src/ui/dialog/find.cpp:91
+#: ../src/ui/dialog/find.cpp:92
msgid "Search attribute name"
msgstr ""
-#: ../src/ui/dialog/find.cpp:92
+#: ../src/ui/dialog/find.cpp:93
msgid "Attri_bute value"
msgstr ""
-#: ../src/ui/dialog/find.cpp:92
+#: ../src/ui/dialog/find.cpp:93
msgid "Search attribute value"
msgstr ""
-#: ../src/ui/dialog/find.cpp:93
+#: ../src/ui/dialog/find.cpp:94
msgid "_Style"
msgstr "_StĂ­ll"
-#: ../src/ui/dialog/find.cpp:93
+#: ../src/ui/dialog/find.cpp:94
msgid "Search style"
-msgstr ""
+msgstr "Leita að stíl"
-#: ../src/ui/dialog/find.cpp:94
+#: ../src/ui/dialog/find.cpp:95
msgid "F_ont"
msgstr "_Letur"
-#: ../src/ui/dialog/find.cpp:94
+#: ../src/ui/dialog/find.cpp:95
msgid "Search fonts"
-msgstr ""
+msgstr "Leita að letri"
-#: ../src/ui/dialog/find.cpp:95
+#: ../src/ui/dialog/find.cpp:96
msgid "Properties"
msgstr "Eiginleikar"
-#: ../src/ui/dialog/find.cpp:97
+#: ../src/ui/dialog/find.cpp:98
msgid "All types"
msgstr "Allar tegundir"
-#: ../src/ui/dialog/find.cpp:97
+#: ../src/ui/dialog/find.cpp:98
msgid "Search all object types"
msgstr "Leita í öllum tegundum hluta"
-#: ../src/ui/dialog/find.cpp:98
+#: ../src/ui/dialog/find.cpp:99
msgid "Rectangles"
msgstr "Rétthyrningar"
-#: ../src/ui/dialog/find.cpp:98
+#: ../src/ui/dialog/find.cpp:99
msgid "Search rectangles"
msgstr "Leita í rétthyrningum"
-#: ../src/ui/dialog/find.cpp:99
+#: ../src/ui/dialog/find.cpp:100
msgid "Ellipses"
msgstr "Sporbaugar"
-#: ../src/ui/dialog/find.cpp:99
+#: ../src/ui/dialog/find.cpp:100
msgid "Search ellipses, arcs, circles"
msgstr "Leita Ă­ sporbaugum, hringgeirum og hringum"
-#: ../src/ui/dialog/find.cpp:100
+#: ../src/ui/dialog/find.cpp:101
msgid "Stars"
msgstr "Stjörnur"
-#: ../src/ui/dialog/find.cpp:100
+#: ../src/ui/dialog/find.cpp:101
msgid "Search stars and polygons"
msgstr "Leita í stjörnum og marghyrningum"
-#: ../src/ui/dialog/find.cpp:101
+#: ../src/ui/dialog/find.cpp:102
msgid "Spirals"
msgstr "SpĂ­ralar"
-#: ../src/ui/dialog/find.cpp:101
+#: ../src/ui/dialog/find.cpp:102
msgid "Search spirals"
msgstr "Leita í spírölum"
-#: ../src/ui/dialog/find.cpp:102 ../src/widgets/toolbox.cpp:1735
+#: ../src/ui/dialog/find.cpp:103 ../src/widgets/toolbox.cpp:1737
msgid "Paths"
msgstr "Ferlar"
-#: ../src/ui/dialog/find.cpp:102
+#: ../src/ui/dialog/find.cpp:103
msgid "Search paths, lines, polylines"
msgstr "Leita í ferlum, línum og fjöllínum"
-#: ../src/ui/dialog/find.cpp:103
+#: ../src/ui/dialog/find.cpp:104
msgid "Texts"
msgstr "Textar"
-#: ../src/ui/dialog/find.cpp:103
+#: ../src/ui/dialog/find.cpp:104
msgid "Search text objects"
msgstr "Leita Ă­ textahlutum"
-#: ../src/ui/dialog/find.cpp:104
+#: ../src/ui/dialog/find.cpp:105
msgid "Groups"
msgstr "HĂłpar"
-#: ../src/ui/dialog/find.cpp:104
+#: ../src/ui/dialog/find.cpp:105
msgid "Search groups"
msgstr "Leita Ă­ hĂłpum"
#. TRANSLATORS: "Clones" is a noun indicating type of object to find
-#: ../src/ui/dialog/find.cpp:107
+#: ../src/ui/dialog/find.cpp:108
msgctxt "Find dialog"
msgid "Clones"
msgstr "KlĂłnar"
-#: ../src/ui/dialog/find.cpp:107
+#: ../src/ui/dialog/find.cpp:108
msgid "Search clones"
msgstr "Leita Ă­ klĂłnum"
-#: ../src/ui/dialog/find.cpp:109 ../share/extensions/embedimage.inx.h:3
+#: ../src/ui/dialog/find.cpp:110 ../share/extensions/embedimage.inx.h:3
#: ../share/extensions/extractimage.inx.h:5
msgid "Images"
msgstr "Myndir"
-#: ../src/ui/dialog/find.cpp:109
+#: ../src/ui/dialog/find.cpp:110
msgid "Search images"
msgstr "Leita Ă­ myndum"
-#: ../src/ui/dialog/find.cpp:110
+#: ../src/ui/dialog/find.cpp:111
msgid "Offsets"
msgstr "Hliðranir"
-#: ../src/ui/dialog/find.cpp:110
+#: ../src/ui/dialog/find.cpp:111
msgid "Search offset objects"
msgstr "Leita í hliðruðum hlutum"
-#: ../src/ui/dialog/find.cpp:111
+#: ../src/ui/dialog/find.cpp:112
msgid "Object types"
msgstr "Tegundir hluta"
-#: ../src/ui/dialog/find.cpp:114
+#: ../src/ui/dialog/find.cpp:115
msgid "_Find"
msgstr "_Leita"
-#: ../src/ui/dialog/find.cpp:114
+#: ../src/ui/dialog/find.cpp:115
msgid "Select all objects matching the selection criteria"
-msgstr ""
+msgstr "Velja alla hluti sem samsvara valskilyrðum"
-#: ../src/ui/dialog/find.cpp:115
+#: ../src/ui/dialog/find.cpp:116
msgid "_Replace All"
msgstr "S_kipta Ășt öllu"
-#: ../src/ui/dialog/find.cpp:115
+#: ../src/ui/dialog/find.cpp:116
msgid "Replace all matches"
msgstr "Skipta Ășt öllum samsvörunum"
-#: ../src/ui/dialog/find.cpp:797
+#: ../src/ui/dialog/find.cpp:801
msgid "Nothing to replace"
msgstr "Ekkert sem skipta mĂĄ Ășt"
#. TRANSLATORS: "%s" is replaced with "exact" or "partial" when this string is displayed
-#: ../src/ui/dialog/find.cpp:838
+#: ../src/ui/dialog/find.cpp:842
#, c-format
msgid "<b>%d</b> object found (out of <b>%d</b>), %s match."
msgid_plural "<b>%d</b> objects found (out of <b>%d</b>), %s match."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "<b>%d</b> hlutur fannst (af <b>%d</b>), %s samsvörun."
+msgstr[1] "<b>%d</b> hlutir fundust (af <b>%d</b>), %s samsvörun."
-#: ../src/ui/dialog/find.cpp:841
+#: ../src/ui/dialog/find.cpp:845
msgid "exact"
msgstr "nĂĄkvĂŠmlega"
-#: ../src/ui/dialog/find.cpp:841
+#: ../src/ui/dialog/find.cpp:845
msgid "partial"
msgstr "að hluta"
#. TRANSLATORS: "%1" is replaced with the number of matches
-#: ../src/ui/dialog/find.cpp:844
+#: ../src/ui/dialog/find.cpp:848
msgid "%1 match replaced"
msgid_plural "%1 matches replaced"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 samsvörun skipt Ășt"
+msgstr[1] "%1 samsvörunum skipt Ășt"
#. TRANSLATORS: "%1" is replaced with the number of matches
-#: ../src/ui/dialog/find.cpp:848
+#: ../src/ui/dialog/find.cpp:852
msgid "%1 object found"
msgid_plural "%1 objects found"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 hlutur fannst"
+msgstr[1] "%1 hlutir fundust"
-#: ../src/ui/dialog/find.cpp:862
+#: ../src/ui/dialog/find.cpp:866
msgid "Replace text or property"
-msgstr ""
+msgstr "Skipta Ășt texta eða eiginleika"
-#: ../src/ui/dialog/find.cpp:866
+#: ../src/ui/dialog/find.cpp:870
msgid "Nothing found"
-msgstr ""
+msgstr "Ekkert fannst"
-#: ../src/ui/dialog/find.cpp:871
+#: ../src/ui/dialog/find.cpp:875
msgid "No objects found"
msgstr "Engir hlutir fundust"
-#: ../src/ui/dialog/find.cpp:892
+#: ../src/ui/dialog/find.cpp:896
msgid "Select an object type"
-msgstr ""
+msgstr "Veldu tegund hlutar"
-#: ../src/ui/dialog/find.cpp:910
+#: ../src/ui/dialog/find.cpp:914
msgid "Select a property"
-msgstr ""
+msgstr "Veldu eiginleika"
#: ../src/ui/dialog/font-substitution.cpp:87
msgid ""
"\n"
"Some fonts are not available and have been substituted."
msgstr ""
+"\n"
+"Sumt letur er ekki tiltĂŠkt og hefur ĂŸvĂ­ verið skipt Ășt."
#: ../src/ui/dialog/font-substitution.cpp:90
msgid "Font substitution"
@@ -15827,15 +16001,15 @@ msgstr "Útskipting á letri"
#: ../src/ui/dialog/font-substitution.cpp:109
msgid "Select all the affected items"
-msgstr ""
+msgstr "Velja alla viðkomandi hluti"
#: ../src/ui/dialog/font-substitution.cpp:114
msgid "Don't show this warning again"
-msgstr ""
+msgstr "Ekki birta ĂŸessa aðvörun aftur"
#: ../src/ui/dialog/font-substitution.cpp:255
msgid "Font '%1' substituted with '%2'"
-msgstr ""
+msgstr "Letrinu '%1' skipt Ășt fyrir '%2'"
#: ../src/ui/dialog/glyphs.cpp:60 ../src/ui/dialog/glyphs.cpp:152
msgid "all"
@@ -16604,7 +16778,8 @@ msgstr "Jöfn _hÊð"
msgid "If not set, each row has the height of the tallest object in it"
msgstr ""
-#. #### Number of columns ####: ../src/ui/dialog/grid-arrange-tab.cpp:666
+#. #### Number of columns ####
+#: ../src/ui/dialog/grid-arrange-tab.cpp:666
msgid "_Columns:"
msgstr "_DĂĄlkar:"
@@ -16625,7 +16800,8 @@ msgstr ""
msgid "Alignment:"
msgstr "Jöfnun:"
-#. #### Radio buttons to control spacing manually or to fit selection bbox ####: ../src/ui/dialog/grid-arrange-tab.cpp:709
+#. #### Radio buttons to control spacing manually or to fit selection bbox ####
+#: ../src/ui/dialog/grid-arrange-tab.cpp:709
msgid "_Fit into selection box"
msgstr "_Laga að valsvÊði"
@@ -16732,7 +16908,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:204
msgid "Ctrl+click _dot size:"
-msgstr "Ctrl+smella punktstÊrð:"
+msgstr "Ctrl+smella _punktstÊrð:"
#: ../src/ui/dialog/inkscape-preferences.cpp:204
msgid "times current stroke width"
@@ -16751,10 +16927,12 @@ msgid ""
"<b>More than one object selected.</b> Cannot take style from multiple "
"objects."
msgstr ""
+"<b>Meira en einn hlutur valinn</b>. Get ekki tekið við stíl frå mörgum "
+"hlutum."
#: ../src/ui/dialog/inkscape-preferences.cpp:265
msgid "Style of new objects"
-msgstr "StĂ­ll nĂœrra hlutaa"
+msgstr "StĂ­ll nĂœrra hluta"
#: ../src/ui/dialog/inkscape-preferences.cpp:267
msgid "Last used style"
@@ -16866,7 +17044,7 @@ msgstr "Hlutir"
#: ../src/ui/dialog/inkscape-preferences.cpp:336
msgid "Show the actual objects when moving or transforming"
-msgstr ""
+msgstr "Birta raunverulega hluti við fÊrslu eða umbreytingar"
#: ../src/ui/dialog/inkscape-preferences.cpp:337
msgid "Box outline"
@@ -16924,7 +17102,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:358
msgid "Always show outline"
-msgstr ""
+msgstr "Ávallt birta ĂștlĂ­nu"
#: ../src/ui/dialog/inkscape-preferences.cpp:359
msgid "Show outlines for all paths, not only invisible paths"
@@ -16932,7 +17110,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:360
msgid "Update outline when dragging nodes"
-msgstr ""
+msgstr "UppfĂŠra ĂștlĂ­nu við að draga hnĂșta"
#: ../src/ui/dialog/inkscape-preferences.cpp:361
msgid ""
@@ -16942,7 +17120,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:362
msgid "Update paths when dragging nodes"
-msgstr ""
+msgstr "UppfĂŠra ferla við að draga hnĂșta"
#: ../src/ui/dialog/inkscape-preferences.cpp:363
msgid ""
@@ -16952,7 +17130,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:364
msgid "Show path direction on outlines"
-msgstr ""
+msgstr "Birta stefnu ferils ĂĄ ĂștlĂ­num"
#: ../src/ui/dialog/inkscape-preferences.cpp:365
msgid ""
@@ -16962,7 +17140,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:366
msgid "Show temporary path outline"
-msgstr ""
+msgstr "Birta bråðabirgðaĂștlĂ­nur ferla"
#: ../src/ui/dialog/inkscape-preferences.cpp:367
msgid "When hovering over a path, briefly flash its outline"
@@ -16970,11 +17148,11 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:368
msgid "Show temporary outline for selected paths"
-msgstr ""
+msgstr "Birta bråðabirgðaĂștlĂ­nur valinna ferla"
#: ../src/ui/dialog/inkscape-preferences.cpp:369
msgid "Show temporary outline even when a path is selected for editing"
-msgstr ""
+msgstr "Birta bråðabirgðaĂștlĂ­nur jafnvel ĂŸegar ferill er valinn til breytinga"
#: ../src/ui/dialog/inkscape-preferences.cpp:371
msgid "_Flash time:"
@@ -16989,19 +17167,19 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:372
msgid "Editing preferences"
-msgstr ""
+msgstr "Kjörstillingar fyrir breytingar"
#: ../src/ui/dialog/inkscape-preferences.cpp:373
msgid "Show transform handles for single nodes"
-msgstr ""
+msgstr "SĂœna umbreytingarhaldföng fyrir staka hnĂșta"
#: ../src/ui/dialog/inkscape-preferences.cpp:374
msgid "Show transform handles even when only a single node is selected"
-msgstr ""
+msgstr "SĂœna umbreytingarhaldföng jafnvel ĂŸĂłtt stakur hnĂștur sĂ© valinn"
#: ../src/ui/dialog/inkscape-preferences.cpp:375
msgid "Deleting nodes preserves shape"
-msgstr ""
+msgstr "Eyðing hnĂșta viðheldur lögun"
#: ../src/ui/dialog/inkscape-preferences.cpp:376
msgid ""
@@ -17163,14 +17341,14 @@ msgstr "Fötufylla"
#. Gradient
#: ../src/ui/dialog/inkscape-preferences.cpp:487
-#: ../src/widgets/gradient-selector.cpp:134
-#: ../src/widgets/gradient-selector.cpp:302
+#: ../src/widgets/gradient-selector.cpp:144
+#: ../src/widgets/gradient-selector.cpp:295
msgid "Gradient"
msgstr "Litstigull"
#: ../src/ui/dialog/inkscape-preferences.cpp:489
msgid "Prevent sharing of gradient definitions"
-msgstr ""
+msgstr "Hindra sameiginlegar skilgreiningar litstigla"
#: ../src/ui/dialog/inkscape-preferences.cpp:491
msgid ""
@@ -17216,7 +17394,7 @@ msgstr ""
#. disabled, because the LPETool is not finished yet.
#: ../src/ui/dialog/inkscape-preferences.cpp:515
msgid "LPE Tool"
-msgstr "LPE verkfĂŠri"
+msgstr "LPE verkfĂŠri (LivePathEffects)"
#: ../src/ui/dialog/inkscape-preferences.cpp:522
msgid "Interface"
@@ -17375,6 +17553,10 @@ msgid "Indonesian (id)"
msgstr "IndĂłnesĂ­ska (id)"
#: ../src/ui/dialog/inkscape-preferences.cpp:532
+msgid "Icelandic (is)"
+msgstr "Íslenska (is)"
+
+#: ../src/ui/dialog/inkscape-preferences.cpp:532
msgid "Italian (it)"
msgstr "Ítalska (it)"
@@ -17526,7 +17708,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:580
msgid "Control bar icon size:"
-msgstr ""
+msgstr "TåknmyndastÊrð stjórnslår:"
#: ../src/ui/dialog/inkscape-preferences.cpp:581
msgid ""
@@ -17535,7 +17717,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:584
msgid "Secondary toolbar icon size:"
-msgstr ""
+msgstr "StÊrð tåknmynda å aukaverkfÊrastiku:"
#: ../src/ui/dialog/inkscape-preferences.cpp:585
msgid ""
@@ -17544,7 +17726,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:588
msgid "Work-around color sliders not drawing"
-msgstr ""
+msgstr "HjĂĄleið ĂŸegar litasleðar virka ekki"
#: ../src/ui/dialog/inkscape-preferences.cpp:590
msgid ""
@@ -17635,15 +17817,15 @@ msgstr ""
#. Windows
#: ../src/ui/dialog/inkscape-preferences.cpp:634
msgid "Save and restore window geometry for each document"
-msgstr ""
+msgstr "Vista og endurheimta stÊrð og stöðu glugga fyrir hvert skjal "
#: ../src/ui/dialog/inkscape-preferences.cpp:635
msgid "Remember and use last window's geometry"
-msgstr ""
+msgstr "Geyma og nota síðustu stÊrð og stöðu glugga"
#: ../src/ui/dialog/inkscape-preferences.cpp:636
msgid "Don't save window geometry"
-msgstr ""
+msgstr "Ekki vista stÊrðir glugga"
#: ../src/ui/dialog/inkscape-preferences.cpp:638
msgid "Save and restore dialogs status"
@@ -17669,7 +17851,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:648
msgid "Dialogs are hidden in taskbar"
-msgstr ""
+msgstr "Samskiptagluggar eru faldir Ă­ verkefnaslĂĄ"
#: ../src/ui/dialog/inkscape-preferences.cpp:649
msgid "Save and restore documents viewport"
@@ -17681,7 +17863,7 @@ msgstr "Breyta aðdrĂŠtti ĂŸegar stĂŠrð glugga breytist"
#: ../src/ui/dialog/inkscape-preferences.cpp:651
msgid "Show close button on dialogs"
-msgstr ""
+msgstr "Birta lokunarhnapp ĂĄ samskiptagluggum"
#: ../src/ui/dialog/inkscape-preferences.cpp:652
msgctxt "Dialog on top"
@@ -17690,7 +17872,7 @@ msgstr "Ekkert"
#: ../src/ui/dialog/inkscape-preferences.cpp:654
msgid "Aggressive"
-msgstr ""
+msgstr "Ýkt"
#: ../src/ui/dialog/inkscape-preferences.cpp:657
msgid "Maximized"
@@ -17710,19 +17892,23 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:667
msgid "Let the window manager determine placement of all windows"
-msgstr ""
+msgstr "Låta gluggastjórann um að åkveða staðsetningar allra glugga"
#: ../src/ui/dialog/inkscape-preferences.cpp:669
msgid ""
"Remember and use the last window's geometry (saves geometry to user "
"preferences)"
msgstr ""
+"Geyma og nota síðustu stĂŠrð og stöðu glugga (vistar upplĂœsingarnar Ă­ "
+"kjörstillingar notandans)"
#: ../src/ui/dialog/inkscape-preferences.cpp:671
msgid ""
"Save and restore window geometry for each document (saves geometry in the "
"document)"
msgstr ""
+"Vista og endurheimta stÊrð og stöðu glugga fyrir hvert skjal (vistar "
+"upplĂœsingarnar Ă­ skjalið)"
#: ../src/ui/dialog/inkscape-preferences.cpp:673
msgid "Saving dialogs status"
@@ -17752,35 +17938,35 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:695
msgid "Dialogs on top:"
-msgstr ""
+msgstr "Samskiptagluggar ofan ĂĄ:"
#: ../src/ui/dialog/inkscape-preferences.cpp:698
msgid "Dialogs are treated as regular windows"
-msgstr ""
+msgstr "Samskiptagluggar eru meðhöndlaðir eins og venjulegir gluggar"
#: ../src/ui/dialog/inkscape-preferences.cpp:700
msgid "Dialogs stay on top of document windows"
-msgstr ""
+msgstr "Samskiptagluggar haldast ofan ĂĄ vinnugluggum"
#: ../src/ui/dialog/inkscape-preferences.cpp:702
msgid "Same as Normal but may work better with some window managers"
-msgstr ""
+msgstr "Sama og venjulegt nema að ĂŸað gĂŠti virkað betur Ă­ sumum gluggastjĂłrum"
#: ../src/ui/dialog/inkscape-preferences.cpp:705
msgid "Dialog Transparency"
-msgstr ""
+msgstr "GegnsĂŠi samskiptaglugga"
#: ../src/ui/dialog/inkscape-preferences.cpp:707
msgid "_Opacity when focused:"
-msgstr ""
+msgstr "Ó_gegnsĂŠi ĂŸegar er virkt:"
#: ../src/ui/dialog/inkscape-preferences.cpp:709
msgid "Opacity when _unfocused:"
-msgstr ""
+msgstr "Óg_egnsĂŠi ĂŸegar er Ăłvirkt:"
#: ../src/ui/dialog/inkscape-preferences.cpp:711
msgid "_Time of opacity change animation:"
-msgstr ""
+msgstr "_Tími skiptingar við breytingu å gegnsÊi:"
#: ../src/ui/dialog/inkscape-preferences.cpp:714
msgid "Miscellaneous"
@@ -17907,7 +18093,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:850
msgid "Add label comments to printing output"
-msgstr ""
+msgstr "BĂŠta skĂœringum ĂĄ prentað Ășttak"
#: ../src/ui/dialog/inkscape-preferences.cpp:852
msgid ""
@@ -17957,11 +18143,11 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:867
msgid "_Handle size:"
-msgstr ""
+msgstr "StÊrð _haldfangs:"
#: ../src/ui/dialog/inkscape-preferences.cpp:868
msgid "Set the relative size of node handles"
-msgstr ""
+msgstr "Stilla afstÊða stĂŠrð haldfanga ĂĄ hnĂștum"
#: ../src/ui/dialog/inkscape-preferences.cpp:870
msgid "Use pressure-sensitive tablet (requires restart)"
@@ -18079,8 +18265,8 @@ msgid ""
"The smallest number written to SVG is 10 to the power of this exponent; "
"anything smaller is written as zero"
msgstr ""
-"Minnsta tala sem skrifuð er Ă­ SVG er 10 Ă­ ĂŸessu veldi; "
-"allt sem er minna verður skrifað sem nĂșll"
+"Minnsta tala sem skrifuð er Ă­ SVG er 10 Ă­ ĂŸessu veldi; allt sem er minna "
+"verður skrifað sem nĂșll"
#. Code to add controls for attribute checking options
#. Add incorrect style properties options
@@ -18210,6 +18396,8 @@ msgid ""
"The ICC profile to use to calibrate display output.\n"
"Searched directories:%s"
msgstr ""
+"ICC litasniðið sem nota å til að kvarða skjå.\n"
+"Leitað í möppum: %s"
#: ../src/ui/dialog/inkscape-preferences.cpp:971
msgid "Display profile:"
@@ -18293,11 +18481,11 @@ msgstr "Varðveita svart"
#: ../src/ui/dialog/inkscape-preferences.cpp:1030
msgid "(LittleCMS 1.15 or later required)"
-msgstr ""
+msgstr "(LittleCMS 1.15 eða nĂœrra er krafist)"
#: ../src/ui/dialog/inkscape-preferences.cpp:1032
msgid "Preserve K channel in CMYK -> CMYK transforms"
-msgstr ""
+msgstr "Vernda K litrĂĄs Ă­ CMYK -> CMYK umbreytingum"
#: ../src/ui/dialog/inkscape-preferences.cpp:1046
#: ../src/widgets/sp-color-icc-selector.cpp:449
@@ -18319,6 +18507,8 @@ msgid ""
"Automatically save the current document(s) at a given interval, thus "
"minimizing loss in case of a crash"
msgstr ""
+"Vista sjĂĄlfkrafa nĂșverandi skjöl með ĂĄkveðnu millibili, og ĂŸannig minnka "
+"líkurnar å gagnatapi við kerfishrun"
#: ../src/ui/dialog/inkscape-preferences.cpp:1101
msgctxt "Filesystem"
@@ -18366,34 +18556,36 @@ msgstr "SjĂĄlfvirk vistun"
#: ../src/ui/dialog/inkscape-preferences.cpp:1124
msgid "Open Clip Art Library _Server Name:"
-msgstr "VefĂŸjĂłnn myndaklippusafns (Open Clip Art Library):"
+msgstr "VefĂŸjĂłnn _klippimyndasafns (Open Clip Art Library):"
#: ../src/ui/dialog/inkscape-preferences.cpp:1125
msgid ""
"The server name of the Open Clip Art Library webdav server; it's used by the "
"Import and Export to OCAL function"
msgstr ""
+"Nafn Open Clip Art Library webdav vefĂŸjĂłnsins; ĂŸað er notað Ă­ inn- og "
+"Ăștflutningi fyrir OCAL aðgerðir"
#: ../src/ui/dialog/inkscape-preferences.cpp:1127
msgid "Open Clip Art Library _Username:"
-msgstr "Notandanafn myndaklippusafns:"
+msgstr "_Notandanafn klippimyndasafns:"
#: ../src/ui/dialog/inkscape-preferences.cpp:1128
msgid "The username used to log into Open Clip Art Library"
msgstr ""
-"Notandanafn til innskråningar å Open Clip Art Library myndaklippusafnið"
+"Notandanafn til innskråningar å Open Clip Art Library klippimyndasafnið"
#: ../src/ui/dialog/inkscape-preferences.cpp:1130
msgid "Open Clip Art Library _Password:"
-msgstr "Lykilorð myndaklippusafns:"
+msgstr "_Lykilorð klippimyndasafns:"
#: ../src/ui/dialog/inkscape-preferences.cpp:1131
msgid "The password used to log into Open Clip Art Library"
-msgstr "Lykilorð til innskråningar å Open Clip Art Library myndaklippusafnið"
+msgstr "Lykilorð til innskråningar å Open Clip Art Library klippimyndasafnið"
#: ../src/ui/dialog/inkscape-preferences.cpp:1132
msgid "Open Clip Art"
-msgstr "Open Clip Art myndaklippusafn"
+msgstr "Open Clip Art klippimyndasafn"
#: ../src/ui/dialog/inkscape-preferences.cpp:1137
msgid "Behavior"
@@ -18401,7 +18593,7 @@ msgstr "Hegðun"
#: ../src/ui/dialog/inkscape-preferences.cpp:1141
msgid "_Simplification threshold:"
-msgstr ""
+msgstr "_Takmörk einföldunar:"
#: ../src/ui/dialog/inkscape-preferences.cpp:1142
msgid ""
@@ -18453,10 +18645,12 @@ msgid ""
"Uncheck this to be able to keep the current objects selected when the "
"current layer changes"
msgstr ""
+"Taka hakið Ășr ĂŸessu til að halda völdum hlutum ĂĄfram völdum eftir að skipt "
+"eru um virkt lag"
#: ../src/ui/dialog/inkscape-preferences.cpp:1159
msgid "Ctrl+A, Tab, Shift+Tab"
-msgstr ""
+msgstr "Ctrl+A, Tab, Shift+Tab"
#: ../src/ui/dialog/inkscape-preferences.cpp:1161
msgid "Make keyboard selection commands work on objects in all layers"
@@ -18465,12 +18659,15 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1163
msgid "Make keyboard selection commands work on objects in current layer only"
msgstr ""
+"LĂĄta valskipanir með lyklaborði einungis virka ĂĄ hluti innan nĂșverandi lags"
#: ../src/ui/dialog/inkscape-preferences.cpp:1165
msgid ""
"Make keyboard selection commands work on objects in current layer and all "
"its sublayers"
msgstr ""
+"LĂĄta valskipanir með lyklaborði virka ĂĄ hluti innan nĂșverandi lags og Ă­ "
+"undirlögum ĂŸess"
#: ../src/ui/dialog/inkscape-preferences.cpp:1167
msgid ""
@@ -18628,7 +18825,7 @@ msgstr ""
#.
#: ../src/ui/dialog/inkscape-preferences.cpp:1226
msgid "Mouse wheel zooms by default"
-msgstr ""
+msgstr "MĂșsarhjĂłl stĂœrir sjĂĄlfgefið aðdrĂŠtti"
#: ../src/ui/dialog/inkscape-preferences.cpp:1228
msgid ""
@@ -18651,7 +18848,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1237
msgid "_Delay (in ms):"
-msgstr "Seinkun (Ă­ msek):"
+msgstr "S_einkun (Ă­ msek):"
#: ../src/ui/dialog/inkscape-preferences.cpp:1238
msgid ""
@@ -18662,7 +18859,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1240
msgid "Only snap the node closest to the pointer"
-msgstr ""
+msgstr "Einungis grĂ­pa Ă­ hnĂștinn sem nĂŠstur er mĂșsarbendli"
#: ../src/ui/dialog/inkscape-preferences.cpp:1242
msgid ""
@@ -18682,7 +18879,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1248
msgid "Snap the mouse pointer when dragging a constrained knot"
-msgstr ""
+msgstr "GrĂ­pa Ă­ mĂșsarbendil ĂŸegar skilyrtur hnĂștur er dreginn"
#: ../src/ui/dialog/inkscape-preferences.cpp:1250
msgid ""
@@ -18767,7 +18964,7 @@ msgid "_Zoom in/out by:"
msgstr "_Renna að/frå um:"
#: ../src/ui/dialog/inkscape-preferences.cpp:1280
-#: ../src/ui/dialog/objects.cpp:1622
+#: ../src/ui/dialog/objects.cpp:1620
#: ../src/ui/widget/filter-effect-chooser.cpp:27
msgid "%"
msgstr "%"
@@ -18793,23 +18990,23 @@ msgstr "Haldast Ăłhreyft"
#: ../src/ui/dialog/inkscape-preferences.cpp:1289
msgid "Move according to transform"
-msgstr ""
+msgstr "FĂŠrast samkvĂŠmt umbreytingu"
#: ../src/ui/dialog/inkscape-preferences.cpp:1291
msgid "Are unlinked"
-msgstr ""
+msgstr "Þeir aftengdir"
#: ../src/ui/dialog/inkscape-preferences.cpp:1293
msgid "Are deleted"
-msgstr ""
+msgstr "Verða eytt"
#: ../src/ui/dialog/inkscape-preferences.cpp:1296
msgid "Moving original: clones and linked offsets"
-msgstr ""
+msgstr "Þegar upprunahlutur er férður, munu klónar hans og tengdar hliðranir"
#: ../src/ui/dialog/inkscape-preferences.cpp:1298
msgid "Clones are translated by the same vector as their original"
-msgstr ""
+msgstr "KlĂłnar eru fĂŠrðir um sama vigur og upprunahlutur ĂŸeirra"
#: ../src/ui/dialog/inkscape-preferences.cpp:1300
msgid "Clones preserve their positions when their original is moved"
@@ -18827,11 +19024,11 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1305
msgid "Orphaned clones are converted to regular objects"
-msgstr ""
+msgstr "Munaðarlausum klónum er umbreytt í venjulega hluti"
#: ../src/ui/dialog/inkscape-preferences.cpp:1307
msgid "Orphaned clones are deleted along with their original"
-msgstr ""
+msgstr "Munaðarlausum klónum er eytt åsamt upprunahlutum"
#: ../src/ui/dialog/inkscape-preferences.cpp:1309
msgid "Duplicating original+clones/linked offset"
@@ -18856,7 +19053,7 @@ msgstr "KlĂłnar"
#. Clip paths and masks options
#: ../src/ui/dialog/inkscape-preferences.cpp:1319
msgid "When applying, use the topmost selected object as clippath/mask"
-msgstr ""
+msgstr "Við beitingu: nota efsta valda hlutinn sem afmörkun/hulu"
#: ../src/ui/dialog/inkscape-preferences.cpp:1321
msgid ""
@@ -18866,7 +19063,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1322
msgid "Remove clippath/mask object after applying"
-msgstr ""
+msgstr "FjarlÊgja eftir aðgerðina hlutinn sem notaður var sem afmörkun/hula"
#: ../src/ui/dialog/inkscape-preferences.cpp:1324
msgid ""
@@ -18880,7 +19077,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1328
msgid "Do not group clipped/masked objects"
-msgstr ""
+msgstr "Ekki hópa afmarkaða/hulda hluti"
#: ../src/ui/dialog/inkscape-preferences.cpp:1329
msgid "Put every clipped/masked object in its own group"
@@ -18888,7 +19085,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1330
msgid "Put all clipped/masked objects into one group"
-msgstr ""
+msgstr "Setja alla afmarkaða/hulda hluti í einn hóp"
#: ../src/ui/dialog/inkscape-preferences.cpp:1333
msgid "Apply clippath/mask to every object"
@@ -18908,11 +19105,12 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1343
msgid "Ungroup automatically created groups"
-msgstr ""
+msgstr "Skipta upp sjĂĄlfvirkt ĂștbĂșnum hĂłpum"
#: ../src/ui/dialog/inkscape-preferences.cpp:1345
msgid "Ungroup groups created when setting clip/mask"
msgstr ""
+"Skipta upp hĂłpum sem bĂșnir hafa verið til við að setja afmarkanir eða hulu"
#: ../src/ui/dialog/inkscape-preferences.cpp:1347
msgid "Clippaths and masks"
@@ -18936,12 +19134,12 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1361
msgid "Document cleanup"
-msgstr ""
+msgstr "Hreinsun ĂĄ skjali"
#: ../src/ui/dialog/inkscape-preferences.cpp:1362
#: ../src/ui/dialog/inkscape-preferences.cpp:1364
msgid "Remove unused swatches when doing a document cleanup"
-msgstr ""
+msgstr "FjarlÊgja ónotaðar litaprufur við hreinsun å skjali"
#. tooltip
#: ../src/ui/dialog/inkscape-preferences.cpp:1365
@@ -19013,26 +19211,28 @@ msgid ""
"Best quality, but display may be very slow at high zooms (bitmap export "
"always uses best quality)"
msgstr ""
+"Bestu gÊði, en birting gÊti verið mjög hÊgvirk við mikinn aðdrått "
+"(Ăștflutningur bitamynda notar alltaf bestu gÊði)"
#: ../src/ui/dialog/inkscape-preferences.cpp:1396
#: ../src/ui/dialog/inkscape-preferences.cpp:1420
msgid "Better quality, but slower display"
-msgstr ""
+msgstr "Betri gÊði, en hÊgvirkari birting"
#: ../src/ui/dialog/inkscape-preferences.cpp:1398
#: ../src/ui/dialog/inkscape-preferences.cpp:1422
msgid "Average quality, acceptable display speed"
-msgstr ""
+msgstr "MeðalgÊði, åsÊttanlegur hraði birtingar"
#: ../src/ui/dialog/inkscape-preferences.cpp:1400
#: ../src/ui/dialog/inkscape-preferences.cpp:1424
msgid "Lower quality (some artifacts), but display is faster"
-msgstr ""
+msgstr "Minni gÊði (einhverjar truflanir), en birting er hraðari"
#: ../src/ui/dialog/inkscape-preferences.cpp:1402
#: ../src/ui/dialog/inkscape-preferences.cpp:1426
msgid "Lowest quality (considerable artifacts), but display is fastest"
-msgstr ""
+msgstr "LÊgstu gÊði (umtalsverðar truflanir), en birting er hröðust"
#: ../src/ui/dialog/inkscape-preferences.cpp:1416
msgid "Filter effects quality for display"
@@ -19040,7 +19240,7 @@ msgstr "GÊði síuåhrifa sem birtast"
#. build custom preferences tab
#: ../src/ui/dialog/inkscape-preferences.cpp:1428
-#: ../src/ui/dialog/print.cpp:232
+#: ../src/ui/dialog/print.cpp:215
msgid "Rendering"
msgstr "Myndgerð"
@@ -19056,14 +19256,14 @@ msgstr "Endurhlaða bitamyndum sjålfkrafa"
#: ../src/ui/dialog/inkscape-preferences.cpp:1437
msgid "Automatically reload linked images when file is changed on disk"
-msgstr ""
+msgstr "Endurhlaða tengdum bitamyndum sjĂĄlfkrafa ĂŸegar skrĂĄ er breytt ĂĄ diski"
#: ../src/ui/dialog/inkscape-preferences.cpp:1439
msgid "_Bitmap editor:"
msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1441
-#: ../share/extensions/guillotine.inx.h:5 ../share/extensions/plotter.inx.h:55
+#: ../share/extensions/guillotine.inx.h:5 ../share/extensions/plotter.inx.h:57
#: ../share/extensions/print_win32_vector.inx.h:2
msgid "Export"
msgstr "Flytja Ășt"
@@ -19075,9 +19275,11 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1444
msgid "Default bitmap resolution (in dots per inch) in the Export dialog"
msgstr ""
+"Sjålfgefin upplausn bitamynda (mynddílar å tommu - PÁT) í "
+"Ăștflutningsglugganum"
#: ../src/ui/dialog/inkscape-preferences.cpp:1445
-#: ../src/ui/dialog/xml-tree.cpp:912
+#: ../src/ui/dialog/xml-tree.cpp:920
msgid "Create"
msgstr "BĂșa til"
@@ -19088,6 +19290,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1448
msgid "Resolution used by the Create Bitmap Copy command"
msgstr ""
+"Upplausn sem notuð er við að nota \"BĂșa til afrit af bitamynd\" skipunin"
#: ../src/ui/dialog/inkscape-preferences.cpp:1451
msgid "Ask about linking and scaling when importing"
@@ -19139,7 +19342,7 @@ msgstr "Bitamyndir"
#: ../src/ui/dialog/inkscape-preferences.cpp:1494
msgid ""
"Select a file of predefined shortcuts to use. Any customized shortcuts you "
-"create will be added seperately to "
+"create will be added separately to "
msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1497
@@ -19206,7 +19409,7 @@ msgstr "Ekkert"
#: ../src/ui/dialog/inkscape-preferences.cpp:1871
msgid "Set the main spell check language"
-msgstr ""
+msgstr "Stilla aðaltungumål fyrir stafsetningaryfirferð"
#: ../src/ui/dialog/inkscape-preferences.cpp:1874
msgid "Second language:"
@@ -19260,7 +19463,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1912
msgid "Pre-render named icons"
-msgstr ""
+msgstr "Forvinna nefndar tĂĄknmyndir"
#: ../src/ui/dialog/inkscape-preferences.cpp:1914
msgid ""
@@ -19270,7 +19473,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1922
msgid "System info"
-msgstr ""
+msgstr "KerfisupplĂœsingar"
#: ../src/ui/dialog/inkscape-preferences.cpp:1926
msgid "User config: "
@@ -19282,7 +19485,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1930
msgid "User preferences: "
-msgstr "Kjörstillingar notanda:"
+msgstr "Kjörstillingar notanda: "
#: ../src/ui/dialog/inkscape-preferences.cpp:1930
msgid "Location of the users preferences file"
@@ -19290,7 +19493,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1934
msgid "User extensions: "
-msgstr "ViðbÊtur notanda:"
+msgstr "ViðbÊtur notanda: "
#: ../src/ui/dialog/inkscape-preferences.cpp:1934
msgid "Location of the users extensions"
@@ -19322,7 +19525,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1954
msgid "Inkscape extensions: "
-msgstr "Inkscape viðbÊtur:"
+msgstr "Inkscape viðbÊtur: "
#: ../src/ui/dialog/inkscape-preferences.cpp:1954
msgid "Location of the Inkscape extensions"
@@ -19330,7 +19533,7 @@ msgstr ""
#: ../src/ui/dialog/inkscape-preferences.cpp:1963
msgid "System data: "
-msgstr ""
+msgstr "Kerfisgögn: "
#: ../src/ui/dialog/inkscape-preferences.cpp:1963
msgid "Locations of system data"
@@ -19405,7 +19608,7 @@ msgstr "Teiknitafla"
#: ../src/ui/dialog/input.cpp:1039 ../src/ui/dialog/input.cpp:1928
msgid "pad"
-msgstr ""
+msgstr "platti"
#: ../src/ui/dialog/input.cpp:1081
msgid "_Use pressure-sensitive tablet (requires restart)"
@@ -19530,12 +19733,12 @@ msgstr "LĂŠsa lagi"
msgid "Unlock layer"
msgstr "AflĂŠsa lagi"
-#: ../src/ui/dialog/layers.cpp:624 ../src/ui/dialog/objects.cpp:845
+#: ../src/ui/dialog/layers.cpp:624 ../src/ui/dialog/objects.cpp:843
#: ../src/verbs.cpp:1438
msgid "Toggle layer solo"
msgstr ""
-#: ../src/ui/dialog/layers.cpp:627 ../src/ui/dialog/objects.cpp:848
+#: ../src/ui/dialog/layers.cpp:627 ../src/ui/dialog/objects.cpp:846
#: ../src/verbs.cpp:1462
msgid "Lock other layers"
msgstr ""
@@ -19573,73 +19776,73 @@ msgstr "Efst"
msgid "Add Path Effect"
msgstr ""
-#: ../src/ui/dialog/livepatheffect-editor.cpp:109
+#: ../src/ui/dialog/livepatheffect-editor.cpp:119
msgid "Add path effect"
msgstr ""
-#: ../src/ui/dialog/livepatheffect-editor.cpp:119
+#: ../src/ui/dialog/livepatheffect-editor.cpp:123
msgid "Delete current path effect"
msgstr ""
-#: ../src/ui/dialog/livepatheffect-editor.cpp:129
+#: ../src/ui/dialog/livepatheffect-editor.cpp:127
msgid "Raise the current path effect"
msgstr ""
-#: ../src/ui/dialog/livepatheffect-editor.cpp:139
+#: ../src/ui/dialog/livepatheffect-editor.cpp:131
msgid "Lower the current path effect"
msgstr ""
-#: ../src/ui/dialog/livepatheffect-editor.cpp:312
+#: ../src/ui/dialog/livepatheffect-editor.cpp:298
msgid "Unknown effect is applied"
-msgstr ""
+msgstr "Ă“ĂŸekktri sjĂłnbrellu er beitt"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:315
+#: ../src/ui/dialog/livepatheffect-editor.cpp:301
msgid "Click button to add an effect"
msgstr ""
-#: ../src/ui/dialog/livepatheffect-editor.cpp:330
+#: ../src/ui/dialog/livepatheffect-editor.cpp:316
msgid "Click add button to convert clone"
msgstr ""
-#: ../src/ui/dialog/livepatheffect-editor.cpp:335
-#: ../src/ui/dialog/livepatheffect-editor.cpp:339
-#: ../src/ui/dialog/livepatheffect-editor.cpp:348
+#: ../src/ui/dialog/livepatheffect-editor.cpp:321
+#: ../src/ui/dialog/livepatheffect-editor.cpp:325
+#: ../src/ui/dialog/livepatheffect-editor.cpp:334
msgid "Select a path or shape"
msgstr ""
-#: ../src/ui/dialog/livepatheffect-editor.cpp:344
+#: ../src/ui/dialog/livepatheffect-editor.cpp:330
msgid "Only one item can be selected"
msgstr ""
-#: ../src/ui/dialog/livepatheffect-editor.cpp:376
+#: ../src/ui/dialog/livepatheffect-editor.cpp:362
msgid "Unknown effect"
-msgstr ""
+msgstr "Ă“ĂŸekkt sjĂłnbrella"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:452
+#: ../src/ui/dialog/livepatheffect-editor.cpp:438
msgid "Create and apply path effect"
msgstr "BĂșa til og beita ferilbrellu"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:492
+#: ../src/ui/dialog/livepatheffect-editor.cpp:478
msgid "Create and apply Clone original path effect"
msgstr ""
-#: ../src/ui/dialog/livepatheffect-editor.cpp:514
+#: ../src/ui/dialog/livepatheffect-editor.cpp:500
msgid "Remove path effect"
msgstr "FjarlĂŠgja ferilbrellu"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:532
+#: ../src/ui/dialog/livepatheffect-editor.cpp:518
msgid "Move path effect up"
msgstr "FĂŠra ferilbrellu upp"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:549
+#: ../src/ui/dialog/livepatheffect-editor.cpp:535
msgid "Move path effect down"
msgstr "FÊra ferilbrellu niður"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:588
+#: ../src/ui/dialog/livepatheffect-editor.cpp:574
msgid "Activate path effect"
msgstr "Virkja ferilbrellu"
-#: ../src/ui/dialog/livepatheffect-editor.cpp:588
+#: ../src/ui/dialog/livepatheffect-editor.cpp:574
msgid "Deactivate path effect"
msgstr "Gera ferilbrellu Ăłvirka"
@@ -19685,7 +19888,7 @@ msgstr ""
#: ../src/ui/dialog/memory.cpp:96
msgid "Heap"
-msgstr ""
+msgstr "Stafli"
#: ../src/ui/dialog/memory.cpp:97
msgid "In Use"
@@ -19888,82 +20091,82 @@ msgstr "Fela hlut"
msgid "Unhide object"
msgstr "Birta hlut"
-#: ../src/ui/dialog/objects.cpp:875
+#: ../src/ui/dialog/objects.cpp:873
msgid "Unhide objects"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:875
+#: ../src/ui/dialog/objects.cpp:873
msgid "Hide objects"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:895
+#: ../src/ui/dialog/objects.cpp:893
msgid "Lock objects"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:895
+#: ../src/ui/dialog/objects.cpp:893
msgid "Unlock objects"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:907
+#: ../src/ui/dialog/objects.cpp:905
msgid "Layer to group"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:907
+#: ../src/ui/dialog/objects.cpp:905
msgid "Group to layer"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:1105
+#: ../src/ui/dialog/objects.cpp:1103
msgid "Moved objects"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:1354 ../src/ui/dialog/tags.cpp:875
-#: ../src/ui/dialog/tags.cpp:882
+#: ../src/ui/dialog/objects.cpp:1352 ../src/ui/dialog/tags.cpp:856
+#: ../src/ui/dialog/tags.cpp:863
msgid "Rename object"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:1461
+#: ../src/ui/dialog/objects.cpp:1459
msgid "Set object highlight color"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:1471
+#: ../src/ui/dialog/objects.cpp:1469
msgid "Set object opacity"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:1504
+#: ../src/ui/dialog/objects.cpp:1502
msgid "Set object blend mode"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:1560
+#: ../src/ui/dialog/objects.cpp:1558
msgid "Set object blur"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:1802
+#: ../src/ui/dialog/objects.cpp:1800
msgid "Add layer..."
msgstr "BÊta við lagi..."
-#: ../src/ui/dialog/objects.cpp:1817
+#: ../src/ui/dialog/objects.cpp:1807
msgid "Remove object"
msgstr "FjarlĂŠgja hlut"
-#: ../src/ui/dialog/objects.cpp:1832
+#: ../src/ui/dialog/objects.cpp:1815
msgid "Move To Bottom"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:1877
+#: ../src/ui/dialog/objects.cpp:1839
msgid "Move To Top"
msgstr ""
-#: ../src/ui/dialog/objects.cpp:1892
+#: ../src/ui/dialog/objects.cpp:1847
msgid "Collapse All"
-msgstr ""
+msgstr "Fella allt saman"
-#: ../src/ui/dialog/objects.cpp:1974
+#: ../src/ui/dialog/objects.cpp:1922
msgid "Select Highlight Color"
msgstr ""
#: ../src/ui/dialog/ocaldialogs.cpp:715
msgid "Clipart found"
-msgstr ""
+msgstr "Klippimyndir fundust"
#: ../src/ui/dialog/ocaldialogs.cpp:764
msgid "Downloading image..."
@@ -19975,7 +20178,7 @@ msgstr ""
#: ../src/ui/dialog/ocaldialogs.cpp:922
msgid "Clipart downloaded successfully"
-msgstr ""
+msgstr "Tókst að hala niður klippimyndum"
#: ../src/ui/dialog/ocaldialogs.cpp:936
msgid "Could not download thumbnail file"
@@ -19987,11 +20190,11 @@ msgstr "Engin lĂœsing"
#: ../src/ui/dialog/ocaldialogs.cpp:1079
msgid "Searching clipart..."
-msgstr ""
+msgstr "Leita að klippimyndum..."
#: ../src/ui/dialog/ocaldialogs.cpp:1099 ../src/ui/dialog/ocaldialogs.cpp:1120
msgid "Could not connect to the Open Clip Art Library"
-msgstr "Gat ekki tengst myndaklippusafni (Open Clip Art Library)"
+msgstr "Gat ekki tengst klippimyndasafni (Open Clip Art Library)"
#: ../src/ui/dialog/ocaldialogs.cpp:1145
msgid "Could not parse search results"
@@ -19999,7 +20202,7 @@ msgstr ""
#: ../src/ui/dialog/ocaldialogs.cpp:1177
msgid "No clipart named <b>%1</b> was found."
-msgstr ""
+msgstr "Engar klippimyndir með heitinu <b>%1</b> fannst."
#: ../src/ui/dialog/ocaldialogs.cpp:1179
msgid ""
@@ -20113,7 +20316,7 @@ msgstr ""
#: ../src/ui/dialog/pixelartdialog.cpp:499
msgid "Trace pixel art"
-msgstr ""
+msgstr "LĂ­nuteikna Pixel Art"
#: ../src/ui/dialog/polar-arrange-tab.cpp:41
msgctxt "Polar arrange tab"
@@ -20208,22 +20411,22 @@ msgstr "Raða upp å sporbaug"
#: ../src/ui/dialog/print.cpp:111
msgid "Could not open temporary PNG for bitmap printing"
-msgstr ""
+msgstr "Gat ekki opnað PNG-bråðabirgðaskrå til að prenta bitamynd"
-#: ../src/ui/dialog/print.cpp:155
+#: ../src/ui/dialog/print.cpp:138
msgid "Could not set up Document"
-msgstr ""
+msgstr "Gat ekki sett upp skjal"
-#: ../src/ui/dialog/print.cpp:159
+#: ../src/ui/dialog/print.cpp:142
msgid "Failed to set CairoRenderContext"
msgstr ""
#. set up dialog title, based on document name
-#: ../src/ui/dialog/print.cpp:197
+#: ../src/ui/dialog/print.cpp:180
msgid "SVG Document"
msgstr "SVG skjal"
-#: ../src/ui/dialog/print.cpp:198
+#: ../src/ui/dialog/print.cpp:181
msgid "Print"
msgstr "Prenta"
@@ -20257,7 +20460,7 @@ msgstr "Tillögur:"
#: ../src/ui/dialog/spellcheck.cpp:124
msgid "Accept the chosen suggestion"
-msgstr ""
+msgstr "SamĂŸykkja valda tillögu"
#: ../src/ui/dialog/spellcheck.cpp:125
msgid "Ignore this word only once"
@@ -20269,24 +20472,24 @@ msgstr "Hunsa ĂŸetta orð Ă­ ĂŸessari setu"
#: ../src/ui/dialog/spellcheck.cpp:127
msgid "Add this word to the chosen dictionary"
-msgstr ""
+msgstr "BÊta orði við valið orðasafn"
#: ../src/ui/dialog/spellcheck.cpp:141
msgid "Stop the check"
-msgstr ""
+msgstr "Stöðva yfirferð"
#: ../src/ui/dialog/spellcheck.cpp:142
msgid "Start the check"
-msgstr ""
+msgstr "Hefja yfirferð"
#: ../src/ui/dialog/spellcheck.cpp:460
#, c-format
msgid "<b>Finished</b>, <b>%d</b> words added to dictionary"
-msgstr ""
+msgstr "<b>Lokið</b>, <b>%d</b> orðum bÊtt við orðasafn"
#: ../src/ui/dialog/spellcheck.cpp:462
msgid "<b>Finished</b>, nothing suspicious found"
-msgstr ""
+msgstr "<b>Lokið</b>, ekkert aðfinnsluvert fannst"
#: ../src/ui/dialog/spellcheck.cpp:578
#, c-format
@@ -20445,7 +20648,7 @@ msgstr "_Letur"
#: ../src/ui/dialog/svg-fonts-dialog.cpp:921
msgid "_Global Settings"
-msgstr "VíðvÊrar stillingar"
+msgstr "_VíðvÊrar stillingar"
#: ../src/ui/dialog/svg-fonts-dialog.cpp:922
msgid "_Glyphs"
@@ -20464,11 +20667,11 @@ msgstr "TextadĂŠmi"
msgid "Preview Text:"
msgstr "Forskoða texta:"
-#: ../src/ui/dialog/swatches.cpp:202 ../src/ui/tools/gradient-tool.cpp:370
-#: ../src/ui/tools/gradient-tool.cpp:468
+#: ../src/ui/dialog/swatches.cpp:202 ../src/ui/tools/gradient-tool.cpp:360
+#: ../src/ui/tools/gradient-tool.cpp:458
#: ../src/widgets/gradient-vector.cpp:794
msgid "Add gradient stop"
-msgstr ""
+msgstr "BÊta við stoppmerki í litstigul"
#. TRANSLATORS: An item in context menu on a colour in the swatches
#: ../src/ui/dialog/swatches.cpp:257
@@ -20491,7 +20694,7 @@ msgstr "Umbreyta"
#: ../src/ui/dialog/swatches.cpp:542
#, c-format
msgid "Palettes directory (%s) is unavailable."
-msgstr ""
+msgstr "Mappa fyrir litaspjöld (%s) er ekki tiltÊk."
#. ******************* Symbol Sets ************************
#: ../src/ui/dialog/symbols.cpp:139
@@ -20535,28 +20738,28 @@ msgstr ""
msgid "Unnamed Symbols"
msgstr "Ónefnd tákn"
-#: ../src/ui/dialog/tags.cpp:293 ../src/ui/dialog/tags.cpp:591
-#: ../src/ui/dialog/tags.cpp:705
+#: ../src/ui/dialog/tags.cpp:274 ../src/ui/dialog/tags.cpp:572
+#: ../src/ui/dialog/tags.cpp:686
msgid "Remove from selection set"
msgstr ""
-#: ../src/ui/dialog/tags.cpp:449
+#: ../src/ui/dialog/tags.cpp:430
msgid "Items"
msgstr "Atriði"
-#: ../src/ui/dialog/tags.cpp:688
+#: ../src/ui/dialog/tags.cpp:669
msgid "Add selection to set"
msgstr ""
-#: ../src/ui/dialog/tags.cpp:846
+#: ../src/ui/dialog/tags.cpp:827
msgid "Moved sets"
msgstr ""
-#: ../src/ui/dialog/tags.cpp:1016
+#: ../src/ui/dialog/tags.cpp:997
msgid "Add a new selection set"
msgstr ""
-#: ../src/ui/dialog/tags.cpp:1025
+#: ../src/ui/dialog/tags.cpp:1006
msgid "Remove Item/Set"
msgstr ""
@@ -20574,7 +20777,7 @@ msgstr "Ferill: "
#: ../src/ui/dialog/template-widget.cpp:126
msgid "Description: "
-msgstr "LĂœsing:"
+msgstr "LĂœsing: "
#: ../src/ui/dialog/template-widget.cpp:128
msgid "Keywords: "
@@ -20610,7 +20813,7 @@ msgstr "Jafna til hĂŠgri"
#: ../src/ui/dialog/text-edit.cpp:99 ../src/widgets/text-toolbar.cpp:1358
msgid "Justify (only flowed text)"
-msgstr "Hliðjafna (aðeins texta með skriði)"
+msgstr "Hliðjafna (aðeins flÊðitexti)"
#. Direction buttons
#: ../src/ui/dialog/text-edit.cpp:108 ../src/widgets/text-toolbar.cpp:1393
@@ -20630,7 +20833,7 @@ msgid "Text path offset"
msgstr ""
#: ../src/ui/dialog/text-edit.cpp:586 ../src/ui/dialog/text-edit.cpp:660
-#: ../src/ui/tools/text-tool.cpp:1455
+#: ../src/ui/tools/text-tool.cpp:1446
msgid "Set text style"
msgstr "Setja textastĂ­l"
@@ -20660,7 +20863,7 @@ msgstr "Raða völdum hlutum"
#. brightness
#: ../src/ui/dialog/tracedialog.cpp:508
msgid "_Brightness cutoff"
-msgstr ""
+msgstr "_Birtustigsfall"
#: ../src/ui/dialog/tracedialog.cpp:512
msgid "Trace by a given brightness level"
@@ -20668,11 +20871,11 @@ msgstr "Linuteikna eftir tilteknu birtustigi"
#: ../src/ui/dialog/tracedialog.cpp:519
msgid "Brightness cutoff for black/white"
-msgstr ""
+msgstr "Birtustigsfall fyrir svart/hvĂ­tt"
#: ../src/ui/dialog/tracedialog.cpp:529
msgid "Single scan: creates a path"
-msgstr ""
+msgstr "Einföld umferð: ĂștbĂœr feril"
#. canny edge detection
#. TRANSLATORS: "Canny" is the name of the inventor of this edge detection method
@@ -20682,11 +20885,11 @@ msgstr "Gr_eining brĂșna"
#: ../src/ui/dialog/tracedialog.cpp:538
msgid "Trace with optimal edge detection by J. Canny's algorithm"
-msgstr ""
+msgstr "LĂ­nuteiknun með bestaðri greiningu brĂșna eftir reikniriti J. Canny"
#: ../src/ui/dialog/tracedialog.cpp:556
msgid "Brightness cutoff for adjacent pixels (determines edge thickness)"
-msgstr ""
+msgstr "Birtustigsfall milli samliggjandi mynddĂ­la (ĂĄkvarðar ĂŸykkt jaðars)"
#: ../src/ui/dialog/tracedialog.cpp:559
msgid "T_hreshold:"
@@ -20698,15 +20901,15 @@ msgstr "Litmör_k:"
#. colors and then re-applying this reduced set to the original image.
#: ../src/ui/dialog/tracedialog.cpp:571
msgid "Color _quantization"
-msgstr ""
+msgstr "_Fjöldi lita"
#: ../src/ui/dialog/tracedialog.cpp:575
msgid "Trace along the boundaries of reduced colors"
-msgstr ""
+msgstr "Línuteiknun meðfram mörkum fÊkkaðra lita"
#: ../src/ui/dialog/tracedialog.cpp:583
msgid "The number of reduced colors"
-msgstr ""
+msgstr "Fjöldi fÊkkaðra lita"
#: ../src/ui/dialog/tracedialog.cpp:586
msgid "_Colors:"
@@ -20715,7 +20918,7 @@ msgstr "_Litir:"
#. swap black and white
#: ../src/ui/dialog/tracedialog.cpp:594
msgid "_Invert image"
-msgstr ""
+msgstr "SnĂșa við l_itum myndar"
#: ../src/ui/dialog/tracedialog.cpp:599
msgid "Invert black and white regions"
@@ -20725,19 +20928,19 @@ msgstr "Víxla svörtum og hvítum svÊðum"
#. # begin multiple scan
#: ../src/ui/dialog/tracedialog.cpp:609
msgid "B_rightness steps"
-msgstr ""
+msgstr "Bi_rtustigsĂŸrep"
#: ../src/ui/dialog/tracedialog.cpp:613
msgid "Trace the given number of brightness levels"
-msgstr ""
+msgstr "Linuteikna eftir tilteknum fjölda birtustiga"
#: ../src/ui/dialog/tracedialog.cpp:621
msgid "Sc_ans:"
-msgstr ""
+msgstr "_Umferðir:"
#: ../src/ui/dialog/tracedialog.cpp:625
msgid "The desired number of scans"
-msgstr ""
+msgstr "Umbeðinn fjöldi umferða"
#: ../src/ui/dialog/tracedialog.cpp:630
msgid "Co_lors"
@@ -20745,7 +20948,7 @@ msgstr "_Litir"
#: ../src/ui/dialog/tracedialog.cpp:634
msgid "Trace the given number of reduced colors"
-msgstr ""
+msgstr "Línuteiknun åkveðins fjölda fÊkkaðra lita"
#: ../src/ui/dialog/tracedialog.cpp:639
msgid "_Grays"
@@ -20753,7 +20956,7 @@ msgstr "_GrĂĄtĂłnar"
#: ../src/ui/dialog/tracedialog.cpp:643
msgid "Same as Colors, but the result is converted to grayscale"
-msgstr ""
+msgstr "Sama og fyrir liti, en Ăștkomunni er umbreytt Ă­ Ă­ grĂĄtĂłna"
#. TRANSLATORS: "Smooth" is a verb here
#: ../src/ui/dialog/tracedialog.cpp:649
@@ -20762,31 +20965,33 @@ msgstr "_MĂœking"
#: ../src/ui/dialog/tracedialog.cpp:653
msgid "Apply Gaussian blur to the bitmap before tracing"
-msgstr ""
+msgstr "Beita GaussĂ­skri afskerpingu ĂĄ bitamynd åður en hĂșn er lĂ­nuteiknuð"
#. TRANSLATORS: "Stack" is a verb here
#: ../src/ui/dialog/tracedialog.cpp:657
msgid "Stac_k scans"
-msgstr ""
+msgstr "Sta_fla umferðum"
#: ../src/ui/dialog/tracedialog.cpp:661
msgid ""
"Stack scans on top of one another (no gaps) instead of tiling (usually with "
"gaps)"
msgstr ""
+"Staflar umferðum hverri ofan ĂĄ aðra (ĂĄn bila) Ă­ stað ĂŸess að flĂ­saleggja "
+"(venjulega með bilum)"
#: ../src/ui/dialog/tracedialog.cpp:665
msgid "Remo_ve background"
-msgstr ""
+msgstr "FjarlĂŠgja bakgrunn"
#. TRANSLATORS: "Layer" refers to one of the stacked paths in the multiscan
#: ../src/ui/dialog/tracedialog.cpp:670
msgid "Remove bottom (background) layer when done"
-msgstr ""
+msgstr "FjarlĂŠgja neðsta lagið (bakgrunn) ĂŸegar ferli er lokið"
#: ../src/ui/dialog/tracedialog.cpp:675
msgid "Multiple scans: creates a group of paths"
-msgstr ""
+msgstr "MargĂŸrepa: ĂștbĂœr hĂłpa af ferlum"
#. # end multiple scan
#. ## end mode page
@@ -20818,7 +21023,7 @@ msgstr "MĂœkja _horn"
#: ../src/ui/dialog/tracedialog.cpp:710
msgid "Smooth out sharp corners of the trace"
-msgstr ""
+msgstr "MĂœkja skörp horn lĂ­nuteikningarinnar"
#: ../src/ui/dialog/tracedialog.cpp:719
msgid "Increase this to smooth corners more"
@@ -20830,13 +21035,13 @@ msgstr "_Besta ferla"
#: ../src/ui/dialog/tracedialog.cpp:729
msgid "Try to optimize paths by joining adjacent Bezier curve segments"
-msgstr ""
+msgstr "Reyna að besta ferla með ĂŸvĂ­ að sameina samliggjandi Bezier-ferilbĂșta"
#: ../src/ui/dialog/tracedialog.cpp:737
msgid ""
"Increase this to reduce the number of nodes in the trace by more aggressive "
"optimization"
-msgstr ""
+msgstr "Auka ĂŸetta til að fĂŠkka hnĂștum Ă­ lĂ­nurakningunni með ĂĄkveðnari bestun"
#: ../src/ui/dialog/tracedialog.cpp:739
msgid "To_lerance:"
@@ -20870,11 +21075,11 @@ msgstr "Framlög"
#. ## SIOX
#: ../src/ui/dialog/tracedialog.cpp:774
msgid "SIOX _foreground selection"
-msgstr ""
+msgstr "SIOX _forgrunnsval"
#: ../src/ui/dialog/tracedialog.cpp:777
msgid "Cover the area you want to select as the foreground"
-msgstr ""
+msgstr "Hyldu svÊðið sem ĂŸĂș vilt velja sem forgrunn"
#: ../src/ui/dialog/tracedialog.cpp:782
msgid "Live Preview"
@@ -20890,6 +21095,8 @@ msgid ""
"Preview the intermediate bitmap with the current settings, without actual "
"tracing"
msgstr ""
+"Forskoða Ăștkomu bitamyndarinnar með nĂșverandi stillingum, ĂĄn ĂŸess ĂŸĂł að "
+"framkvĂŠma lĂ­nurakninguna"
#: ../src/ui/dialog/tracedialog.cpp:800
msgid "Preview"
@@ -20902,7 +21109,7 @@ msgstr "_Lårétt:"
#: ../src/ui/dialog/transformation.cpp:74
msgid "Horizontal displacement (relative) or position (absolute)"
-msgstr ""
+msgstr "Lårétt fÊrsla (afstÊð) eða staðsetning (algild)"
#: ../src/ui/dialog/transformation.cpp:76
#: ../src/ui/dialog/transformation.cpp:86
@@ -20911,15 +21118,15 @@ msgstr "Lóð_rétt:"
#: ../src/ui/dialog/transformation.cpp:76
msgid "Vertical displacement (relative) or position (absolute)"
-msgstr ""
+msgstr "Lóðrétt fÊrsla (afstÊð) eða staðsetning (algild)"
#: ../src/ui/dialog/transformation.cpp:78
msgid "Horizontal size (absolute or percentage of current)"
-msgstr ""
+msgstr "LĂĄrĂ©tt stĂŠrð (algild eða Ă­ prĂłsentuhlutfalli við nĂșverandi stĂŠrð)"
#: ../src/ui/dialog/transformation.cpp:80
msgid "Vertical size (absolute or percentage of current)"
-msgstr ""
+msgstr "LóðrĂ©tt stĂŠrð (algild eða Ă­ prĂłsentuhlutfalli við nĂșverandi stĂŠrð)"
#: ../src/ui/dialog/transformation.cpp:82
msgid "A_ngle:"
@@ -20935,12 +21142,16 @@ msgid ""
"Horizontal skew angle (positive = counterclockwise), or absolute "
"displacement, or percentage displacement"
msgstr ""
+"Låðrétt skekkingarhorn (jåkvÊtt = rangsÊlis), eða algild tilfÊrsla eða "
+"tilfĂŠrsla Ă­ prĂłsentuhlutfalli"
#: ../src/ui/dialog/transformation.cpp:86
msgid ""
"Vertical skew angle (positive = counterclockwise), or absolute displacement, "
"or percentage displacement"
msgstr ""
+"Lóðrétt skekkingarhorn (jåkvÊtt = rangsÊlis), eða algild tilfÊrsla eða "
+"tilfĂŠrsla Ă­ prĂłsentuhlutfalli"
#: ../src/ui/dialog/transformation.cpp:89
msgid "Transformation matrix element A"
@@ -21026,15 +21237,15 @@ msgstr "Frumstilla gildin ĂĄ ĂŸessum flipa ĂĄ sjĂĄlfgefin gildi"
#: ../src/ui/dialog/transformation.cpp:155
msgid "Apply transformation to selection"
-msgstr ""
+msgstr "Beita umbreytingu å valið"
#: ../src/ui/dialog/transformation.cpp:331
msgid "Rotate in a counterclockwise direction"
-msgstr ""
+msgstr "SnĂșa rangsĂŠlis"
#: ../src/ui/dialog/transformation.cpp:337
msgid "Rotate in a clockwise direction"
-msgstr ""
+msgstr "SnĂșa rĂ©ttsĂŠlis"
#: ../src/ui/dialog/transformation.cpp:907
#: ../src/ui/dialog/transformation.cpp:918
@@ -21056,104 +21267,106 @@ msgstr "SnĂșningshorn (jĂĄkvĂŠtt = rĂ©ttsĂŠlis)"
#: ../src/ui/dialog/xml-tree.cpp:70 ../src/ui/dialog/xml-tree.cpp:126
msgid "New element node"
-msgstr ""
+msgstr "NĂœr stakliður"
#: ../src/ui/dialog/xml-tree.cpp:71 ../src/ui/dialog/xml-tree.cpp:132
msgid "New text node"
-msgstr ""
+msgstr "NĂœr textaliður"
#: ../src/ui/dialog/xml-tree.cpp:72 ../src/ui/dialog/xml-tree.cpp:146
msgid "nodeAsInXMLdialogTooltip|Delete node"
-msgstr ""
+msgstr "Eyða lið"
#: ../src/ui/dialog/xml-tree.cpp:73 ../src/ui/dialog/xml-tree.cpp:138
-#: ../src/ui/dialog/xml-tree.cpp:977
+#: ../src/ui/dialog/xml-tree.cpp:985
msgid "Duplicate node"
-msgstr "Tvöfalda hnĂșt"
+msgstr "Tvöfalda lið"
-#: ../src/ui/dialog/xml-tree.cpp:79 ../src/ui/dialog/xml-tree.cpp:191
-#: ../src/ui/dialog/xml-tree.cpp:1013
+#: ../src/ui/dialog/xml-tree.cpp:79 ../src/ui/dialog/xml-tree.cpp:199
+#: ../src/ui/dialog/xml-tree.cpp:1021
msgid "Delete attribute"
-msgstr ""
+msgstr "Eyða eigindi"
#: ../src/ui/dialog/xml-tree.cpp:87
msgid "Set"
-msgstr "Stilla"
+msgstr "Setja"
#: ../src/ui/dialog/xml-tree.cpp:121
msgid "Drag to reorder nodes"
-msgstr ""
+msgstr "Draga til að endurraða liðum"
-#: ../src/ui/dialog/xml-tree.cpp:152 ../src/ui/dialog/xml-tree.cpp:153
-#: ../src/ui/dialog/xml-tree.cpp:1135
+#: ../src/ui/dialog/xml-tree.cpp:154 ../src/ui/dialog/xml-tree.cpp:155
+#: ../src/ui/dialog/xml-tree.cpp:1143
msgid "Unindent node"
-msgstr ""
+msgstr "FjarlÊgja inndrått liðar"
-#: ../src/ui/dialog/xml-tree.cpp:157 ../src/ui/dialog/xml-tree.cpp:158
-#: ../src/ui/dialog/xml-tree.cpp:1113
+#: ../src/ui/dialog/xml-tree.cpp:161 ../src/ui/dialog/xml-tree.cpp:162
+#: ../src/ui/dialog/xml-tree.cpp:1121
msgid "Indent node"
-msgstr ""
+msgstr "Draga inn lið"
-#: ../src/ui/dialog/xml-tree.cpp:162 ../src/ui/dialog/xml-tree.cpp:163
-#: ../src/ui/dialog/xml-tree.cpp:1064
+#: ../src/ui/dialog/xml-tree.cpp:168 ../src/ui/dialog/xml-tree.cpp:169
+#: ../src/ui/dialog/xml-tree.cpp:1072
msgid "Raise node"
-msgstr ""
+msgstr "HÊkka lið"
-#: ../src/ui/dialog/xml-tree.cpp:167 ../src/ui/dialog/xml-tree.cpp:168
-#: ../src/ui/dialog/xml-tree.cpp:1082
+#: ../src/ui/dialog/xml-tree.cpp:175 ../src/ui/dialog/xml-tree.cpp:176
+#: ../src/ui/dialog/xml-tree.cpp:1090
msgid "Lower node"
-msgstr ""
+msgstr "LÊkka lið"
-#: ../src/ui/dialog/xml-tree.cpp:208
+#: ../src/ui/dialog/xml-tree.cpp:216
msgid "Attribute name"
-msgstr ""
+msgstr "Heiti ĂĄ eigindi"
-#: ../src/ui/dialog/xml-tree.cpp:223
+#: ../src/ui/dialog/xml-tree.cpp:231
msgid "Attribute value"
-msgstr ""
+msgstr "Gildi eigindis"
-#: ../src/ui/dialog/xml-tree.cpp:311
+#: ../src/ui/dialog/xml-tree.cpp:319
msgid "<b>Click</b> to select nodes, <b>drag</b> to rearrange."
-msgstr ""
+msgstr "<b>Smelltu</b> til að velja liði, <b>dragðu</b> til að endurraða."
-#: ../src/ui/dialog/xml-tree.cpp:322
+#: ../src/ui/dialog/xml-tree.cpp:330
msgid "<b>Click</b> attribute to edit."
-msgstr ""
+msgstr "<b>Smelltu</b> å eigindi til að breyta."
-#: ../src/ui/dialog/xml-tree.cpp:326
+#: ../src/ui/dialog/xml-tree.cpp:334
#, c-format
msgid ""
"Attribute <b>%s</b> selected. Press <b>Ctrl+Enter</b> when done editing to "
"commit changes."
msgstr ""
+"Eigindið <b>%s</b> valið. Ýttu ĂĄ <b>Ctrl+Enter</b> ĂŸegar breytingum er lokið "
+"til að staðfesta breytingar."
-#: ../src/ui/dialog/xml-tree.cpp:566
+#: ../src/ui/dialog/xml-tree.cpp:574
msgid "Drag XML subtree"
-msgstr ""
+msgstr "Draga XML undirgreinar"
-#: ../src/ui/dialog/xml-tree.cpp:868
+#: ../src/ui/dialog/xml-tree.cpp:876
msgid "New element node..."
-msgstr ""
+msgstr "NĂœr stakliður..."
-#: ../src/ui/dialog/xml-tree.cpp:906
+#: ../src/ui/dialog/xml-tree.cpp:914
msgid "Cancel"
msgstr "HÊtta við"
-#: ../src/ui/dialog/xml-tree.cpp:943
+#: ../src/ui/dialog/xml-tree.cpp:951
msgid "Create new element node"
-msgstr ""
+msgstr "BĂșa til nĂœjan staklið"
-#: ../src/ui/dialog/xml-tree.cpp:959
+#: ../src/ui/dialog/xml-tree.cpp:967
msgid "Create new text node"
-msgstr ""
+msgstr "BĂșa til nĂœjan textalið"
-#: ../src/ui/dialog/xml-tree.cpp:994
+#: ../src/ui/dialog/xml-tree.cpp:1002
msgid "nodeAsInXMLinHistoryDialog|Delete node"
-msgstr ""
+msgstr "Eyða lið"
-#: ../src/ui/dialog/xml-tree.cpp:1038
+#: ../src/ui/dialog/xml-tree.cpp:1046
msgid "Change attribute"
-msgstr ""
+msgstr "Breyta eigindi"
#: ../src/ui/interface.cpp:748
msgctxt "Interface setup"
@@ -21162,7 +21375,7 @@ msgstr "Sjålfgefið"
#: ../src/ui/interface.cpp:748
msgid "Default interface setup"
-msgstr ""
+msgstr "Uppsetning sjålfgefins viðmóts"
#: ../src/ui/interface.cpp:749
msgctxt "Interface setup"
@@ -21171,7 +21384,7 @@ msgstr "Sérsniðið"
#: ../src/ui/interface.cpp:749
msgid "Setup for custom task"
-msgstr ""
+msgstr "Stilla fyrir sérsniðið verk"
#: ../src/ui/interface.cpp:750
msgctxt "Interface setup"
@@ -21185,7 +21398,7 @@ msgstr "Setja upp fyrir vinnu å breiðskjå"
#: ../src/ui/interface.cpp:862
#, c-format
msgid "Verb \"%s\" Unknown"
-msgstr ""
+msgstr "Sögnin \"%s\" ĂłĂŸekkt"
#: ../src/ui/interface.cpp:901
msgid "Open _Recent"
@@ -21194,27 +21407,27 @@ msgstr "O_pna nĂœlegt"
#: ../src/ui/interface.cpp:1009 ../src/ui/interface.cpp:1095
#: ../src/ui/interface.cpp:1198 ../src/ui/widget/selected-style.cpp:544
msgid "Drop color"
-msgstr ""
+msgstr "Sleppa lit"
#: ../src/ui/interface.cpp:1048 ../src/ui/interface.cpp:1158
msgid "Drop color on gradient"
-msgstr ""
+msgstr "Sleppa lit ĂĄ litstigul"
#: ../src/ui/interface.cpp:1211
msgid "Could not parse SVG data"
-msgstr ""
+msgstr "Gat ekki ĂŸĂĄttað SVG-gögn"
#: ../src/ui/interface.cpp:1250
msgid "Drop SVG"
-msgstr ""
+msgstr "Sleppa SVG"
#: ../src/ui/interface.cpp:1263
msgid "Drop Symbol"
-msgstr ""
+msgstr "Sleppa tĂĄkni"
#: ../src/ui/interface.cpp:1294
msgid "Drop bitmap image"
-msgstr ""
+msgstr "Sleppa bitamynd"
#: ../src/ui/interface.cpp:1386
#, c-format
@@ -21224,6 +21437,11 @@ msgid ""
"\n"
"The file already exists in \"%s\". Replacing it will overwrite its contents."
msgstr ""
+"<span weight=\"bold\" size=\"larger\">SkrĂĄ með heitinu \"%s\" er ĂŸegar til. "
+"Viltu skipta henni Ășt?</span>\n"
+"\n"
+"SkrĂĄin er ĂŸegar til Ă­ \"%s\". Verði henni skipt Ășt verður skrifað yfir "
+"innihaldið."
#: ../src/ui/interface.cpp:1393 ../share/extensions/web-set-att.inx.h:21
#: ../share/extensions/web-transmit-att.inx.h:19
@@ -21232,7 +21450,7 @@ msgstr "Skipta Ășt"
#: ../src/ui/interface.cpp:1464
msgid "Go to parent"
-msgstr ""
+msgstr "Fara Ă­ forvera"
#. TRANSLATORS: #%1 is the id of the group e.g. <g id="#g7">, not a number.
#: ../src/ui/interface.cpp:1505
@@ -21364,7 +21582,7 @@ msgstr "LĂ­nu_teikna bitamynd..."
#. Trace Pixel Art
#: ../src/ui/interface.cpp:1999
msgid "Trace Pixel Art"
-msgstr ""
+msgstr "LĂ­nuteikna Pixel Art"
#: ../src/ui/interface.cpp:2009
msgctxt "Context menu"
@@ -21393,96 +21611,121 @@ msgstr "_Texti og letur..."
msgid "Check Spellin_g..."
msgstr "_Yfirfara stafsetningu..."
-#: ../src/ui/object-edit.cpp:456
+#: ../src/ui/object-edit.cpp:464
msgid ""
"Adjust the <b>horizontal rounding</b> radius; with <b>Ctrl</b> to make the "
"vertical radius the same"
msgstr ""
+"Aðlaga radĂ­us <b>lĂĄrĂ©ttrar rĂșnnunar</b>; með <b>Ctrl</b> mĂĄ lĂĄta lóðrĂ©ttan "
+"radĂ­us vera ĂŸann sama"
-#: ../src/ui/object-edit.cpp:461
+#: ../src/ui/object-edit.cpp:469
msgid ""
"Adjust the <b>vertical rounding</b> radius; with <b>Ctrl</b> to make the "
"horizontal radius the same"
msgstr ""
+"Aðlaga radĂ­us <b>lóðrĂ©ttrar rĂșnnunar</b>; með <b>Ctrl</b> mĂĄ lĂĄta lĂĄrĂ©ttan "
+"radĂ­us vera ĂŸann sama"
-#: ../src/ui/object-edit.cpp:466 ../src/ui/object-edit.cpp:471
+#: ../src/ui/object-edit.cpp:474 ../src/ui/object-edit.cpp:479
msgid ""
"Adjust the <b>width and height</b> of the rectangle; with <b>Ctrl</b> to "
"lock ratio or stretch in one dimension only"
msgstr ""
+"Aðlaga <b>breidd og hÊð</b> rétthyrningsins; með <b>Ctrl</b> til að lÊsa "
+"hlutföllum eða teygja einungis í eina ått"
-#: ../src/ui/object-edit.cpp:718 ../src/ui/object-edit.cpp:722
#: ../src/ui/object-edit.cpp:726 ../src/ui/object-edit.cpp:730
+#: ../src/ui/object-edit.cpp:734 ../src/ui/object-edit.cpp:738
msgid ""
"Resize box in X/Y direction; with <b>Shift</b> along the Z axis; with "
"<b>Ctrl</b> to constrain to the directions of edges or diagonals"
msgstr ""
+"Breyta stÊrð kassa í X/Y stefnu; með <b>Shift</b> eftir Z ås; með <b>Ctrl</"
+"b> til að skilyrða í stefnur jaðra eða skålína"
-#: ../src/ui/object-edit.cpp:734 ../src/ui/object-edit.cpp:738
#: ../src/ui/object-edit.cpp:742 ../src/ui/object-edit.cpp:746
+#: ../src/ui/object-edit.cpp:750 ../src/ui/object-edit.cpp:754
msgid ""
"Resize box along the Z axis; with <b>Shift</b> in X/Y direction; with "
"<b>Ctrl</b> to constrain to the directions of edges or diagonals"
msgstr ""
+"Breyta stÊrð kassa eftir Z ås; með <b>Shift</b> í X/Y stefnu; með <b>Ctrl</"
+"b> til að skilyrða í stefnur jaðra eða skålína"
-#: ../src/ui/object-edit.cpp:750
+#: ../src/ui/object-edit.cpp:758
msgid "Move the box in perspective"
-msgstr ""
+msgstr "FĂŠra kassa Ă­ fjarvĂ­dd"
-#: ../src/ui/object-edit.cpp:989
+#: ../src/ui/object-edit.cpp:997
msgid "Adjust ellipse <b>width</b>, with <b>Ctrl</b> to make circle"
-msgstr ""
+msgstr "Aðlaga <b>breidd</b> sporöskju, með <b>Ctrl</b> til að gera hring"
-#: ../src/ui/object-edit.cpp:993
+#: ../src/ui/object-edit.cpp:1001
msgid "Adjust ellipse <b>height</b>, with <b>Ctrl</b> to make circle"
-msgstr ""
+msgstr "Aðlaga <b>hÊð</b> sporöskju, með <b>Ctrl</b> til að gera hring"
-#: ../src/ui/object-edit.cpp:997
+#: ../src/ui/object-edit.cpp:1005
msgid ""
"Position the <b>start point</b> of the arc or segment; with <b>Ctrl</b> to "
"snap angle; drag <b>inside</b> the ellipse for arc, <b>outside</b> for "
"segment"
msgstr ""
+"Staðsettu <b>upphafspunkt</b> boglínu eða geira; með <b>Ctrl</b> til að "
+"ĂŸrepa hornin; dragðu <b>innan Ă­</b> til að breyta sporbaugnum Ă­ boglĂ­nu, "
+"<b>utan við</b> til að mynda geira/sneið"
-#: ../src/ui/object-edit.cpp:1002
+#: ../src/ui/object-edit.cpp:1010
msgid ""
"Position the <b>end point</b> of the arc or segment; with <b>Ctrl</b> to "
"snap angle; drag <b>inside</b> the ellipse for arc, <b>outside</b> for "
"segment"
msgstr ""
+"Staðsettu <b>endapunkt</b> boglĂ­nu eða geira; með <b>Ctrl</b> til að ĂŸrepa "
+"hornin; dragðu <b>innan í</b> til að breyta sporbaugnum í boglínu, <b>utan "
+"við</b> til að mynda geira/sneið"
-#: ../src/ui/object-edit.cpp:1148
+#: ../src/ui/object-edit.cpp:1156
msgid ""
"Adjust the <b>tip radius</b> of the star or polygon; with <b>Shift</b> to "
"round; with <b>Alt</b> to randomize"
msgstr ""
+"Fínstilla <b>radíus odds</b> å stjörnu eða marghyrningi; með <b>Shift</b> "
+"til að rĂșnna; með <b>Alt</b> til að slembigera"
-#: ../src/ui/object-edit.cpp:1156
+#: ../src/ui/object-edit.cpp:1164
msgid ""
"Adjust the <b>base radius</b> of the star; with <b>Ctrl</b> to keep star "
"rays radial (no skew); with <b>Shift</b> to round; with <b>Alt</b> to "
"randomize"
msgstr ""
+"Fínstilla <b>grunnradíus</b> stjörnu; með <b>Ctrl</b> til að halda geislum "
+"stjörnu miðlĂŠgum (engin skekkja); með <b>Shift</b> til að rĂșnna; með <b>Alt</"
+"b> til að slembigera"
-#: ../src/ui/object-edit.cpp:1351
+#: ../src/ui/object-edit.cpp:1359
msgid ""
"Roll/unroll the spiral from <b>inside</b>; with <b>Ctrl</b> to snap angle; "
"with <b>Alt</b> to converge/diverge"
msgstr ""
+"Vinda/afvinda spĂ­ral að <b>innan</b>; með <b>Ctrl</b> til að ĂŸrepa horn; með "
+"<b>Alt</b> til að leita inn/Ășt"
-#: ../src/ui/object-edit.cpp:1355
+#: ../src/ui/object-edit.cpp:1363
msgid ""
"Roll/unroll the spiral from <b>outside</b>; with <b>Ctrl</b> to snap angle; "
"with <b>Shift</b> to scale/rotate; with <b>Alt</b> to lock radius"
msgstr ""
+"Vinda/afvinda spĂ­ral að <b>utan</b>; með <b>Ctrl</b> til að ĂŸrepa horn; með <"
+"b>Shift</b> til að kvarða/snĂșa; með <b>Alt</b> til að lĂŠsa radĂ­us"
-#: ../src/ui/object-edit.cpp:1402
+#: ../src/ui/object-edit.cpp:1410
msgid "Adjust the <b>offset distance</b>"
-msgstr ""
+msgstr "Laga <b>vegalengd hliðrunar</b>"
-#: ../src/ui/object-edit.cpp:1439
+#: ../src/ui/object-edit.cpp:1447
msgid "Drag to resize the <b>flowed text frame</b>"
-msgstr ""
+msgstr "Dragðu til að breyta stÊrð <b>ramma með flÊðitexta</b>"
#: ../src/ui/tool/curve-drag-point.cpp:119
msgid "Drag curve"
@@ -21495,12 +21738,12 @@ msgstr "BĂŠta við hnĂșt"
#: ../src/ui/tool/curve-drag-point.cpp:186
msgctxt "Path segment tip"
msgid "<b>Shift</b>: click to toggle segment selection"
-msgstr ""
+msgstr "<b>Shift</b>: smella til að vĂ­xla vali bĂșta"
#: ../src/ui/tool/curve-drag-point.cpp:190
msgctxt "Path segment tip"
msgid "<b>Ctrl+Alt</b>: click to insert a node"
-msgstr ""
+msgstr "<b>Ctrl+Alt</b>: Smella til að setja inn hnĂșt"
#: ../src/ui/tool/curve-drag-point.cpp:194
msgctxt "Path segment tip"
@@ -21508,6 +21751,8 @@ msgid ""
"<b>Linear segment</b>: drag to convert to a Bezier segment, doubleclick to "
"insert node, click to select (more: Shift, Ctrl+Alt)"
msgstr ""
+"<b>LĂ­nulegur bĂștur</b>: draga til að umbreyta Ă­ Bezier bĂșt, tvĂ­smella til að "
+"setja inn hnĂșt, smella til að velja (meira: Shift, Ctrl+Alt)"
#: ../src/ui/tool/curve-drag-point.cpp:198
msgctxt "Path segment tip"
@@ -21515,14 +21760,16 @@ msgid ""
"<b>Bezier segment</b>: drag to shape the segment, doubleclick to insert "
"node, click to select (more: Shift, Ctrl+Alt)"
msgstr ""
+"<b>Bezier bĂștur</b>: draga til að forma bĂștinn, tvĂ­smella til að setja inn "
+"hnĂșt, smella til að velja (meira: Shift, Ctrl+Alt)"
#: ../src/ui/tool/multi-path-manipulator.cpp:315
msgid "Retract handles"
-msgstr ""
+msgstr "Draga inn haldföng"
#: ../src/ui/tool/multi-path-manipulator.cpp:315 ../src/ui/tool/node.cpp:296
msgid "Change node type"
-msgstr ""
+msgstr "Breyta tegund hnĂșts"
#: ../src/ui/tool/multi-path-manipulator.cpp:323
msgid "Straighten segments"
@@ -21605,34 +21852,34 @@ msgstr "Spegla hnĂștum lóðrĂ©tt"
#: ../src/ui/tool/node.cpp:271
msgid "Cusp node handle"
-msgstr ""
+msgstr "Haldfang ĂĄ frjĂĄlsum hnĂșt"
#: ../src/ui/tool/node.cpp:272
msgid "Smooth node handle"
-msgstr ""
+msgstr "Haldfang ĂĄ mjĂșkum hnĂșt"
#: ../src/ui/tool/node.cpp:273
msgid "Symmetric node handle"
-msgstr ""
+msgstr "Haldfang ĂĄ samhverfum hnĂșt"
#: ../src/ui/tool/node.cpp:274
msgid "Auto-smooth node handle"
-msgstr ""
+msgstr "Haldfang ĂĄ sjĂĄlfvirkt mĂœktum hnĂșt"
#: ../src/ui/tool/node.cpp:493
msgctxt "Path handle tip"
msgid "more: Shift, Ctrl, Alt"
-msgstr ""
+msgstr "meira: Shift, Ctrl, Alt"
#: ../src/ui/tool/node.cpp:495
msgctxt "Path handle tip"
msgid "more: Ctrl"
-msgstr ""
+msgstr "meira: Ctrl"
#: ../src/ui/tool/node.cpp:497
msgctxt "Path handle tip"
msgid "more: Ctrl, Alt"
-msgstr ""
+msgstr "meira: Ctrl, Alt"
#: ../src/ui/tool/node.cpp:503
#, c-format
@@ -21641,23 +21888,25 @@ msgid ""
"<b>Shift+Ctrl+Alt</b>: preserve length and snap rotation angle to %g° "
"increments while rotating both handles"
msgstr ""
+"<b>Shift+Ctrl+Alt</b>: vernda lengd haldfangs, ĂŸrepa snĂșningshorn Ă­ %g° "
+"bilum og snĂșa båðum haldföngum"
#: ../src/ui/tool/node.cpp:508
#, c-format
msgctxt "Path handle tip"
msgid ""
"<b>Ctrl+Alt</b>: preserve length and snap rotation angle to %g° increments"
-msgstr ""
+msgstr "<b>Ctrl+Alt</b>: vernda lengd og ĂŸrepa snĂșningshorn Ă­ %g° bilum"
#: ../src/ui/tool/node.cpp:514
msgctxt "Path handle tip"
msgid "<b>Shift+Alt</b>: preserve handle length and rotate both handles"
-msgstr ""
+msgstr "<b>Shift+Alt</b>: vernda lengd haldfangs og snĂșa båðum haldföngum"
#: ../src/ui/tool/node.cpp:517
msgctxt "Path handle tip"
msgid "<b>Alt</b>: preserve handle length while dragging"
-msgstr ""
+msgstr "<b>Alt</b>: vernda lengd haldfangs við að draga"
#: ../src/ui/tool/node.cpp:524
#, c-format
@@ -21666,76 +21915,80 @@ msgid ""
"<b>Shift+Ctrl</b>: snap rotation angle to %g° increments and rotate both "
"handles"
msgstr ""
+"<b>Shift+Ctrl</b>: ĂŸrepa snĂșningshorn Ă­ %g° bilum og snĂșa båðum haldföngum"
#: ../src/ui/tool/node.cpp:528
msgctxt "Path handle tip"
msgid "<b>Ctrl</b>: Move handle by his actual steps in BSpline Live Effect"
-msgstr ""
+msgstr "<b>Ctrl</b>: FĂŠra haldfang um eigin ĂŸrep Ă­ BSpline Live Effect"
#: ../src/ui/tool/node.cpp:531
#, c-format
msgctxt "Path handle tip"
msgid "<b>Ctrl</b>: snap rotation angle to %g° increments, click to retract"
-msgstr ""
+msgstr "<b>Ctrl</b>: ĂŸrepa snĂșningshorn Ă­ %g° bilum, smella til að draga inn"
#: ../src/ui/tool/node.cpp:536
msgctxt "Path hande tip"
msgid "<b>Shift</b>: rotate both handles by the same angle"
-msgstr ""
+msgstr "<b>Shift</b>: snĂșa båðum haldföngum um sama horn"
#: ../src/ui/tool/node.cpp:539
msgctxt "Path hande tip"
msgid "<b>Shift</b>: move handle"
-msgstr ""
+msgstr "<b>Shift</b>: fĂŠra haldfang"
#: ../src/ui/tool/node.cpp:546 ../src/ui/tool/node.cpp:550
#, c-format
msgctxt "Path handle tip"
msgid "<b>Auto node handle</b>: drag to convert to smooth node (%s)"
msgstr ""
+"<b>Haldfang ĂĄ sjĂĄlfvirkum hnĂșt</b>: draga til að umbreyta Ă­ mĂœktan hnĂșt (%s)"
#: ../src/ui/tool/node.cpp:553
#, c-format
msgctxt "Path handle tip"
msgid "<b>BSpline node handle</b>: Shift to drag, double click to reset (%s)"
msgstr ""
+"<b>Haldfang BSplĂ­nu hnĂșts</b>: Shift til að draga, tvĂ­smella til að "
+"frumstilla (%s)"
#: ../src/ui/tool/node.cpp:573
#, c-format
msgctxt "Path handle tip"
msgid "Move handle by %s, %s; angle %.2f°, length %s"
-msgstr ""
+msgstr "FÊra haldfang um %s, %s; horn %.2f°, lengd %s"
#: ../src/ui/tool/node.cpp:1447
msgctxt "Path node tip"
msgid "<b>Shift</b>: drag out a handle, click to toggle selection"
-msgstr ""
+msgstr "<b>Shift</b>: draga Ășt haldfang, smella til að vĂ­xla vali"
#: ../src/ui/tool/node.cpp:1449
msgctxt "Path node tip"
msgid "<b>Shift</b>: click to toggle selection"
-msgstr ""
+msgstr "<b>Shift</b>: smella til að víxla vali"
#: ../src/ui/tool/node.cpp:1454
msgctxt "Path node tip"
msgid "<b>Ctrl+Alt</b>: move along handle lines, click to delete node"
-msgstr ""
+msgstr "<b>Ctrl+Alt</b>: fĂŠra eftir lĂ­num haldfanga, smella til að eyða hnĂșt"
#: ../src/ui/tool/node.cpp:1457
msgctxt "Path node tip"
msgid "<b>Ctrl</b>: move along axes, click to change node type"
-msgstr ""
+msgstr "<b>Ctrl</b>: fĂŠra eftir ĂĄsum, smella til að skipta um tegund hnĂșts"
#: ../src/ui/tool/node.cpp:1461
msgctxt "Path node tip"
msgid "<b>Alt</b>: sculpt nodes"
-msgstr ""
+msgstr "<b>Alt</b>: forma hnĂșta"
#: ../src/ui/tool/node.cpp:1469
#, c-format
msgctxt "Path node tip"
msgid "<b>%s</b>: drag to shape the path (more: Shift, Ctrl, Alt)"
-msgstr ""
+msgstr "<b>%s</b>: draga til að forma ferilinn (meira: Shift, Ctrl, Alt)"
#: ../src/ui/tool/node.cpp:1472
#, c-format
@@ -21744,6 +21997,8 @@ msgid ""
"<b>BSpline node</b>: %g weight, drag to shape the path (more: Shift, Ctrl, "
"Alt)"
msgstr ""
+"<b>BSplĂ­nu hnĂștur</b>: %g sverleiki, draga til að forma ferilinn (meira: "
+"Shift, Ctrl, Alt)"
#: ../src/ui/tool/node.cpp:1475
#, c-format
@@ -21752,6 +22007,8 @@ msgid ""
"<b>%s</b>: drag to shape the path, click to toggle scale/rotation handles "
"(more: Shift, Ctrl, Alt)"
msgstr ""
+"<b>%s</b>: draga til að forma ferilinn, smella til að víxla å milli "
+"kvörðunar-/snĂșnings-haldfanga (meira: Shift, Ctrl, Alt)"
#: ../src/ui/tool/node.cpp:1479
#, c-format
@@ -21760,6 +22017,8 @@ msgid ""
"<b>%s</b>: drag to shape the path, click to select only this node (more: "
"Shift, Ctrl, Alt)"
msgstr ""
+"<b>%s</b>: draga til að forma ferilinn, smella til að velja einungis ĂŸennan "
+"hnĂșt (meira: Shift, Ctrl, Alt)"
#: ../src/ui/tool/node.cpp:1482
msgctxt "Path node tip"
@@ -21767,20 +22026,22 @@ msgid ""
"<b>BSpline node</b>: drag to shape the path, click to select only this node "
"(more: Shift, Ctrl, Alt)"
msgstr ""
+"<b>BSplĂ­nu hnĂștur</b>: draga til að forma ferilinn, smella til að velja "
+"einungis ĂŸennan hnĂșt (meira: Shift, Ctrl, Alt)"
#: ../src/ui/tool/node.cpp:1495
#, c-format
msgctxt "Path node tip"
msgid "Move node by %s, %s"
-msgstr ""
+msgstr "Flytja hnĂșt um %s, %s"
#: ../src/ui/tool/node.cpp:1506
msgid "Symmetric node"
-msgstr ""
+msgstr "Samhverfur hnĂștur"
#: ../src/ui/tool/node.cpp:1507
msgid "Auto-smooth node"
-msgstr ""
+msgstr "SjĂĄlfvirkt mĂœktur hnĂștur"
#: ../src/ui/tool/path-manipulator.cpp:836
msgid "Scale handle"
@@ -21794,11 +22055,11 @@ msgstr "SnĂșa haldfangi"
#: ../src/ui/tool/path-manipulator.cpp:1524
#: ../src/widgets/node-toolbar.cpp:397
msgid "Delete node"
-msgstr ""
+msgstr "Eyða hnĂșt"
#: ../src/ui/tool/path-manipulator.cpp:1532
msgid "Cycle node type"
-msgstr ""
+msgstr "Fletta Ă­ gegnum tegundir hnĂșta"
#: ../src/ui/tool/path-manipulator.cpp:1547
msgid "Drag handle"
@@ -21811,33 +22072,33 @@ msgstr "Draga haldfang inn"
#: ../src/ui/tool/transform-handle-set.cpp:195
msgctxt "Transform handle tip"
msgid "<b>Shift+Ctrl</b>: scale uniformly about the rotation center"
-msgstr ""
+msgstr "<b>Shift+Ctrl</b>: kvarða jafnt um snĂșningsmiðjuna"
#: ../src/ui/tool/transform-handle-set.cpp:197
msgctxt "Transform handle tip"
msgid "<b>Ctrl:</b> scale uniformly"
-msgstr ""
+msgstr "<b>Ctrl:</b> kvarða jafnt"
#: ../src/ui/tool/transform-handle-set.cpp:202
msgctxt "Transform handle tip"
msgid ""
"<b>Shift+Alt</b>: scale using an integer ratio about the rotation center"
-msgstr ""
+msgstr "<b>Shift+Alt</b>: kvarða með heiltöluhlutfalli um snĂșningsmiðjuna"
#: ../src/ui/tool/transform-handle-set.cpp:204
msgctxt "Transform handle tip"
msgid "<b>Shift</b>: scale from the rotation center"
-msgstr ""
+msgstr "<b>Shift</b>: kvarða frĂĄ snĂșningsmiðjunni"
#: ../src/ui/tool/transform-handle-set.cpp:207
msgctxt "Transform handle tip"
msgid "<b>Alt</b>: scale using an integer ratio"
-msgstr ""
+msgstr "<b>Alt</b>: kvarða með heiltöluhlutfalli"
#: ../src/ui/tool/transform-handle-set.cpp:209
msgctxt "Transform handle tip"
msgid "<b>Scale handle</b>: drag to scale the selection"
-msgstr ""
+msgstr "<b>Kvörðunarhaldfang</b>: dragðu til að kvarða valið"
#: ../src/ui/tool/transform-handle-set.cpp:214
#, c-format
@@ -21852,17 +22113,18 @@ msgid ""
"<b>Shift+Ctrl</b>: rotate around the opposite corner and snap angle to %f° "
"increments"
msgstr ""
+"<b>Shift+Ctrl</b>: snĂșa um gagnstĂŠtt horn og ĂŸrepa snĂșningshorn Ă­ %f° bilum"
#: ../src/ui/tool/transform-handle-set.cpp:441
msgctxt "Transform handle tip"
msgid "<b>Shift</b>: rotate around the opposite corner"
-msgstr ""
+msgstr "<b>Shift</b>: snĂșa um gagnstĂŠtt horn"
#: ../src/ui/tool/transform-handle-set.cpp:445
#, c-format
msgctxt "Transform handle tip"
msgid "<b>Ctrl</b>: snap angle to %f° increments"
-msgstr ""
+msgstr "<b>Ctrl</b>: ĂŸrepa horn Ă­ %f° bilum"
#: ../src/ui/tool/transform-handle-set.cpp:447
msgctxt "Transform handle tip"
@@ -21870,6 +22132,7 @@ msgid ""
"<b>Rotation handle</b>: drag to rotate the selection around the rotation "
"center"
msgstr ""
+"<b>SnĂșninghaldfang</b>: dragðu til að snĂșa valinu Ă­ kringum snĂșningsmiðju"
#. event
#: ../src/ui/tool/transform-handle-set.cpp:452
@@ -21885,97 +22148,118 @@ msgid ""
"<b>Shift+Ctrl</b>: skew about the rotation center with snapping to %f° "
"increments"
msgstr ""
+"<b>Shift+Ctrl</b>: skekkja um snĂșningsmiðjuna og ĂŸrepa horn Ă­ %f° bilum"
#: ../src/ui/tool/transform-handle-set.cpp:581
msgctxt "Transform handle tip"
msgid "<b>Shift</b>: skew about the rotation center"
-msgstr ""
+msgstr "<b>Shift</b>: skekkja um snĂșningsmiðjuna"
#: ../src/ui/tool/transform-handle-set.cpp:585
#, c-format
msgctxt "Transform handle tip"
msgid "<b>Ctrl</b>: snap skew angle to %f° increments"
-msgstr ""
+msgstr "<b>Ctrl</b>: ĂŸrepa skekkingarhorn Ă­ %f° bilum"
#: ../src/ui/tool/transform-handle-set.cpp:588
msgctxt "Transform handle tip"
msgid ""
"<b>Skew handle</b>: drag to skew (shear) selection about the opposite handle"
msgstr ""
+"<b>Skekkingarhaldfang</b>: dragðu til að skekkja valið (horn-í-horn) um "
+"mĂłtstĂŠtt haldfang"
#: ../src/ui/tool/transform-handle-set.cpp:594
#, c-format
msgctxt "Transform handle tip"
msgid "Skew horizontally by %.2f°"
-msgstr ""
+msgstr "Skew horizontally by %.2f°"
#: ../src/ui/tool/transform-handle-set.cpp:597
#, c-format
msgctxt "Transform handle tip"
msgid "Skew vertically by %.2f°"
-msgstr ""
+msgstr "Skew vertically by %.2f°"
#: ../src/ui/tool/transform-handle-set.cpp:656
msgctxt "Transform handle tip"
msgid "<b>Rotation center</b>: drag to change the origin of transforms"
-msgstr ""
+msgstr "<b>SnĂșningsmiðja</b>: draga til að breyta upphafspunkti ummyndana"
#: ../src/ui/tools-switch.cpp:95
msgid ""
"<b>Click</b> to Select and Transform objects, <b>Drag</b> to select many "
"objects."
msgstr ""
+"<b>Smelltu</b> til að velja og umbreyta hlutum, <b>Dragðu</b> til að velja "
+"marga hluti."
#: ../src/ui/tools-switch.cpp:96
msgid "Modify selected path points (nodes) directly."
-msgstr ""
+msgstr "Breyta völdum ferilhnĂștum beint."
#: ../src/ui/tools-switch.cpp:97
msgid "To tweak a path by pushing, select it and drag over it."
msgstr ""
-"Til að aflaga feril með ĂŸvĂ­ að Ăœta honum, veldu hann og dragðu bendilinn yfir."
+"Til að aflaga feril með ĂŸvĂ­ að Ăœta honum, veldu hann og dragðu bendilinn "
+"yfir."
#: ../src/ui/tools-switch.cpp:98
msgid ""
"<b>Drag</b>, <b>click</b> or <b>click and scroll</b> to spray the selected "
"objects."
msgstr ""
+"<b>Dragðu</b>, <b>smelltu</b> eða <b>smelltu og skrunaðu</b> til að sprauta "
+"valda hluti."
#: ../src/ui/tools-switch.cpp:99
msgid ""
"<b>Drag</b> to create a rectangle. <b>Drag controls</b> to round corners and "
"resize. <b>Click</b> to select."
msgstr ""
+"<b>Dragðu</b> til að bĂșa til ferhyrning. <b>Dragðu haldföng</b> til að rĂșnna "
+"horn og breyta stÊrðum. <b>Smelltu</b> til að velja."
#: ../src/ui/tools-switch.cpp:100
msgid ""
"<b>Drag</b> to create a 3D box. <b>Drag controls</b> to resize in "
"perspective. <b>Click</b> to select (with <b>Ctrl+Alt</b> for single faces)."
msgstr ""
+"<b>Dragðu</b> til að bĂșa til ĂŸrĂ­vĂ­ddarkassa. <b>Dragðu haldföng</b> til að "
+"breyta stÊrðum í fjarvídd. <b>Smelltu</b> til að velja (með <b>Ctrl+Alt</b> "
+"fyrir staka hliðfleti)."
#: ../src/ui/tools-switch.cpp:101
msgid ""
"<b>Drag</b> to create an ellipse. <b>Drag controls</b> to make an arc or "
"segment. <b>Click</b> to select."
msgstr ""
+"<b>Dragðu</b> til að bĂșa til sporbaug. <b>Dragðu haldföng</b> til að gera "
+"boga eða hringhluta. <b>Smelltu</b> til að velja."
#: ../src/ui/tools-switch.cpp:102
msgid ""
"<b>Drag</b> to create a star. <b>Drag controls</b> to edit the star shape. "
"<b>Click</b> to select."
msgstr ""
+"<b>Dragðu</b> til að bĂșa til stjörnu. <b>Dragðu haldföng</b> til að breyta "
+"löguninni. <b>Smelltu</b> til að velja."
#: ../src/ui/tools-switch.cpp:103
msgid ""
"<b>Drag</b> to create a spiral. <b>Drag controls</b> to edit the spiral "
"shape. <b>Click</b> to select."
msgstr ""
+"<b>Dragðu</b> til að bĂșa til spĂ­ral. <b>Dragðu haldföng</b> til að breyta "
+"löguninni. <b>Smelltu</b> til að velja."
#: ../src/ui/tools-switch.cpp:104
msgid ""
"<b>Drag</b> to create a freehand line. <b>Shift</b> appends to selected "
"path, <b>Alt</b> activates sketch mode."
msgstr ""
+"<b>Dragðu</b> til að bĂșa til frĂ­hendislĂ­nu. <b>Shift</b> bĂŠtir við valinn "
+"feril, <b>Alt</b> virkjar skissuham."
#: ../src/ui/tools-switch.cpp:105
msgid ""
@@ -21983,47 +22267,65 @@ msgid ""
"append to selected path. <b>Ctrl+click</b> to create single dots (straight "
"line modes only)."
msgstr ""
+"<b>Smelltu</b> eða <b>smelltu og dragðu</b> til að byrja å ferli; með "
+"<b>Shift</b> til að bĂŠta við valinn feril. <b>Ctrl+click</b> til að bĂșa til "
+"staka punkta (eingöngu í beinlínuham)."
#: ../src/ui/tools-switch.cpp:106
msgid ""
"<b>Drag</b> to draw a calligraphic stroke; with <b>Ctrl</b> to track a guide "
"path. <b>Arrow keys</b> adjust width (left/right) and angle (up/down)."
msgstr ""
+"<b>Dragðu</b> til að draga skrautskriftarstroku; með <b>Ctrl</b> til að "
+"fylgja stuðningsferli. <b>Örvalyklar</b> aðlaga breidd (vinstri/hégri) og "
+"halla (upp/niður)."
-#: ../src/ui/tools-switch.cpp:107 ../src/ui/tools/text-tool.cpp:1593
+#: ../src/ui/tools-switch.cpp:107 ../src/ui/tools/text-tool.cpp:1584
msgid ""
"<b>Click</b> to select or create text, <b>drag</b> to create flowed text; "
"then type."
msgstr ""
+"<b>Smelltu</b> til að velja eða bĂșa til texta, <b>dragðu</b> til að bĂșa til "
+"flÊðitexta; skrifaðu síðan."
#: ../src/ui/tools-switch.cpp:108
msgid ""
"<b>Drag</b> or <b>double click</b> to create a gradient on selected objects, "
"<b>drag handles</b> to adjust gradients."
msgstr ""
+"<b>Dragðu</b> eða <b>tvĂ­smelltu</b> til að bĂșa til litstigul ĂĄ völdum "
+"hlutum, <b>dragðu haldföng</b> til að laga litstigla."
#: ../src/ui/tools-switch.cpp:109
msgid ""
"<b>Drag</b> or <b>double click</b> to create a mesh on selected objects, "
"<b>drag handles</b> to adjust meshes."
msgstr ""
+"<b>Dragðu</b> eða <b>tvĂ­smelltu</b> til að bĂșa til möskva ĂĄ völdum hlutum, "
+"<b>dragðu haldföng</b> til að laga möskva."
#: ../src/ui/tools-switch.cpp:110
msgid ""
"<b>Click</b> or <b>drag around an area</b> to zoom in, <b>Shift+click</b> to "
"zoom out."
msgstr ""
+"<b>Smelltu</b> eða <b>dragðu utan um svÊði</b> til að renna að, <b>Shift"
+"+click</b> til að renna Ășt."
#: ../src/ui/tools-switch.cpp:111
msgid "<b>Drag</b> to measure the dimensions of objects."
-msgstr ""
+msgstr "<b>Dragðu</b> til að mÊla stÊrðir hluta."
-#: ../src/ui/tools-switch.cpp:112 ../src/ui/tools/dropper-tool.cpp:285
+#: ../src/ui/tools-switch.cpp:112 ../src/ui/tools/dropper-tool.cpp:275
msgid ""
"<b>Click</b> to set fill, <b>Shift+click</b> to set stroke; <b>drag</b> to "
"average color in area; with <b>Alt</b> to pick inverse color; <b>Ctrl+C</b> "
"to copy the color under mouse to clipboard"
msgstr ""
+"<b>Smelltu</b> til að setja fyllingu, <b>Shift+smelltu</b> til að setja "
+"ĂștlĂ­nulit; <b>dragðu</b> til að taka meðaltalslit svÊðis; með <b>Alt</b> "
+"tila að plokka andstÊðan lit; <b>Ctrl+C</b> til að afrita litinn undir "
+"bendlinum å klippispjaldið"
#: ../src/ui/tools-switch.cpp:113
msgid "<b>Click and drag</b> between shapes to create a connector."
@@ -22035,6 +22337,9 @@ msgid ""
"fill with the current selection, <b>Ctrl+click</b> to change the clicked "
"object's fill and stroke to the current setting."
msgstr ""
+"<b>Smelltu</b> til að fylla afmarkað svÊði, <b>Shift+smella</b> til að "
+"sameina nĂœju fyllinguna ĂŸvĂ­ sem valið er fyrir, <b>Ctrl+smella</b> til að "
+"breyta fyllingu og ĂștlĂ­nu valda hlutarins ĂĄ nĂșverandi stillingar."
#: ../src/ui/tools-switch.cpp:115
msgid "<b>Drag</b> to erase."
@@ -22042,20 +22347,20 @@ msgstr "<b>Dragðu</b> til að stroka Ășt."
#: ../src/ui/tools-switch.cpp:116
msgid "Choose a subtool from the toolbar"
-msgstr ""
+msgstr "Veldu aukaverkfĂŠri af verkfĂŠrastikunni"
-#: ../src/ui/tools/arc-tool.cpp:252
+#: ../src/ui/tools/arc-tool.cpp:242
msgid ""
"<b>Ctrl</b>: make circle or integer-ratio ellipse, snap arc/segment angle"
msgstr ""
"<b>Ctrl</b>: gera hring eða heiltölu-hlutfalls sporbaug, grípa í boga/horn å "
"bĂșt"
-#: ../src/ui/tools/arc-tool.cpp:253 ../src/ui/tools/rect-tool.cpp:289
+#: ../src/ui/tools/arc-tool.cpp:243 ../src/ui/tools/rect-tool.cpp:279
msgid "<b>Shift</b>: draw around the starting point"
msgstr "<b>Shift</b>: teikna hring Ă­ kringum upphafspunkt"
-#: ../src/ui/tools/arc-tool.cpp:422
+#: ../src/ui/tools/arc-tool.cpp:412
#, c-format
msgid ""
"<b>Ellipse</b>: %s &#215; %s (constrained to ratio %d:%d); with <b>Shift</b> "
@@ -22064,7 +22369,7 @@ msgstr ""
"<b>Sporbaugur</b>: %s &#215; %s (takmarkað að hlutfallinu %d:%d); með "
"<b>Shift</b> til að teikna umhverfis upphafspunkt"
-#: ../src/ui/tools/arc-tool.cpp:424
+#: ../src/ui/tools/arc-tool.cpp:414
#, c-format
msgid ""
"<b>Ellipse</b>: %s &#215; %s; with <b>Ctrl</b> to make square or integer-"
@@ -22074,152 +22379,152 @@ msgstr ""
"heiltölu-hlutfalls sporbaug; með <b>Shift</b> til að teikna umhverfis "
"upphafspunkt"
-#: ../src/ui/tools/arc-tool.cpp:447
+#: ../src/ui/tools/arc-tool.cpp:437
msgid "Create ellipse"
msgstr "ÚtbĂșa sporbaug"
-#: ../src/ui/tools/box3d-tool.cpp:370 ../src/ui/tools/box3d-tool.cpp:377
-#: ../src/ui/tools/box3d-tool.cpp:384 ../src/ui/tools/box3d-tool.cpp:391
-#: ../src/ui/tools/box3d-tool.cpp:398 ../src/ui/tools/box3d-tool.cpp:405
+#: ../src/ui/tools/box3d-tool.cpp:360 ../src/ui/tools/box3d-tool.cpp:367
+#: ../src/ui/tools/box3d-tool.cpp:374 ../src/ui/tools/box3d-tool.cpp:381
+#: ../src/ui/tools/box3d-tool.cpp:388 ../src/ui/tools/box3d-tool.cpp:395
msgid "Change perspective (angle of PLs)"
msgstr "Breyta fjarvĂ­dd (horn hjĂĄlparlĂ­na)"
#. status text
-#: ../src/ui/tools/box3d-tool.cpp:583
+#: ../src/ui/tools/box3d-tool.cpp:573
msgid "<b>3D Box</b>; with <b>Shift</b> to extrude along the Z axis"
msgstr "<b>3D kassi</b>; með <b>Shift</b> til að stÊkka eftir Z ås"
-#: ../src/ui/tools/box3d-tool.cpp:609
+#: ../src/ui/tools/box3d-tool.cpp:599
msgid "Create 3D box"
msgstr "BĂșa til 3D kassa"
-#: ../src/ui/tools/calligraphic-tool.cpp:536
+#: ../src/ui/tools/calligraphic-tool.cpp:526
msgid ""
"<b>Guide path selected</b>; start drawing along the guide with <b>Ctrl</b>"
msgstr ""
-#: ../src/ui/tools/calligraphic-tool.cpp:538
+#: ../src/ui/tools/calligraphic-tool.cpp:528
msgid "<b>Select a guide path</b> to track with <b>Ctrl</b>"
msgstr ""
-#: ../src/ui/tools/calligraphic-tool.cpp:673
+#: ../src/ui/tools/calligraphic-tool.cpp:663
msgid "Tracking: <b>connection to guide path lost!</b>"
msgstr ""
-#: ../src/ui/tools/calligraphic-tool.cpp:673
+#: ../src/ui/tools/calligraphic-tool.cpp:663
msgid "<b>Tracking</b> a guide path"
msgstr ""
-#: ../src/ui/tools/calligraphic-tool.cpp:676
+#: ../src/ui/tools/calligraphic-tool.cpp:666
msgid "<b>Drawing</b> a calligraphic stroke"
-msgstr ""
+msgstr "<b>Teikna</b> skrautskriftardrĂĄtt"
-#: ../src/ui/tools/calligraphic-tool.cpp:977
+#: ../src/ui/tools/calligraphic-tool.cpp:967
msgid "Draw calligraphic stroke"
msgstr "Teikna skrautskriftardrĂŠtti"
-#: ../src/ui/tools/connector-tool.cpp:499
+#: ../src/ui/tools/connector-tool.cpp:489
msgid "Creating new connector"
msgstr "BĂșa til nĂœja tengilĂ­nu"
-#: ../src/ui/tools/connector-tool.cpp:740
+#: ../src/ui/tools/connector-tool.cpp:730
msgid "Connector endpoint drag cancelled."
msgstr "HÊtt við drått endapunkts tengilínu."
-#: ../src/ui/tools/connector-tool.cpp:783
+#: ../src/ui/tools/connector-tool.cpp:773
msgid "Reroute connector"
msgstr "Endurtengja tengi"
-#: ../src/ui/tools/connector-tool.cpp:936
+#: ../src/ui/tools/connector-tool.cpp:926
msgid "Create connector"
msgstr "BĂșa til tengilĂ­nu"
-#: ../src/ui/tools/connector-tool.cpp:953
+#: ../src/ui/tools/connector-tool.cpp:943
msgid "Finishing connector"
msgstr "Enda tengilĂ­nu"
-#: ../src/ui/tools/connector-tool.cpp:1191
+#: ../src/ui/tools/connector-tool.cpp:1181
msgid "<b>Connector endpoint</b>: drag to reroute or connect to new shapes"
msgstr ""
"<b>Tengiendapunktur</b>: dragðu til að endurtengja eða tengja við nĂœ form"
-#: ../src/ui/tools/connector-tool.cpp:1336
+#: ../src/ui/tools/connector-tool.cpp:1326
msgid "Select <b>at least one non-connector object</b>."
msgstr "Veldu <b>að minnsta kosti einn hlut sem er ekki tengilína</b>."
-#: ../src/ui/tools/connector-tool.cpp:1341
+#: ../src/ui/tools/connector-tool.cpp:1331
#: ../src/widgets/connector-toolbar.cpp:314
msgid "Make connectors avoid selected objects"
msgstr "Låta tengilínur forðast valda hluti"
-#: ../src/ui/tools/connector-tool.cpp:1342
+#: ../src/ui/tools/connector-tool.cpp:1332
#: ../src/widgets/connector-toolbar.cpp:324
msgid "Make connectors ignore selected objects"
msgstr "LĂĄta tengilĂ­nur hundsa valda hluti"
#. alpha of color under cursor, to show in the statusbar
#. locale-sensitive printf is OK, since this goes to the UI, not into SVG
-#: ../src/ui/tools/dropper-tool.cpp:281
+#: ../src/ui/tools/dropper-tool.cpp:271
#, c-format
msgid " alpha %.3g"
msgstr " alfa %.3g"
#. where the color is picked, to show in the statusbar
-#: ../src/ui/tools/dropper-tool.cpp:283
+#: ../src/ui/tools/dropper-tool.cpp:273
#, c-format
msgid ", averaged with radius %d"
-msgstr ""
+msgstr ", meðaltal með radíus %d"
-#: ../src/ui/tools/dropper-tool.cpp:283
+#: ../src/ui/tools/dropper-tool.cpp:273
msgid " under cursor"
msgstr " undir bendli"
#. message, to show in the statusbar
-#: ../src/ui/tools/dropper-tool.cpp:285
+#: ../src/ui/tools/dropper-tool.cpp:275
msgid "<b>Release mouse</b> to set color."
-msgstr ""
+msgstr "<b>Sleppa mĂșsarhnapp</b> til að stilla lit."
-#: ../src/ui/tools/dropper-tool.cpp:333
+#: ../src/ui/tools/dropper-tool.cpp:323
msgid "Set picked color"
-msgstr ""
+msgstr "Stilla plokkaðan lit"
-#: ../src/ui/tools/eraser-tool.cpp:437
+#: ../src/ui/tools/eraser-tool.cpp:427
msgid "<b>Drawing</b> an eraser stroke"
msgstr "<b>Teikna</b> ĂștstrokunardrĂĄtt"
-#: ../src/ui/tools/eraser-tool.cpp:770
+#: ../src/ui/tools/eraser-tool.cpp:760
msgid "Draw eraser stroke"
msgstr "Teikna ĂștstrokunardrĂŠtti"
-#: ../src/ui/tools/flood-tool.cpp:192
+#: ../src/ui/tools/flood-tool.cpp:182
msgid "Visible Colors"
msgstr "SĂœnilegir litir"
-#: ../src/ui/tools/flood-tool.cpp:210
+#: ../src/ui/tools/flood-tool.cpp:200
msgctxt "Flood autogap"
msgid "None"
msgstr "Ekkert"
-#: ../src/ui/tools/flood-tool.cpp:211
+#: ../src/ui/tools/flood-tool.cpp:201
msgctxt "Flood autogap"
msgid "Small"
msgstr "Lítið"
-#: ../src/ui/tools/flood-tool.cpp:212
+#: ../src/ui/tools/flood-tool.cpp:202
msgctxt "Flood autogap"
msgid "Medium"
msgstr "Miðlungs"
-#: ../src/ui/tools/flood-tool.cpp:213
+#: ../src/ui/tools/flood-tool.cpp:203
msgctxt "Flood autogap"
msgid "Large"
msgstr "StĂłrt"
-#: ../src/ui/tools/flood-tool.cpp:435
+#: ../src/ui/tools/flood-tool.cpp:425
msgid "<b>Too much inset</b>, the result is empty."
msgstr ""
-#: ../src/ui/tools/flood-tool.cpp:476
+#: ../src/ui/tools/flood-tool.cpp:466
#, c-format
msgid ""
"Area filled, path with <b>%d</b> node created and unioned with selection."
@@ -22228,44 +22533,46 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: ../src/ui/tools/flood-tool.cpp:482
+#: ../src/ui/tools/flood-tool.cpp:472
#, c-format
msgid "Area filled, path with <b>%d</b> node created."
msgid_plural "Area filled, path with <b>%d</b> nodes created."
msgstr[0] ""
msgstr[1] ""
-#: ../src/ui/tools/flood-tool.cpp:750 ../src/ui/tools/flood-tool.cpp:1060
+#: ../src/ui/tools/flood-tool.cpp:740 ../src/ui/tools/flood-tool.cpp:1050
msgid "<b>Area is not bounded</b>, cannot fill."
-msgstr ""
+msgstr "<b>SvÊði er ekki afmarkað</b>, get ekki fyllt."
-#: ../src/ui/tools/flood-tool.cpp:1065
+#: ../src/ui/tools/flood-tool.cpp:1055
msgid ""
"<b>Only the visible part of the bounded area was filled.</b> If you want to "
"fill all of the area, undo, zoom out, and fill again."
msgstr ""
-#: ../src/ui/tools/flood-tool.cpp:1083 ../src/ui/tools/flood-tool.cpp:1234
+#: ../src/ui/tools/flood-tool.cpp:1073 ../src/ui/tools/flood-tool.cpp:1224
msgid "Fill bounded area"
msgstr "Fylla afmarkað svÊði"
-#: ../src/ui/tools/flood-tool.cpp:1099
+#: ../src/ui/tools/flood-tool.cpp:1089
msgid "Set style on object"
-msgstr ""
+msgstr "Setja stĂ­l ĂĄ hlut"
-#: ../src/ui/tools/flood-tool.cpp:1159
+#: ../src/ui/tools/flood-tool.cpp:1149
msgid "<b>Draw over</b> areas to add to fill, hold <b>Alt</b> for touch fill"
msgstr ""
+"<b>Draga yfir</b> svÊði til að bÊta við fyllingu, halda niðri <b>Alt</b> "
+"fyrir snertifyllingu"
#. We hit green anchor, closing Green-Blue-Red
#: ../src/ui/tools/freehand-base.cpp:557
msgid "Path is closed."
-msgstr ""
+msgstr "Ferill er lokaður."
#. We hit bot start and end of single curve, closing paths
#: ../src/ui/tools/freehand-base.cpp:572
msgid "Closing path."
-msgstr ""
+msgstr "Loka ferli."
#: ../src/ui/tools/freehand-base.cpp:709
msgid "Draw path"
@@ -22273,38 +22580,38 @@ msgstr "Teikna feril"
#: ../src/ui/tools/freehand-base.cpp:862
msgid "Creating single dot"
-msgstr ""
+msgstr "BĂœ til einn punkt"
#: ../src/ui/tools/freehand-base.cpp:863
msgid "Create single dot"
-msgstr ""
+msgstr "BĂșa til stakan punkt"
#. TRANSLATORS: %s will be substituted with the point name (see previous messages); This is part of a compound message
-#: ../src/ui/tools/gradient-tool.cpp:131 ../src/ui/tools/mesh-tool.cpp:130
+#: ../src/ui/tools/gradient-tool.cpp:121 ../src/ui/tools/mesh-tool.cpp:120
#, c-format
msgid "%s selected"
msgstr "%s valið"
#. TRANSLATORS: Mind the space in front. This is part of a compound message
-#: ../src/ui/tools/gradient-tool.cpp:133 ../src/ui/tools/gradient-tool.cpp:142
+#: ../src/ui/tools/gradient-tool.cpp:123 ../src/ui/tools/gradient-tool.cpp:132
#, c-format
msgid " out of %d gradient handle"
msgid_plural " out of %d gradient handles"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] " af %d litstigulshaldfangi"
+msgstr[1] " af %d litstigulshaldföngum"
#. TRANSLATORS: Mind the space in front. (Refers to gradient handles selected). This is part of a compound message
-#: ../src/ui/tools/gradient-tool.cpp:134 ../src/ui/tools/gradient-tool.cpp:143
-#: ../src/ui/tools/gradient-tool.cpp:150 ../src/ui/tools/mesh-tool.cpp:133
-#: ../src/ui/tools/mesh-tool.cpp:144 ../src/ui/tools/mesh-tool.cpp:152
+#: ../src/ui/tools/gradient-tool.cpp:124 ../src/ui/tools/gradient-tool.cpp:133
+#: ../src/ui/tools/gradient-tool.cpp:140 ../src/ui/tools/mesh-tool.cpp:123
+#: ../src/ui/tools/mesh-tool.cpp:134 ../src/ui/tools/mesh-tool.cpp:142
#, c-format
msgid " on %d selected object"
msgid_plural " on %d selected objects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] " ĂĄ %d valinn hlut"
+msgstr[1] " ĂĄ %d valda hluti"
#. TRANSLATORS: This is a part of a compound message (out of two more indicating: grandint handle count & object count)
-#: ../src/ui/tools/gradient-tool.cpp:140 ../src/ui/tools/mesh-tool.cpp:140
+#: ../src/ui/tools/gradient-tool.cpp:130 ../src/ui/tools/mesh-tool.cpp:130
#, c-format
msgid ""
"One handle merging %d stop (drag with <b>Shift</b> to separate) selected"
@@ -22314,312 +22621,328 @@ msgstr[0] ""
msgstr[1] ""
#. TRANSLATORS: The plural refers to number of selected gradient handles. This is part of a compound message (part two indicates selected object count)
-#: ../src/ui/tools/gradient-tool.cpp:148
+#: ../src/ui/tools/gradient-tool.cpp:138
#, c-format
msgid "<b>%d</b> gradient handle selected out of %d"
msgid_plural "<b>%d</b> gradient handles selected out of %d"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "<b>%d</b> litstigulshaldfang valið af %d"
+msgstr[1] "<b>%d</b> litstigulshaldföng valin af %d"
#. TRANSLATORS: The plural refers to number of selected objects
-#: ../src/ui/tools/gradient-tool.cpp:155
+#: ../src/ui/tools/gradient-tool.cpp:145
#, c-format
msgid "<b>No</b> gradient handles selected out of %d on %d selected object"
msgid_plural ""
"<b>No</b> gradient handles selected out of %d on %d selected objects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "<b>Engin</b> litstigulshaldföng valin af %d å %d völdum hlut"
+msgstr[1] "<b>Engin</b> litstigulshaldföng valin af %d å %d völdum hlutum"
-#: ../src/ui/tools/gradient-tool.cpp:443
+#: ../src/ui/tools/gradient-tool.cpp:433
msgid "Simplify gradient"
msgstr "Einfalda litstigul"
-#: ../src/ui/tools/gradient-tool.cpp:519
+#: ../src/ui/tools/gradient-tool.cpp:509
msgid "Create default gradient"
msgstr "BĂșa til sjĂĄlfgefinn litstigul"
-#: ../src/ui/tools/gradient-tool.cpp:578 ../src/ui/tools/mesh-tool.cpp:570
+#: ../src/ui/tools/gradient-tool.cpp:568 ../src/ui/tools/mesh-tool.cpp:560
msgid "<b>Draw around</b> handles to select them"
-msgstr ""
+msgstr "<b>Dragðu Ă­ hringum</b> haldföng til að velja ĂŸau"
-#: ../src/ui/tools/gradient-tool.cpp:701
+#: ../src/ui/tools/gradient-tool.cpp:691
msgid "<b>Ctrl</b>: snap gradient angle"
-msgstr ""
+msgstr "<b>Ctrl</b>: ĂŸrepa horn litstiguls"
-#: ../src/ui/tools/gradient-tool.cpp:702
+#: ../src/ui/tools/gradient-tool.cpp:692
msgid "<b>Shift</b>: draw gradient around the starting point"
-msgstr ""
+msgstr "<b>Shift</b>: teikna litstigul Ă­ kringum upphafspunkt"
-#: ../src/ui/tools/gradient-tool.cpp:956 ../src/ui/tools/mesh-tool.cpp:993
+#: ../src/ui/tools/gradient-tool.cpp:946 ../src/ui/tools/mesh-tool.cpp:983
#, c-format
msgid "<b>Gradient</b> for %d object; with <b>Ctrl</b> to snap angle"
msgid_plural "<b>Gradient</b> for %d objects; with <b>Ctrl</b> to snap angle"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "<b>Litstigull</b> ĂĄ %d hlut; með <b>Ctrl</b> til að ĂŸrepa horn"
+msgstr[1] "<b>Litstigull</b> ĂĄ %d hluti; með <b>Ctrl</b> til að ĂŸrepa horn"
-#: ../src/ui/tools/gradient-tool.cpp:960 ../src/ui/tools/mesh-tool.cpp:997
+#: ../src/ui/tools/gradient-tool.cpp:950 ../src/ui/tools/mesh-tool.cpp:987
msgid "Select <b>objects</b> on which to create gradient."
-msgstr ""
+msgstr "Veldu <b>hluti</b> ĂŸar sem ĂĄ að gera litstigul."
-#: ../src/ui/tools/lpe-tool.cpp:206
+#: ../src/ui/tools/lpe-tool.cpp:195
msgid "Choose a construction tool from the toolbar."
-msgstr ""
+msgstr "Veldu uppbyggingarverkfĂŠri af verkfĂŠrastikunni."
#. TRANSLATORS: Mind the space in front. This is part of a compound message
-#: ../src/ui/tools/mesh-tool.cpp:132 ../src/ui/tools/mesh-tool.cpp:143
+#: ../src/ui/tools/mesh-tool.cpp:122 ../src/ui/tools/mesh-tool.cpp:133
#, c-format
msgid " out of %d mesh handle"
msgid_plural " out of %d mesh handles"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] " af %d möskvahaldfangi"
+msgstr[1] " af %d möskvahaldföngum"
-#: ../src/ui/tools/mesh-tool.cpp:150
+#: ../src/ui/tools/mesh-tool.cpp:140
#, c-format
msgid "<b>%d</b> mesh handle selected out of %d"
msgid_plural "<b>%d</b> mesh handles selected out of %d"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "<b>%d</b> möskvahaldfang valið af %d"
+msgstr[1] "<b>%d</b> möskvahaldföng valin af %d"
#. TRANSLATORS: The plural refers to number of selected objects
-#: ../src/ui/tools/mesh-tool.cpp:157
+#: ../src/ui/tools/mesh-tool.cpp:147
#, c-format
msgid "<b>No</b> mesh handles selected out of %d on %d selected object"
msgid_plural "<b>No</b> mesh handles selected out of %d on %d selected objects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "<b>Engin</b> möskvahaldföng valin af %d å %d völdum hlut"
+msgstr[1] "<b>Engin</b> möskvahaldföng valin af %d å %d völdum hlutum"
-#: ../src/ui/tools/mesh-tool.cpp:321
+#: ../src/ui/tools/mesh-tool.cpp:311
msgid "Split mesh row/column"
-msgstr ""
+msgstr "KljĂșfa röð/dĂĄlk möskva"
-#: ../src/ui/tools/mesh-tool.cpp:407
+#: ../src/ui/tools/mesh-tool.cpp:397
msgid "Toggled mesh path type."
-msgstr ""
+msgstr "Víxlaði tegund möskvaferils."
-#: ../src/ui/tools/mesh-tool.cpp:411
+#: ../src/ui/tools/mesh-tool.cpp:401
msgid "Approximated arc for mesh side."
-msgstr ""
+msgstr "Nålgaður bogi fyrir hlið möskva."
-#: ../src/ui/tools/mesh-tool.cpp:415
+#: ../src/ui/tools/mesh-tool.cpp:405
msgid "Toggled mesh tensors."
-msgstr ""
+msgstr "Víxlaði möskvastrekkjurum."
-#: ../src/ui/tools/mesh-tool.cpp:419
+#: ../src/ui/tools/mesh-tool.cpp:409
msgid "Smoothed mesh corner color."
-msgstr ""
+msgstr "Litur horns ĂĄ mĂœktum möskva."
-#: ../src/ui/tools/mesh-tool.cpp:423
+#: ../src/ui/tools/mesh-tool.cpp:413
msgid "Picked mesh corner color."
-msgstr ""
+msgstr "Plokkaði lit Ășr möskvahorni."
-#: ../src/ui/tools/mesh-tool.cpp:498
+#: ../src/ui/tools/mesh-tool.cpp:488
msgid "Create default mesh"
-msgstr ""
+msgstr "BĂșa til sjĂĄlfgefna möskva"
-#: ../src/ui/tools/mesh-tool.cpp:718
+#: ../src/ui/tools/mesh-tool.cpp:708
msgid "FIXME<b>Ctrl</b>: snap mesh angle"
-msgstr ""
+msgstr "LAGA<b>Ctrl</b>: ĂŸrepa horn möskva"
-#: ../src/ui/tools/mesh-tool.cpp:719
+#: ../src/ui/tools/mesh-tool.cpp:709
msgid "FIXME<b>Shift</b>: draw mesh around the starting point"
-msgstr ""
+msgstr "LAGA<b>Shift</b>: draga möskva í kringum upphafspunkt"
-#: ../src/ui/tools/node-tool.cpp:612
+#: ../src/ui/tools/node-tool.cpp:602
msgctxt "Node tool tip"
msgid ""
"<b>Shift</b>: drag to add nodes to the selection, click to toggle object "
"selection"
msgstr ""
+"<b>Shift</b>: draga til að bĂŠta hnĂștum við valið, smella til að vĂ­xla vali"
-#: ../src/ui/tools/node-tool.cpp:616
+#: ../src/ui/tools/node-tool.cpp:606
msgctxt "Node tool tip"
msgid "<b>Shift</b>: drag to add nodes to the selection"
-msgstr ""
+msgstr "<b>Shift</b>: draga til að bĂŠta hnĂștum við valið"
-#: ../src/ui/tools/node-tool.cpp:628
+#: ../src/ui/tools/node-tool.cpp:618
#, c-format
msgid "<b>%u of %u</b> node selected."
msgid_plural "<b>%u of %u</b> nodes selected."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "<b>%u af %u</b> hnĂșt valinn."
+msgstr[1] "<b>%u af %u</b> hnĂștum valið."
-#: ../src/ui/tools/node-tool.cpp:634
+#: ../src/ui/tools/node-tool.cpp:624
#, c-format
msgctxt "Node tool tip"
msgid "%s Drag to select nodes, click to edit only this object (more: Shift)"
msgstr ""
+"%s Dragðu til að velja hnĂșta, smelltu til að breyta einungis ĂŸessum hlut "
+"(meira: Shift)"
-#: ../src/ui/tools/node-tool.cpp:640
+#: ../src/ui/tools/node-tool.cpp:630
#, c-format
msgctxt "Node tool tip"
msgid "%s Drag to select nodes, click clear the selection"
-msgstr ""
+msgstr "%s Dragðu til að velja hnĂșta, smelltu til að hreinsa val"
-#: ../src/ui/tools/node-tool.cpp:649
+#: ../src/ui/tools/node-tool.cpp:639
msgctxt "Node tool tip"
msgid "Drag to select nodes, click to edit only this object"
-msgstr ""
+msgstr "Dragðu til að velja hnĂșta, smelltu til að breyta einungis ĂŸessum hlut"
-#: ../src/ui/tools/node-tool.cpp:652
+#: ../src/ui/tools/node-tool.cpp:642
msgctxt "Node tool tip"
msgid "Drag to select nodes, click to clear the selection"
-msgstr ""
+msgstr "Dragðu til að velja hnĂșta, smelltu til að hreinsa val"
-#: ../src/ui/tools/node-tool.cpp:657
+#: ../src/ui/tools/node-tool.cpp:647
msgctxt "Node tool tip"
msgid "Drag to select objects to edit, click to edit this object (more: Shift)"
msgstr ""
+"Dragðu til að velja hluti sem ĂĄ að breyta, smelltu til að breyta ĂŸessum hlut "
+"(meira: Shift)"
-#: ../src/ui/tools/node-tool.cpp:660
+#: ../src/ui/tools/node-tool.cpp:650
msgctxt "Node tool tip"
msgid "Drag to select objects to edit"
-msgstr ""
+msgstr "Dragðu til að velja hluti sem å að breyta"
-#: ../src/ui/tools/pen-tool.cpp:233 ../src/ui/tools/pencil-tool.cpp:466
+#: ../src/ui/tools/pen-tool.cpp:224 ../src/ui/tools/pencil-tool.cpp:457
msgid "Drawing cancelled"
-msgstr ""
+msgstr "HÊtt við teikningu"
-#: ../src/ui/tools/pen-tool.cpp:469 ../src/ui/tools/pencil-tool.cpp:204
+#: ../src/ui/tools/pen-tool.cpp:460 ../src/ui/tools/pencil-tool.cpp:195
msgid "Continuing selected path"
-msgstr ""
+msgstr "Held åfram með valinn feril"
-#: ../src/ui/tools/pen-tool.cpp:479 ../src/ui/tools/pencil-tool.cpp:212
+#: ../src/ui/tools/pen-tool.cpp:470 ../src/ui/tools/pencil-tool.cpp:203
msgid "Creating new path"
-msgstr ""
+msgstr "BĂœ til nĂœjan feril"
-#: ../src/ui/tools/pen-tool.cpp:481 ../src/ui/tools/pencil-tool.cpp:215
+#: ../src/ui/tools/pen-tool.cpp:472 ../src/ui/tools/pencil-tool.cpp:206
msgid "Appending to selected path"
-msgstr ""
+msgstr "BÊti við valinn feril"
-#: ../src/ui/tools/pen-tool.cpp:646
+#: ../src/ui/tools/pen-tool.cpp:637
msgid "<b>Click</b> or <b>click and drag</b> to close and finish the path."
msgstr ""
+"<b>Smella</b> eða <b>smella og draga</b> til að ljĂșka og loka ferlinum."
-#: ../src/ui/tools/pen-tool.cpp:648
+#: ../src/ui/tools/pen-tool.cpp:639
msgid ""
"<b>Click</b> or <b>click and drag</b> to close and finish the path. Shift"
"+Click make a cusp node"
msgstr ""
-#: ../src/ui/tools/pen-tool.cpp:660
+#: ../src/ui/tools/pen-tool.cpp:651
msgid ""
"<b>Click</b> or <b>click and drag</b> to continue the path from this point."
msgstr ""
+"<b>Smella</b> eða <b>smella og draga</b> til að halda åfram með ferilinn frå "
+"ĂŸessum punkti."
-#: ../src/ui/tools/pen-tool.cpp:662
+#: ../src/ui/tools/pen-tool.cpp:653
msgid ""
"<b>Click</b> or <b>click and drag</b> to continue the path from this point. "
"Shift+Click make a cusp node"
msgstr ""
-#: ../src/ui/tools/pen-tool.cpp:2036
+#: ../src/ui/tools/pen-tool.cpp:2027
#, c-format
msgid ""
"<b>Curve segment</b>: angle %3.2f&#176;, distance %s; with <b>Ctrl</b> to "
"snap angle, <b>Enter</b> to finish the path"
msgstr ""
-#: ../src/ui/tools/pen-tool.cpp:2037
+#: ../src/ui/tools/pen-tool.cpp:2028
#, c-format
msgid ""
"<b>Line segment</b>: angle %3.2f&#176;, distance %s; with <b>Ctrl</b> to "
"snap angle, <b>Enter</b> to finish the path"
msgstr ""
-#: ../src/ui/tools/pen-tool.cpp:2040
+#: ../src/ui/tools/pen-tool.cpp:2031
#, c-format
msgid ""
"<b>Curve segment</b>: angle %3.2f&#176;, distance %s; with <b>Shift+Click</"
"b> make a cusp node, <b>Enter</b> to finish the path"
msgstr ""
-#: ../src/ui/tools/pen-tool.cpp:2041
+#: ../src/ui/tools/pen-tool.cpp:2032
#, c-format
msgid ""
"<b>Line segment</b>: angle %3.2f&#176;, distance %s; with <b>Shift+Click</b> "
"make a cusp node, <b>Enter</b> to finish the path"
msgstr ""
-#: ../src/ui/tools/pen-tool.cpp:2058
+#: ../src/ui/tools/pen-tool.cpp:2049
#, c-format
msgid ""
"<b>Curve handle</b>: angle %3.2f&#176;, length %s; with <b>Ctrl</b> to snap "
"angle"
msgstr ""
+"<b>Haldfang boglínu</b>: horn %3.2f&#176;, lengd %s; með <b>Ctrl</b> til að "
+"ĂŸrepa horn"
-#: ../src/ui/tools/pen-tool.cpp:2082
+#: ../src/ui/tools/pen-tool.cpp:2073
#, c-format
msgid ""
"<b>Curve handle, symmetric</b>: angle %3.2f&#176;, length %s; with <b>Ctrl</"
"b> to snap angle, with <b>Shift</b> to move this handle only"
msgstr ""
+"<b>Haldfang boglínu, samhverft</b>: horn %3.2f&#176;, lengd %s; með <b>Ctrl</"
+"b> til að ĂŸrepa horn, með <b>Shift</b> til að fĂŠra einungis ĂŸetta haldfang"
-#: ../src/ui/tools/pen-tool.cpp:2083
+#: ../src/ui/tools/pen-tool.cpp:2074
#, c-format
msgid ""
"<b>Curve handle</b>: angle %3.2f&#176;, length %s; with <b>Ctrl</b> to snap "
"angle, with <b>Shift</b> to move this handle only"
msgstr ""
+"<b>Haldfang boglínu</b>: horn %3.2f&#176;, lengd %s; með <b>Ctrl</b> til að "
+"ĂŸrepa horn, með <b>Shift</b> til að fĂŠra einungis ĂŸetta haldfang"
-#: ../src/ui/tools/pen-tool.cpp:2217
+#: ../src/ui/tools/pen-tool.cpp:2208
msgid "Drawing finished"
-msgstr ""
+msgstr "Teikningu lokið"
-#: ../src/ui/tools/pencil-tool.cpp:316
+#: ../src/ui/tools/pencil-tool.cpp:307
msgid "<b>Release</b> here to close and finish the path."
-msgstr ""
+msgstr "<b>Slepptu</b> hĂ©r til að ljĂșka og loka ferlinum."
-#: ../src/ui/tools/pencil-tool.cpp:322
+#: ../src/ui/tools/pencil-tool.cpp:313
msgid "Drawing a freehand path"
-msgstr ""
+msgstr "Teikna frĂ­hendisferil"
-#: ../src/ui/tools/pencil-tool.cpp:327
+#: ../src/ui/tools/pencil-tool.cpp:318
msgid "<b>Drag</b> to continue the path from this point."
-msgstr ""
+msgstr "<b>Draga</b> til að halda ĂĄfram með ferilinn frĂĄ ĂŸessum punkti."
#. Write curves to object
-#: ../src/ui/tools/pencil-tool.cpp:412
+#: ../src/ui/tools/pencil-tool.cpp:403
msgid "Finishing freehand"
-msgstr ""
+msgstr "LjĂșka frĂ­hendisferli"
-#: ../src/ui/tools/pencil-tool.cpp:515
+#: ../src/ui/tools/pencil-tool.cpp:506
msgid ""
"<b>Sketch mode</b>: holding <b>Alt</b> interpolates between sketched paths. "
"Release <b>Alt</b> to finalize."
msgstr ""
+"<b>Skissuhamur</b>: með ĂŸvĂ­ að halda <b>Alt</b> er skotist ĂĄ milli skissaðra "
+"ferla. Sleppa <b>Alt</b> til að ljĂșka."
-#: ../src/ui/tools/pencil-tool.cpp:542
+#: ../src/ui/tools/pencil-tool.cpp:533
msgid "Finishing freehand sketch"
-msgstr ""
+msgstr "KlĂĄra frĂ­hendisskissu"
-#: ../src/ui/tools/rect-tool.cpp:288
+#: ../src/ui/tools/rect-tool.cpp:278
msgid ""
"<b>Ctrl</b>: make square or integer-ratio rect, lock a rounded corner "
"circular"
msgstr ""
-#: ../src/ui/tools/rect-tool.cpp:449
+#: ../src/ui/tools/rect-tool.cpp:439
#, c-format
msgid ""
"<b>Rectangle</b>: %s &#215; %s (constrained to ratio %d:%d); with <b>Shift</"
"b> to draw around the starting point"
msgstr ""
-#: ../src/ui/tools/rect-tool.cpp:452
+#: ../src/ui/tools/rect-tool.cpp:442
#, c-format
msgid ""
"<b>Rectangle</b>: %s &#215; %s (constrained to golden ratio 1.618 : 1); with "
"<b>Shift</b> to draw around the starting point"
msgstr ""
-#: ../src/ui/tools/rect-tool.cpp:454
+#: ../src/ui/tools/rect-tool.cpp:444
#, c-format
msgid ""
"<b>Rectangle</b>: %s &#215; %s (constrained to golden ratio 1 : 1.618); with "
"<b>Shift</b> to draw around the starting point"
msgstr ""
-#: ../src/ui/tools/rect-tool.cpp:458
+#: ../src/ui/tools/rect-tool.cpp:448
#, c-format
msgid ""
"<b>Rectangle</b>: %s &#215; %s; with <b>Ctrl</b> to make square or integer-"
@@ -22629,269 +22952,275 @@ msgstr ""
"heiltölu-hlutfalls rétthyrning; með <b>Shift</b> til að teikna umhverfis "
"upphafspunkt"
-#: ../src/ui/tools/rect-tool.cpp:481
+#: ../src/ui/tools/rect-tool.cpp:471
msgid "Create rectangle"
msgstr "BĂșa til rĂ©tthyrning"
-#: ../src/ui/tools/select-tool.cpp:169
+#: ../src/ui/tools/select-tool.cpp:160
msgid "Click selection to toggle scale/rotation handles"
msgstr "Smelltu ĂĄ valið til að vĂ­xla ĂĄ milli kvörðunar-/snĂșnings-haldfanga"
-#: ../src/ui/tools/select-tool.cpp:170
+#: ../src/ui/tools/select-tool.cpp:161
msgid ""
"No objects selected. Click, Shift+click, Alt+scroll mouse on top of objects, "
"or drag around objects to select."
msgstr ""
-"Engir hlutir valdir. Smella, Shift+smella, Alt+snĂșa mĂșsarhjĂłli efst ĂĄ hlutum, "
-"eða draga í kringum hluti til að velja."
+"Engir hlutir valdir. Smella, Shift+smella, Alt+snĂșa mĂșsarhjĂłli efst ĂĄ "
+"hlutum, eða draga í kringum hluti til að velja."
-#: ../src/ui/tools/select-tool.cpp:223
+#: ../src/ui/tools/select-tool.cpp:214
msgid "Move canceled."
msgstr "HÊtt við fÊrslu."
-#: ../src/ui/tools/select-tool.cpp:231
+#: ../src/ui/tools/select-tool.cpp:222
msgid "Selection canceled."
-msgstr ""
+msgstr "HÊtt við val."
-#: ../src/ui/tools/select-tool.cpp:653
+#: ../src/ui/tools/select-tool.cpp:644
msgid ""
"<b>Draw over</b> objects to select them; release <b>Alt</b> to switch to "
"rubberband selection"
msgstr ""
-#: ../src/ui/tools/select-tool.cpp:655
+#: ../src/ui/tools/select-tool.cpp:646
msgid ""
"<b>Drag around</b> objects to select them; press <b>Alt</b> to switch to "
"touch selection"
msgstr ""
-#: ../src/ui/tools/select-tool.cpp:950
+#: ../src/ui/tools/select-tool.cpp:941
msgid "<b>Ctrl</b>: click to select in groups; drag to move hor/vert"
msgstr ""
-#: ../src/ui/tools/select-tool.cpp:951
+#: ../src/ui/tools/select-tool.cpp:942
msgid "<b>Shift</b>: click to toggle select; drag for rubberband selection"
msgstr ""
-#: ../src/ui/tools/select-tool.cpp:952
+#: ../src/ui/tools/select-tool.cpp:943
msgid ""
"<b>Alt</b>: click to select under; scroll mouse-wheel to cycle-select; drag "
"to move selected or select by touch"
msgstr ""
-#: ../src/ui/tools/select-tool.cpp:1160
+#: ../src/ui/tools/select-tool.cpp:1151
msgid "Selected object is not a group. Cannot enter."
msgstr ""
-#: ../src/ui/tools/spiral-tool.cpp:259
+#: ../src/ui/tools/spiral-tool.cpp:249
msgid "<b>Ctrl</b>: snap angle"
-msgstr ""
+msgstr "<b>Ctrl</b>: ĂŸrepa horn"
-#: ../src/ui/tools/spiral-tool.cpp:261
+#: ../src/ui/tools/spiral-tool.cpp:251
msgid "<b>Alt</b>: lock spiral radius"
-msgstr ""
+msgstr "<b>Alt</b>: lĂŠsa radĂ­us spĂ­rals"
-#: ../src/ui/tools/spiral-tool.cpp:400
+#: ../src/ui/tools/spiral-tool.cpp:390
#, c-format
msgid ""
"<b>Spiral</b>: radius %s, angle %5g&#176;; with <b>Ctrl</b> to snap angle"
msgstr ""
+"<b>SpĂ­rall</b>: radĂ­us %s, horn %5g&#176;; með <b>Ctrl</b> til að ĂŸrepa horn"
-#: ../src/ui/tools/spiral-tool.cpp:421
+#: ../src/ui/tools/spiral-tool.cpp:411
msgid "Create spiral"
msgstr "BĂșa til spĂ­ral"
-#: ../src/ui/tools/spray-tool.cpp:192 ../src/ui/tools/tweak-tool.cpp:167
+#: ../src/ui/tools/spray-tool.cpp:182 ../src/ui/tools/tweak-tool.cpp:157
#, c-format
msgid "<b>%i</b> object selected"
msgid_plural "<b>%i</b> objects selected"
msgstr[0] "<b>%i</b> hlutur valinn"
msgstr[1] "<b>%i</b> hlutir valdir"
-#: ../src/ui/tools/spray-tool.cpp:194 ../src/ui/tools/tweak-tool.cpp:169
+#: ../src/ui/tools/spray-tool.cpp:184 ../src/ui/tools/tweak-tool.cpp:159
msgid "<b>Nothing</b> selected"
msgstr "<b>Ekkert</b> valið"
-#: ../src/ui/tools/spray-tool.cpp:199
+#: ../src/ui/tools/spray-tool.cpp:189
#, c-format
msgid ""
"%s. Drag, click or click and scroll to spray <b>copies</b> of the initial "
"selection."
msgstr ""
-#: ../src/ui/tools/spray-tool.cpp:202
+#: ../src/ui/tools/spray-tool.cpp:192
#, c-format
msgid ""
"%s. Drag, click or click and scroll to spray <b>clones</b> of the initial "
"selection."
msgstr ""
-#: ../src/ui/tools/spray-tool.cpp:205
+#: ../src/ui/tools/spray-tool.cpp:195
#, c-format
msgid ""
"%s. Drag, click or click and scroll to spray in a <b>single path</b> of the "
"initial selection."
msgstr ""
-#: ../src/ui/tools/spray-tool.cpp:664
+#: ../src/ui/tools/spray-tool.cpp:654
msgid "<b>Nothing selected!</b> Select objects to spray."
-msgstr "<Ekkert valið."
+msgstr "<b>Ekkert valið!</b> Veldu hluti til að sprauta."
-#: ../src/ui/tools/spray-tool.cpp:739 ../src/widgets/spray-toolbar.cpp:166
+#: ../src/ui/tools/spray-tool.cpp:729 ../src/widgets/spray-toolbar.cpp:166
msgid "Spray with copies"
msgstr "Sprauta með afritum"
-#: ../src/ui/tools/spray-tool.cpp:743 ../src/widgets/spray-toolbar.cpp:173
+#: ../src/ui/tools/spray-tool.cpp:733 ../src/widgets/spray-toolbar.cpp:173
msgid "Spray with clones"
msgstr "Sprauta með klónum"
-#: ../src/ui/tools/spray-tool.cpp:747
+#: ../src/ui/tools/spray-tool.cpp:737
msgid "Spray in single path"
msgstr "Sprauta ĂĄ einum ferli"
-#: ../src/ui/tools/star-tool.cpp:271
+#: ../src/ui/tools/star-tool.cpp:261
msgid "<b>Ctrl</b>: snap angle; keep rays radial"
msgstr ""
-#: ../src/ui/tools/star-tool.cpp:417
+#: ../src/ui/tools/star-tool.cpp:407
#, c-format
msgid ""
"<b>Polygon</b>: radius %s, angle %5g&#176;; with <b>Ctrl</b> to snap angle"
msgstr ""
-"<b>Marghyrningur</b>: radĂ­us %s, horn %5g&#176;; með <b>Ctrl</b> til að ĂŸrepa "
-"horn"
+"<b>Marghyrningur</b>: radíus %s, horn %5g&#176;; með <b>Ctrl</b> til að "
+"ĂŸrepa horn"
-#: ../src/ui/tools/star-tool.cpp:418
+#: ../src/ui/tools/star-tool.cpp:408
#, c-format
msgid "<b>Star</b>: radius %s, angle %5g&#176;; with <b>Ctrl</b> to snap angle"
msgstr ""
+"<b>Stjarna</b>: radĂ­us %s, horn %5g&#176;; með <b>Ctrl</b> til að ĂŸrepa horn"
-#: ../src/ui/tools/star-tool.cpp:446
+#: ../src/ui/tools/star-tool.cpp:436
msgid "Create star"
msgstr "BĂșa til stjörnu"
-#: ../src/ui/tools/text-tool.cpp:379
+#: ../src/ui/tools/text-tool.cpp:370
msgid "<b>Click</b> to edit the text, <b>drag</b> to select part of the text."
msgstr ""
+"<b>Smelltu</b> til að breyta textanum, <b>dragðu</b> til að velja hluta "
+"textans."
-#: ../src/ui/tools/text-tool.cpp:381
+#: ../src/ui/tools/text-tool.cpp:372
msgid ""
"<b>Click</b> to edit the flowed text, <b>drag</b> to select part of the text."
msgstr ""
+"<b>Smelltu</b> til að breyta flÊðitextanum, <b>dragðu</b> til að velja hluta "
+"textans."
-#: ../src/ui/tools/text-tool.cpp:435
+#: ../src/ui/tools/text-tool.cpp:426
msgid "Create text"
msgstr "BĂșa til texta"
-#: ../src/ui/tools/text-tool.cpp:460
+#: ../src/ui/tools/text-tool.cpp:451
msgid "Non-printable character"
msgstr "Óprentanlegt tákn"
-#: ../src/ui/tools/text-tool.cpp:475
+#: ../src/ui/tools/text-tool.cpp:466
msgid "Insert Unicode character"
msgstr "Setja inn Unicode-tĂĄkn"
-#: ../src/ui/tools/text-tool.cpp:510
+#: ../src/ui/tools/text-tool.cpp:501
#, c-format
msgid "Unicode (<b>Enter</b> to finish): %s: %s"
-msgstr ""
+msgstr "Unicode (<b>Enter</b> til að ljĂșka): %s: %s"
-#: ../src/ui/tools/text-tool.cpp:512 ../src/ui/tools/text-tool.cpp:817
+#: ../src/ui/tools/text-tool.cpp:503 ../src/ui/tools/text-tool.cpp:808
msgid "Unicode (<b>Enter</b> to finish): "
-msgstr ""
+msgstr "Unicode (<b>Enter</b> til að ljĂșka): "
-#: ../src/ui/tools/text-tool.cpp:595
+#: ../src/ui/tools/text-tool.cpp:586
#, c-format
msgid "<b>Flowed text frame</b>: %s &#215; %s"
-msgstr ""
+msgstr "<b>Rammi með flÊðitexta</b>: %s &#215; %s"
-#: ../src/ui/tools/text-tool.cpp:653
+#: ../src/ui/tools/text-tool.cpp:644
msgid "Type text; <b>Enter</b> to start new line."
-msgstr ""
+msgstr "Skrifaðu texta; <b>Enter</b> til að byrja nĂœja lĂ­nu."
-#: ../src/ui/tools/text-tool.cpp:664
+#: ../src/ui/tools/text-tool.cpp:655
msgid "Flowed text is created."
-msgstr ""
+msgstr "Bjó til flÊðitexta."
-#: ../src/ui/tools/text-tool.cpp:665
+#: ../src/ui/tools/text-tool.cpp:656
msgid "Create flowed text"
msgstr "BĂșa til flÊðitexta"
-#: ../src/ui/tools/text-tool.cpp:667
+#: ../src/ui/tools/text-tool.cpp:658
msgid ""
"The frame is <b>too small</b> for the current font size. Flowed text not "
"created."
msgstr ""
-#: ../src/ui/tools/text-tool.cpp:803
+#: ../src/ui/tools/text-tool.cpp:794
msgid "No-break space"
msgstr "ÓrjĂșfanlegt bil"
-#: ../src/ui/tools/text-tool.cpp:804
+#: ../src/ui/tools/text-tool.cpp:795
msgid "Insert no-break space"
msgstr "Setja inn ĂłrjĂșfanlegt bil"
-#: ../src/ui/tools/text-tool.cpp:840
+#: ../src/ui/tools/text-tool.cpp:831
msgid "Make bold"
msgstr "Gera feitletrað"
-#: ../src/ui/tools/text-tool.cpp:857
+#: ../src/ui/tools/text-tool.cpp:848
msgid "Make italic"
msgstr "Gera skåletrað"
-#: ../src/ui/tools/text-tool.cpp:895
+#: ../src/ui/tools/text-tool.cpp:886
msgid "New line"
msgstr "NĂœ lĂ­na"
-#: ../src/ui/tools/text-tool.cpp:936
+#: ../src/ui/tools/text-tool.cpp:927
msgid "Backspace"
msgstr "Baklykill (backspace)"
-#: ../src/ui/tools/text-tool.cpp:990
+#: ../src/ui/tools/text-tool.cpp:981
msgid "Kern to the left"
msgstr ""
-#: ../src/ui/tools/text-tool.cpp:1014
+#: ../src/ui/tools/text-tool.cpp:1005
msgid "Kern to the right"
msgstr ""
-#: ../src/ui/tools/text-tool.cpp:1038
+#: ../src/ui/tools/text-tool.cpp:1029
msgid "Kern up"
msgstr ""
-#: ../src/ui/tools/text-tool.cpp:1062
+#: ../src/ui/tools/text-tool.cpp:1053
msgid "Kern down"
msgstr ""
-#: ../src/ui/tools/text-tool.cpp:1137
+#: ../src/ui/tools/text-tool.cpp:1128
msgid "Rotate counterclockwise"
msgstr "SnĂșa rangsĂŠlis"
-#: ../src/ui/tools/text-tool.cpp:1157
+#: ../src/ui/tools/text-tool.cpp:1148
msgid "Rotate clockwise"
msgstr "SnĂșa rĂ©ttsĂŠlis"
-#: ../src/ui/tools/text-tool.cpp:1173
+#: ../src/ui/tools/text-tool.cpp:1164
msgid "Contract line spacing"
-msgstr ""
+msgstr "Minnka lĂ­nubil"
-#: ../src/ui/tools/text-tool.cpp:1179
+#: ../src/ui/tools/text-tool.cpp:1170
msgid "Contract letter spacing"
-msgstr ""
+msgstr "Minnka stafabil"
-#: ../src/ui/tools/text-tool.cpp:1196
+#: ../src/ui/tools/text-tool.cpp:1187
msgid "Expand line spacing"
-msgstr ""
+msgstr "Auka lĂ­nubil"
-#: ../src/ui/tools/text-tool.cpp:1202
+#: ../src/ui/tools/text-tool.cpp:1193
msgid "Expand letter spacing"
-msgstr ""
+msgstr "Auka stafabil"
-#: ../src/ui/tools/text-tool.cpp:1332
+#: ../src/ui/tools/text-tool.cpp:1323
msgid "Paste text"
msgstr "LĂ­ma texta"
-#: ../src/ui/tools/text-tool.cpp:1583
+#: ../src/ui/tools/text-tool.cpp:1574
#, c-format
msgid ""
"Type or edit flowed text (%d character%s); <b>Enter</b> to start new "
@@ -22900,48 +23229,56 @@ msgid_plural ""
"Type or edit flowed text (%d characters%s); <b>Enter</b> to start new "
"paragraph."
msgstr[0] ""
+"Skrifaðu eða breyttu flÊðitexta (%d stafur%s); <b>Enter</b> til að byrja nĂœja "
+"mĂĄlsgrein."
msgstr[1] ""
+"Skrifaðu eða breyttu flÊðitexta (%d stafir%s); <b>Enter</b> til að byrja "
+"nĂœja mĂĄlsgrein."
-#: ../src/ui/tools/text-tool.cpp:1585
+#: ../src/ui/tools/text-tool.cpp:1576
#, c-format
msgid "Type or edit text (%d character%s); <b>Enter</b> to start new line."
msgid_plural ""
"Type or edit text (%d characters%s); <b>Enter</b> to start new line."
msgstr[0] ""
+"Skrifaðu eða breyttu texta (%d stafur%s); <b>Enter</b> til að byrja nĂœja "
+"mĂĄlsgrein."
msgstr[1] ""
+"Skrifaðu eða breyttu texta (%d stafir%s); <b>Enter</b> til að byrja "
+"nĂœja mĂĄlsgrein."
-#: ../src/ui/tools/text-tool.cpp:1695
+#: ../src/ui/tools/text-tool.cpp:1686
msgid "Type text"
-msgstr ""
+msgstr "Slåðu inn texta"
#: ../src/ui/tools/tool-base.cpp:705
msgid "<b>Space+mouse move</b> to pan canvas"
-msgstr ""
+msgstr "<b>Bilslå+bendilhreyfing</b> til að hliðra myndfleti"
-#: ../src/ui/tools/tweak-tool.cpp:174
+#: ../src/ui/tools/tweak-tool.cpp:164
#, c-format
msgid "%s. Drag to <b>move</b>."
-msgstr ""
+msgstr "%s. Draga til að <b>flytja</b>."
-#: ../src/ui/tools/tweak-tool.cpp:178
+#: ../src/ui/tools/tweak-tool.cpp:168
#, c-format
msgid "%s. Drag or click to <b>move in</b>; with Shift to <b>move out</b>."
msgstr ""
"%s. Draga eða smella til að <b>fĂŠra inn</b>; með Shift til að <b>fĂŠra Ășt</b>."
-#: ../src/ui/tools/tweak-tool.cpp:186
+#: ../src/ui/tools/tweak-tool.cpp:176
#, c-format
msgid "%s. Drag or click to <b>move randomly</b>."
-msgstr ""
+msgstr "%s. Draga eða smella til að <b>fÊra slembið</b>."
-#: ../src/ui/tools/tweak-tool.cpp:190
+#: ../src/ui/tools/tweak-tool.cpp:180
#, c-format
msgid "%s. Drag or click to <b>scale down</b>; with Shift to <b>scale up</b>."
msgstr ""
"%s. Draga eða smella til að <b>kvarða niður</b>; með Shift til að <b>kvarða "
"upp</b>."
-#: ../src/ui/tools/tweak-tool.cpp:198
+#: ../src/ui/tools/tweak-tool.cpp:188
#, c-format
msgid ""
"%s. Drag or click to <b>rotate clockwise</b>; with Shift, "
@@ -22950,107 +23287,107 @@ msgstr ""
"%s. Draga eða smella til að <b>snĂșa rĂ©ttsĂŠlis</b>; með Shift til að <b>snĂșa "
"rangsĂŠlis</b>."
-#: ../src/ui/tools/tweak-tool.cpp:206
+#: ../src/ui/tools/tweak-tool.cpp:196
#, c-format
msgid "%s. Drag or click to <b>duplicate</b>; with Shift, <b>delete</b>."
msgstr ""
"%s. Draga eða smella til að <b>tvöfalda</b>; með Shift til að <b>eyða</b>."
-#: ../src/ui/tools/tweak-tool.cpp:214
+#: ../src/ui/tools/tweak-tool.cpp:204
#, c-format
msgid "%s. Drag to <b>push paths</b>."
-msgstr ""
+msgstr "%s. Draga eða smella til að <b>Ăœta ferlum</b>."
-#: ../src/ui/tools/tweak-tool.cpp:218
+#: ../src/ui/tools/tweak-tool.cpp:208
#, c-format
msgid "%s. Drag or click to <b>inset paths</b>; with Shift to <b>outset</b>."
msgstr ""
-"%s. Draga eða smella til að <b>innfella ferla</b>; með Shift til að <b>"
-"Ăștsetja</b>."
+"%s. Draga eða smella til að <b>innfella ferla</b>; með Shift til að "
+"<b>Ăștsetja</b>."
-#: ../src/ui/tools/tweak-tool.cpp:226
+#: ../src/ui/tools/tweak-tool.cpp:216
#, c-format
msgid "%s. Drag or click to <b>attract paths</b>; with Shift to <b>repel</b>."
msgstr ""
"%s. Draga eða smella til að <b>draga að ferla</b>; með Shift til að <b>Ăœta "
"frĂĄ</b>."
-#: ../src/ui/tools/tweak-tool.cpp:234
+#: ../src/ui/tools/tweak-tool.cpp:224
#, c-format
msgid "%s. Drag or click to <b>roughen paths</b>."
msgstr "%s. Draga eða smella til að <b>Ăœfa ferla</b>."
-#: ../src/ui/tools/tweak-tool.cpp:238
+#: ../src/ui/tools/tweak-tool.cpp:228
#, c-format
msgid "%s. Drag or click to <b>paint objects</b> with color."
-msgstr ""
+msgstr "%s. Draga eða smella til að <b>måla hluti</b> með lit."
-#: ../src/ui/tools/tweak-tool.cpp:242
+#: ../src/ui/tools/tweak-tool.cpp:232
#, c-format
msgid "%s. Drag or click to <b>randomize colors</b>."
msgstr "%s. Draga eða smella til að <b>slembigera liti</b>."
-#: ../src/ui/tools/tweak-tool.cpp:246
+#: ../src/ui/tools/tweak-tool.cpp:236
#, c-format
msgid ""
"%s. Drag or click to <b>increase blur</b>; with Shift to <b>decrease</b>."
msgstr ""
-"%s. Draga eða smella til að <b>auka afskerpingu</b>; með Shift til að <b>"
-"minnka afskerpingu</b>."
+"%s. Draga eða smella til að <b>auka afskerpingu</b>; með Shift til að "
+"<b>minnka afskerpingu</b>."
-#: ../src/ui/tools/tweak-tool.cpp:1205
+#: ../src/ui/tools/tweak-tool.cpp:1195
msgid "<b>Nothing selected!</b> Select objects to tweak."
msgstr "<b>Ekkert valið!</b> Veldu hluti til að aflaga."
-#: ../src/ui/tools/tweak-tool.cpp:1239
+#: ../src/ui/tools/tweak-tool.cpp:1229
msgid "Move tweak"
msgstr "Aflögun fÊrslu"
-#: ../src/ui/tools/tweak-tool.cpp:1243
+#: ../src/ui/tools/tweak-tool.cpp:1233
msgid "Move in/out tweak"
msgstr "Aflögun fĂŠrslu inn/Ășt"
-#: ../src/ui/tools/tweak-tool.cpp:1247
+#: ../src/ui/tools/tweak-tool.cpp:1237
msgid "Move jitter tweak"
msgstr "Aflögun flökts å fÊrslu"
-#: ../src/ui/tools/tweak-tool.cpp:1251
+#: ../src/ui/tools/tweak-tool.cpp:1241
msgid "Scale tweak"
msgstr "Aflögun kvarða"
-#: ../src/ui/tools/tweak-tool.cpp:1255
+#: ../src/ui/tools/tweak-tool.cpp:1245
msgid "Rotate tweak"
msgstr "Aflögun snĂșnings"
-#: ../src/ui/tools/tweak-tool.cpp:1259
+#: ../src/ui/tools/tweak-tool.cpp:1249
msgid "Duplicate/delete tweak"
msgstr "Aflögun við tvöföldun/eyðingu"
-#: ../src/ui/tools/tweak-tool.cpp:1263
+#: ../src/ui/tools/tweak-tool.cpp:1253
msgid "Push path tweak"
msgstr "Aflögun Ăœtingar ĂĄ ferli"
-#: ../src/ui/tools/tweak-tool.cpp:1267
+#: ../src/ui/tools/tweak-tool.cpp:1257
msgid "Shrink/grow path tweak"
msgstr "Aflögun vaxtar/minnkunar å ferli"
-#: ../src/ui/tools/tweak-tool.cpp:1271
+#: ../src/ui/tools/tweak-tool.cpp:1261
msgid "Attract/repel path tweak"
msgstr "Aflögun aðdråttar/fråhrindingar å ferli"
-#: ../src/ui/tools/tweak-tool.cpp:1275
+#: ../src/ui/tools/tweak-tool.cpp:1265
msgid "Roughen path tweak"
msgstr "Aflögun Ăœfingar ĂĄ ferli"
-#: ../src/ui/tools/tweak-tool.cpp:1279
+#: ../src/ui/tools/tweak-tool.cpp:1269
msgid "Color paint tweak"
msgstr "Aflögun litmålunar"
-#: ../src/ui/tools/tweak-tool.cpp:1283
+#: ../src/ui/tools/tweak-tool.cpp:1273
msgid "Color jitter tweak"
msgstr "Aflögun flökts å litum"
-#: ../src/ui/tools/tweak-tool.cpp:1287
+#: ../src/ui/tools/tweak-tool.cpp:1277
msgid "Blur tweak"
msgstr "Aflögun afskerpingar"
@@ -23086,6 +23423,10 @@ msgstr "SĂ©reignarhugbĂșnaður"
msgid "MetadataLicence|Other"
msgstr "Annað"
+#: ../src/ui/widget/licensor.cpp:72
+msgid "Document license updated"
+msgstr ""
+
#: ../src/ui/widget/object-composite-settings.cpp:47
#: ../src/ui/widget/selected-style.cpp:1119
#: ../src/ui/widget/selected-style.cpp:1120
@@ -23176,6 +23517,7 @@ msgid ""
"Resize the page to fit the current selection, or the entire drawing if there "
"is no selection"
msgstr ""
+"Aðlaga síðuna að ĂŸvĂ­ sem nĂș er valið eða að teikningu ef ekkert er valið"
#: ../src/ui/widget/page-sizer.cpp:489
msgid "Set page size"
@@ -23303,7 +23645,7 @@ msgstr "Valkostir bitamynda"
#: ../src/ui/widget/rendering-options.cpp:38
msgid "Preferred resolution of rendering, in dots per inch."
-msgstr ""
+msgstr "Kjörupplausn við myndgerð, í mynddílum å tommu - PÁT."
#: ../src/ui/widget/rendering-options.cpp:47
msgid ""
@@ -23374,7 +23716,7 @@ msgstr "Mynsturfylla"
#: ../src/ui/widget/selected-style.cpp:195
#: ../src/ui/widget/style-swatch.cpp:302
msgid "Pattern stroke"
-msgstr ""
+msgstr "Mynstur ĂĄ ĂștlĂ­nu"
#: ../src/ui/widget/selected-style.cpp:197
msgid "<b>L</b>"
@@ -23383,12 +23725,12 @@ msgstr "<b>L</b>"
#: ../src/ui/widget/selected-style.cpp:200
#: ../src/ui/widget/style-swatch.cpp:294
msgid "Linear gradient fill"
-msgstr ""
+msgstr "LĂ­nuleg litstigulsfylling"
#: ../src/ui/widget/selected-style.cpp:200
#: ../src/ui/widget/style-swatch.cpp:294
msgid "Linear gradient stroke"
-msgstr ""
+msgstr "LĂ­nuleg litstigulsĂștlĂ­na"
#: ../src/ui/widget/selected-style.cpp:207
msgid "<b>R</b>"
@@ -23397,12 +23739,12 @@ msgstr "<b>R</b>"
#: ../src/ui/widget/selected-style.cpp:210
#: ../src/ui/widget/style-swatch.cpp:298
msgid "Radial gradient fill"
-msgstr ""
+msgstr "Hringlaga litstigulsfylling"
#: ../src/ui/widget/selected-style.cpp:210
#: ../src/ui/widget/style-swatch.cpp:298
msgid "Radial gradient stroke"
-msgstr ""
+msgstr "Hringlaga litstigulsstroka"
#: ../src/ui/widget/selected-style.cpp:218
msgid "<b>M</b>"
@@ -23410,23 +23752,23 @@ msgstr "<b>M</b>"
#: ../src/ui/widget/selected-style.cpp:221
msgid "Mesh gradient fill"
-msgstr ""
+msgstr "Litstigulsfylling möskva"
#: ../src/ui/widget/selected-style.cpp:221
msgid "Mesh gradient stroke"
-msgstr ""
+msgstr "LitstigulsĂștlĂ­na möskva"
#: ../src/ui/widget/selected-style.cpp:229
msgid "Different"
-msgstr ""
+msgstr "Mismunandi"
#: ../src/ui/widget/selected-style.cpp:232
msgid "Different fills"
-msgstr ""
+msgstr "Mismunandi fyllingar"
#: ../src/ui/widget/selected-style.cpp:232
msgid "Different strokes"
-msgstr ""
+msgstr "Mismunandi ĂștlĂ­nur"
#: ../src/ui/widget/selected-style.cpp:234
#: ../src/ui/widget/style-swatch.cpp:324
@@ -23446,7 +23788,7 @@ msgstr "Afstilla fyllingu"
#: ../src/ui/widget/selected-style.cpp:591
#: ../src/ui/widget/style-swatch.cpp:326 ../src/widgets/fill-style.cpp:709
msgid "Unset stroke"
-msgstr ""
+msgstr "Afstilla ĂștlĂ­nu"
#: ../src/ui/widget/selected-style.cpp:240
msgid "Flat color fill"
@@ -23492,11 +23834,11 @@ msgstr "Breyta ĂștlĂ­nu..."
#: ../src/ui/widget/selected-style.cpp:258
msgid "Last set color"
-msgstr ""
+msgstr "Síðast stillti litur"
#: ../src/ui/widget/selected-style.cpp:262
msgid "Last selected color"
-msgstr ""
+msgstr "Síðast valinn litur"
#: ../src/ui/widget/selected-style.cpp:278
msgid "Copy color"
@@ -23549,19 +23891,19 @@ msgstr ""
#: ../src/ui/widget/selected-style.cpp:681
msgid "Invert fill"
-msgstr ""
+msgstr "Umhverfa fyllingu"
#: ../src/ui/widget/selected-style.cpp:705
msgid "Invert stroke"
-msgstr ""
+msgstr "Umhverfa ĂștlĂ­nu"
#: ../src/ui/widget/selected-style.cpp:717
msgid "White fill"
-msgstr ""
+msgstr "HvĂ­t fylling"
#: ../src/ui/widget/selected-style.cpp:729
msgid "White stroke"
-msgstr ""
+msgstr "HvĂ­t ĂștlĂ­na"
#: ../src/ui/widget/selected-style.cpp:741
msgid "Black fill"
@@ -23581,11 +23923,11 @@ msgstr "LĂ­ma ĂștlĂ­nu"
#: ../src/ui/widget/selected-style.cpp:970
msgid "Change stroke width"
-msgstr ""
+msgstr "Breyta breidd ĂștlĂ­nu"
#: ../src/ui/widget/selected-style.cpp:1073
msgid ", drag to adjust"
-msgstr ""
+msgstr ", draga til að aðlaga"
#: ../src/ui/widget/selected-style.cpp:1158
#, c-format
@@ -23618,7 +23960,7 @@ msgstr ""
#: ../src/ui/widget/selected-style.cpp:1392
msgid "Adjust saturation"
-msgstr ""
+msgstr "Breyta litmettun"
#: ../src/ui/widget/selected-style.cpp:1394
#, c-format
@@ -23630,7 +23972,7 @@ msgstr ""
#: ../src/ui/widget/selected-style.cpp:1398
msgid "Adjust lightness"
-msgstr ""
+msgstr "Breyta ljĂłsleika"
#: ../src/ui/widget/selected-style.cpp:1400
#, c-format
@@ -23642,7 +23984,7 @@ msgstr ""
#: ../src/ui/widget/selected-style.cpp:1404
msgid "Adjust hue"
-msgstr ""
+msgstr "Breyta litblĂŠ"
#: ../src/ui/widget/selected-style.cpp:1406
#, c-format
@@ -23655,7 +23997,7 @@ msgstr ""
#: ../src/ui/widget/selected-style.cpp:1524
#: ../src/ui/widget/selected-style.cpp:1538
msgid "Adjust stroke width"
-msgstr ""
+msgstr "Aðlaga breidd ĂștlĂ­nu"
#: ../src/ui/widget/selected-style.cpp:1525
#, c-format
@@ -23743,8 +24085,8 @@ msgstr[1] ""
msgid ""
"shared by <b>%d</b> box; drag with <b>Shift</b> to separate selected box(es)"
msgid_plural ""
-"shared by <b>%d</b> boxes; drag with <b>Shift</b> to separate selected box"
-"(es)"
+"shared by <b>%d</b> boxes; drag with <b>Shift</b> to separate selected "
+"box(es)"
msgstr[0] ""
msgstr[1] ""
@@ -23841,7 +24183,7 @@ msgstr "Tvöfalda lag"
#. TRANSLATORS: this means "The layer has been duplicated."
#: ../src/verbs.cpp:1391
msgid "Duplicated layer."
-msgstr "Tvöfaldað lag"
+msgstr "Tvöfaldað lag."
#: ../src/verbs.cpp:1424
msgid "Delete layer"
@@ -23997,7 +24339,7 @@ msgstr "Vista a_frit..."
#: ../src/verbs.cpp:2442
msgid "Save a copy of the document under a new name"
-msgstr ""
+msgstr "Vista afrit af skjalinu með nĂœju heiti"
#: ../src/verbs.cpp:2443
msgid "_Print..."
@@ -24033,7 +24375,7 @@ msgstr "Flytja inn klippimynd..."
#: ../src/verbs.cpp:2452
msgid "Import clipart from Open Clip Art Library"
-msgstr "Flytja inn Ășr Open Clip Art myndaklippusafninu"
+msgstr "Flytja inn Ășr Open Clip Art klippimyndasafninu"
#. new FileVerb(SP_VERB_FILE_EXPORT_TO_OCAL, "FileExportToOCAL", N_("Export To Open Clip Art Library"), N_("Export this document to Open Clip Art Library"), INKSCAPE_ICON_DOCUMENT_EXPORT_OCAL),
#: ../src/verbs.cpp:2454
@@ -24106,7 +24448,8 @@ msgstr "_LĂ­ma"
#: ../src/verbs.cpp:2474
msgid "Paste objects from clipboard to mouse point, or paste text"
-msgstr "LĂ­ma hluti af klippiborði ĂĄ staðsetningu mĂșsarbendils, eða lĂ­ma texta"
+msgstr ""
+"LĂ­ma hluti af klippispjaldi ĂĄ staðsetningu mĂșsarbendils, eða lĂ­ma texta"
#: ../src/verbs.cpp:2475
msgid "Paste _Style"
@@ -24170,7 +24513,7 @@ msgstr "Líma å st_aðnum"
#: ../src/verbs.cpp:2490
msgid "Paste objects from clipboard to the original location"
-msgstr "Líma hluti af klippiborði å upprunalega staðsetningu"
+msgstr "Líma hluti af klippispjaldi å upprunalega staðsetningu"
#: ../src/verbs.cpp:2491
msgid "Paste Path _Effect"
@@ -24202,7 +24545,7 @@ msgstr "_Eyða"
#: ../src/verbs.cpp:2498
msgid "Delete selection"
-msgstr "_Eyða vali"
+msgstr "Eyða vali"
#: ../src/verbs.cpp:2499
msgid "Duplic_ate"
@@ -24250,7 +24593,7 @@ msgstr ""
#: ../src/verbs.cpp:2509
msgid "Clone original path (LPE)"
-msgstr ""
+msgstr "KlĂłna upprunalegan feril (LPE)"
#: ../src/verbs.cpp:2510
msgid ""
@@ -24369,7 +24712,7 @@ msgstr ""
#: ../src/verbs.cpp:2537
msgid "_Object Type"
-msgstr "Tegund _hlutar:"
+msgstr "Tegund _hlutar"
#: ../src/verbs.cpp:2538
msgid ""
@@ -24561,7 +24904,7 @@ msgstr "Útsetja valda ferla"
#: ../src/verbs.cpp:2599
msgid "O_utset Path by 1 px"
-msgstr "Útsetja feril um 1 px"
+msgstr "Ú_tsetja feril um 1 px"
#: ../src/verbs.cpp:2600
msgid "Outset selected paths by 1 px"
@@ -24569,7 +24912,7 @@ msgstr "Útsetja valda ferla um 1 px"
#: ../src/verbs.cpp:2602
msgid "O_utset Path by 10 px"
-msgstr "Útsetja feril um 10 px"
+msgstr "Ú_tsetja feril um 10 px"
#: ../src/verbs.cpp:2603
msgid "Outset selected paths by 10 px"
@@ -24620,7 +24963,7 @@ msgstr ""
#: ../src/verbs.cpp:2621
msgid "_Stroke to Path"
-msgstr "Útlína í feril"
+msgstr "Út_lína í feril"
#: ../src/verbs.cpp:2622
msgid "Convert selected object's stroke to paths"
@@ -24640,7 +24983,7 @@ msgstr "_SnĂșa við"
#: ../src/verbs.cpp:2626
msgid "Reverse the direction of selected paths (useful for flipping markers)"
-msgstr ""
+msgstr "SnĂșa við stefnu valinna ferla (nĂœtist til að snĂșa við merkjum ferla)"
#: ../src/verbs.cpp:2629
msgid "Create one or more paths from a bitmap by tracing it"
@@ -24648,11 +24991,13 @@ msgstr ""
#: ../src/verbs.cpp:2630
msgid "Trace Pixel Art..."
-msgstr ""
+msgstr "LĂ­nuteikna Pixel Art..."
#: ../src/verbs.cpp:2631
msgid "Create paths using Kopf-Lischinski algorithm to vectorize pixel art"
msgstr ""
+"ÚtbĂșa ferla með Kopf-Lischinski reikniritinu til að vigurgera pixel art "
+"myndir"
#: ../src/verbs.cpp:2632
msgid "Make a _Bitmap Copy"
@@ -24678,7 +25023,7 @@ msgstr "_Sundra"
#: ../src/verbs.cpp:2639
msgid "Break selected paths into subpaths"
-msgstr ""
+msgstr "RjĂșfa valda ferla Ă­ undirferla"
#: ../src/verbs.cpp:2640
msgid "_Arrange..."
@@ -24703,7 +25048,7 @@ msgstr "Endur_nefna lag..."
#: ../src/verbs.cpp:2646
msgid "Rename the current layer"
-msgstr ""
+msgstr "Endurnefna nĂșverandi lag"
#: ../src/verbs.cpp:2647
msgid "Switch to Layer Abov_e"
@@ -24728,7 +25073,7 @@ msgstr "Flytja val ĂĄ nĂŠsta lag fyrir _ofan"
#: ../src/verbs.cpp:2652
msgid "Move selection to the layer above the current"
-msgstr ""
+msgstr "Flytja val ĂĄ nĂŠsta lag fyrir ofan lagið sem ĂŸĂș ert að vinna ĂĄ nĂșna"
#: ../src/verbs.cpp:2653
msgid "Move Selection to Layer Bel_ow"
@@ -24736,11 +25081,11 @@ msgstr "Flytja val å nÊsta lag fyrir _neðan"
#: ../src/verbs.cpp:2654
msgid "Move selection to the layer below the current"
-msgstr ""
+msgstr "Flytja val ĂĄ nĂŠsta lag fyrir neðan lagið sem ĂŸĂș ert að vinna ĂĄ nĂșna"
#: ../src/verbs.cpp:2655
msgid "Move Selection to Layer..."
-msgstr ""
+msgstr "Flytja val å lagið..."
#: ../src/verbs.cpp:2657
msgid "Layer to _Top"
@@ -24748,7 +25093,7 @@ msgstr "FĂŠra lag efs_t"
#: ../src/verbs.cpp:2658
msgid "Raise the current layer to the top"
-msgstr ""
+msgstr "HĂŠkka nĂșverandi lag efst"
#: ../src/verbs.cpp:2659
msgid "Layer to _Bottom"
@@ -24756,7 +25101,7 @@ msgstr "FÊra lag _neðst"
#: ../src/verbs.cpp:2660
msgid "Lower the current layer to the bottom"
-msgstr ""
+msgstr "LĂŠkka nĂșverandi lag neðst"
#: ../src/verbs.cpp:2661
msgid "_Raise Layer"
@@ -24824,7 +25169,7 @@ msgstr "LÊsa öllum lögunum"
#: ../src/verbs.cpp:2677
msgid "Lock/Unlock _other layers"
-msgstr "LÊsa/AflÊsa öðrum lögum"
+msgstr "LÊsa/AflÊsa öðru_m lögum"
#: ../src/verbs.cpp:2678
msgid "Lock all the other layers"
@@ -24848,7 +25193,7 @@ msgstr "VĂ­xla lĂŠsingu ĂŸessa lags"
#: ../src/verbs.cpp:2683
msgid "_Show/hide Current Layer"
-msgstr ""
+msgstr "_SĂœna/Fela nĂșverandi lag"
#: ../src/verbs.cpp:2684
msgid "Toggle visibility of current layer"
@@ -24877,7 +25222,7 @@ msgstr "SnĂșa völdu 90° rangsĂŠlis"
#: ../src/verbs.cpp:2695
msgid "Remove _Transformations"
-msgstr "FjarlĂŠgja umbreytingar"
+msgstr "F_jarlĂŠgja umbreytingar"
#: ../src/verbs.cpp:2696
msgid "Remove transformations from object"
@@ -24956,7 +25301,7 @@ msgstr ""
#: ../src/verbs.cpp:2719
msgid "Create Cl_ip Group"
-msgstr ""
+msgstr "BĂșa til afma_rkandi hĂłp"
#: ../src/verbs.cpp:2720
msgid "Creates a clip group using the selected objects as a base"
@@ -25144,7 +25489,7 @@ msgstr "Fylla afmörkuð svÊði"
#: ../src/verbs.cpp:2769
msgctxt "ContextVerb"
msgid "LPE Edit"
-msgstr ""
+msgstr "LPE breyting"
#: ../src/verbs.cpp:2770
msgid "Edit Path Effect parameters"
@@ -25166,7 +25511,7 @@ msgstr "LPE verkfĂŠri"
#: ../src/verbs.cpp:2774
msgid "Do geometric constructions"
-msgstr ""
+msgstr "Gera rĂșmfrÊðilega byggingu"
#. Tool prefs
#: ../src/verbs.cpp:2776
@@ -25179,7 +25524,7 @@ msgstr "Opna stillingar fyrir valverkfÊrið"
#: ../src/verbs.cpp:2778
msgid "Node Tool Preferences"
-msgstr ""
+msgstr "Kjörstillingar hnĂștaverkfĂŠris"
#: ../src/verbs.cpp:2779
msgid "Open Preferences for the Node tool"
@@ -25187,7 +25532,7 @@ msgstr "Opna stillingar fyrir hnĂștaverkfĂŠrið"
#: ../src/verbs.cpp:2780
msgid "Tweak Tool Preferences"
-msgstr "Kjörstillingar aflögunarverkfÊris"
+msgstr "Kjörstillingar aflögunar"
#: ../src/verbs.cpp:2781
msgid "Open Preferences for the Tweak tool"
@@ -25195,7 +25540,7 @@ msgstr "Opna stillingar fyrir aflögunarverkfÊrið"
#: ../src/verbs.cpp:2782
msgid "Spray Tool Preferences"
-msgstr "Kjörstillingar sprautuverkfÊris"
+msgstr "Kjörstillingar sprautunar"
#: ../src/verbs.cpp:2783
msgid "Open Preferences for the Spray tool"
@@ -25219,7 +25564,7 @@ msgstr "Opna stillingar fyrir ĂŸrĂ­vĂ­ddarkassaverkfĂŠrið"
#: ../src/verbs.cpp:2788
msgid "Ellipse Preferences"
-msgstr ""
+msgstr "Kjörstillingar sporbaugs"
#: ../src/verbs.cpp:2789
msgid "Open Preferences for the Ellipse tool"
@@ -25227,7 +25572,7 @@ msgstr "Opna stillingar fyrir sporbaugsverkfÊrið"
#: ../src/verbs.cpp:2790
msgid "Star Preferences"
-msgstr ""
+msgstr "Kjörstillingar stjörnu"
#: ../src/verbs.cpp:2791
msgid "Open Preferences for the Star tool"
@@ -25259,7 +25604,7 @@ msgstr "Opna stillingar fyrir pennaverkfÊrið"
#: ../src/verbs.cpp:2798
msgid "Calligraphic Preferences"
-msgstr ""
+msgstr "Kjörstillingar skrautskriftar"
#: ../src/verbs.cpp:2799
msgid "Open Preferences for the Calligraphy tool"
@@ -25267,7 +25612,7 @@ msgstr "Opna stillingar fyrir skrautskriftarverkfÊrið"
#: ../src/verbs.cpp:2800
msgid "Text Preferences"
-msgstr ""
+msgstr "Kjörstillingar texta"
#: ../src/verbs.cpp:2801
msgid "Open Preferences for the Text tool"
@@ -25275,7 +25620,7 @@ msgstr "Opna stillingar fyrir pennaverkfÊrið"
#: ../src/verbs.cpp:2802
msgid "Gradient Preferences"
-msgstr ""
+msgstr "Kjörstillingar litstiguls"
#: ../src/verbs.cpp:2803
msgid "Open Preferences for the Gradient tool"
@@ -25283,15 +25628,15 @@ msgstr "Opna stillingar fyrir litstiglaverkfÊrið"
#: ../src/verbs.cpp:2804
msgid "Mesh Preferences"
-msgstr ""
+msgstr "Kjörstillingar möskva"
#: ../src/verbs.cpp:2805
msgid "Open Preferences for the Mesh tool"
-msgstr ""
+msgstr "Opna stillingar fyrir möskvaverkfÊrið"
#: ../src/verbs.cpp:2806
msgid "Zoom Preferences"
-msgstr ""
+msgstr "Kjörstillingar aðdråttar"
#: ../src/verbs.cpp:2807
msgid "Open Preferences for the Zoom tool"
@@ -25299,15 +25644,15 @@ msgstr "Opna stillingar fyrir aðdråttarverkfÊrið"
#: ../src/verbs.cpp:2808
msgid "Measure Preferences"
-msgstr ""
+msgstr "Kjörstillingar målbands"
#: ../src/verbs.cpp:2809
msgid "Open Preferences for the Measure tool"
-msgstr ""
+msgstr "Opna stillingar fyrir målbandið"
#: ../src/verbs.cpp:2810
msgid "Dropper Preferences"
-msgstr ""
+msgstr "Kjörstillingar litplokkara"
#: ../src/verbs.cpp:2811
msgid "Open Preferences for the Dropper tool"
@@ -25323,7 +25668,7 @@ msgstr "Opna stillingar fyrir tengilínuverkfÊrið"
#: ../src/verbs.cpp:2814
msgid "Paint Bucket Preferences"
-msgstr ""
+msgstr "Kjörstillingar fötufyllingar"
#: ../src/verbs.cpp:2815
msgid "Open Preferences for the Paint Bucket tool"
@@ -25339,7 +25684,7 @@ msgstr "Opna stillingar fyrir strokleðurverkfÊrið"
#: ../src/verbs.cpp:2818
msgid "LPE Tool Preferences"
-msgstr ""
+msgstr "Kjörstillingar LPE-verkfÊris"
#: ../src/verbs.cpp:2819
msgid "Open Preferences for the LPETool tool"
@@ -25368,15 +25713,15 @@ msgstr "_MĂŠlistikur"
#: ../src/verbs.cpp:2823
msgid "Show or hide the canvas rulers"
-msgstr ""
+msgstr "Birta eða fela mÊlistikur myndflatar"
#: ../src/verbs.cpp:2824
msgid "Scroll_bars"
-msgstr "Skrunstikur"
+msgstr "S_krunstikur"
#: ../src/verbs.cpp:2824
msgid "Show or hide the canvas scrollbars"
-msgstr ""
+msgstr "Birta eða fela skrunstikur myndflatar"
#: ../src/verbs.cpp:2825
msgid "Page _Grid"
@@ -25384,7 +25729,7 @@ msgstr "_Hnitanet síðu"
#: ../src/verbs.cpp:2825
msgid "Show or hide the page grid"
-msgstr ""
+msgstr "Birta eða fela hnitanet síðu"
#: ../src/verbs.cpp:2826
msgid "G_uides"
@@ -25404,7 +25749,7 @@ msgstr "Ski_panaslĂĄ"
#: ../src/verbs.cpp:2828
msgid "Show or hide the Commands bar (under the menu)"
-msgstr ""
+msgstr "Birta eða fela skipanaslåna (undir valmyndinni)"
#: ../src/verbs.cpp:2829
msgid "Sn_ap Controls Bar"
@@ -25412,11 +25757,11 @@ msgstr "_GripstĂœrislĂĄ"
#: ../src/verbs.cpp:2829
msgid "Show or hide the snapping controls"
-msgstr ""
+msgstr "Birta eða fela stjórntÊki fyrir grip"
#: ../src/verbs.cpp:2830
msgid "T_ool Controls Bar"
-msgstr "VerkfĂŠrastĂœrislĂĄ"
+msgstr "Ver_kfĂŠrastĂœrislĂĄ"
#: ../src/verbs.cpp:2830
msgid "Show or hide the Tool Controls bar"
@@ -25436,7 +25781,7 @@ msgstr "_Litaspjald"
#: ../src/verbs.cpp:2832
msgid "Show or hide the color palette"
-msgstr ""
+msgstr "Birta eða fela litaspjaldið"
#: ../src/verbs.cpp:2833
msgid "_Statusbar"
@@ -25444,7 +25789,7 @@ msgstr "_Stöðustika"
#: ../src/verbs.cpp:2833
msgid "Show or hide the statusbar (at the bottom of the window)"
-msgstr ""
+msgstr "Birta eða fela stöðustikuna (neðst Ă­ ĂŸessum glugga)"
#: ../src/verbs.cpp:2834
msgid "Nex_t Zoom"
@@ -25496,15 +25841,15 @@ msgstr "Skoða ĂŸennan vinnuglugga ĂĄ öllum skjĂĄnum"
#: ../src/verbs.cpp:2847
msgid "Fullscreen & Focus Mode"
-msgstr ""
+msgstr "Skjåfylli & Áhersluhamur"
#: ../src/verbs.cpp:2850
msgid "Toggle _Focus Mode"
-msgstr ""
+msgstr "VĂ­_xla ĂĄhersluham"
#: ../src/verbs.cpp:2850
msgid "Remove excess toolbars to focus on drawing"
-msgstr ""
+msgstr "FjarlĂŠgja umfram verkfĂŠrastikur ĂŸegar ĂĄhersla er ĂĄ teikningu"
#: ../src/verbs.cpp:2852
msgid "Duplic_ate Window"
@@ -25555,11 +25900,11 @@ msgstr "VĂ­_xla"
#: ../src/verbs.cpp:2864
msgid "Toggle between normal and outline display modes"
-msgstr ""
+msgstr "VĂ­xla milli venjulegs og ĂștlĂ­nubirtingarhams"
#: ../src/verbs.cpp:2866
msgid "Switch to normal color display mode"
-msgstr ""
+msgstr "Fara Ă­ venjulegan litbirtingarham"
#: ../src/verbs.cpp:2867
msgid "_Grayscale"
@@ -25567,11 +25912,11 @@ msgstr "_GrĂĄtĂłna"
#: ../src/verbs.cpp:2868
msgid "Switch to grayscale display mode"
-msgstr ""
+msgstr "Fara Ă­ grĂĄtĂłna birtingarham"
#: ../src/verbs.cpp:2872
msgid "Toggle between normal and grayscale color display modes"
-msgstr ""
+msgstr "VĂ­xla milli venjulegs og grĂĄtĂłnabirtingarhams"
#: ../src/verbs.cpp:2874
msgid "Color-managed view"
@@ -25583,7 +25928,7 @@ msgstr "VĂ­xla af/ĂĄ litstĂœrðri sĂœn Ă­ ĂŸessum vinnuglugga"
#: ../src/verbs.cpp:2877
msgid "Ico_n Preview..."
-msgstr "Tåknmyndaforskoðun..."
+msgstr "Tåk_nmyndaforskoðun..."
#: ../src/verbs.cpp:2878
msgid "Open a window to preview objects at different icon resolutions"
@@ -25629,7 +25974,7 @@ msgstr "Breyta eiginleikum ĂŸessa skjals (til vistunar með skjalinu)"
#: ../src/verbs.cpp:2893
msgid "Document _Metadata..."
-msgstr "LĂœsigögn skjals"
+msgstr "LĂœsi_gögn skjals..."
#: ../src/verbs.cpp:2894
msgid "Edit document metadata (to be saved with the document)"
@@ -25640,6 +25985,8 @@ msgid ""
"Edit objects' colors, gradients, arrowheads, and other fill and stroke "
"properties..."
msgstr ""
+"Breyta litum hlutar, litstiglum, línubreidd, örvum, og öðrum eiginleikum "
+"fyllingar og ĂștlĂ­nu..."
#. FIXME: Probably better to either use something from the icon naming spec or ship our own "select-font" icon
#: ../src/verbs.cpp:2898
@@ -25714,19 +26061,19 @@ msgstr "Skoða og breyta XML-greinum skjalsins"
#: ../src/verbs.cpp:2918
msgid "_Find/Replace..."
-msgstr ""
+msgstr "_Finna og skipta Ășt..."
#: ../src/verbs.cpp:2919
msgid "Find objects in document"
-msgstr ""
+msgstr "Leita að hlutum í skjali"
#: ../src/verbs.cpp:2920
msgid "Find and _Replace Text..."
-msgstr ""
+msgstr "Finna og skipta Ășt te_xta..."
#: ../src/verbs.cpp:2921
msgid "Find and replace text in document"
-msgstr ""
+msgstr "Finna og skipta Ășt texta Ă­ skjali"
#: ../src/verbs.cpp:2923
msgid "Check spelling of text in document"
@@ -25746,7 +26093,7 @@ msgstr "SĂœna/Fela samskipta_glugga"
#: ../src/verbs.cpp:2927
msgid "Show or hide all open dialogs"
-msgstr ""
+msgstr "Birta eða fela alla opna glugga"
#: ../src/verbs.cpp:2928
msgid "Create Tiled Clones..."
@@ -25760,15 +26107,16 @@ msgstr "BĂșa til marga klĂłna afvöldum hlut, raða ĂŸeim upp Ă­ mynstur eða dr
#: ../src/verbs.cpp:2930
msgid "_Object attributes..."
-msgstr ""
+msgstr "_Eigindi hlutar..."
#: ../src/verbs.cpp:2931
msgid "Edit the object attributes..."
-msgstr ""
+msgstr "Breyta eigindum hlutar..."
#: ../src/verbs.cpp:2933
msgid "Edit the ID, locked and visible status, and other object properties"
msgstr ""
+"Breyttu auðkenni, stöðu lĂŠsinga og sĂœnileika, ĂĄsamt öðrum eiginleikum hlutar"
#: ../src/verbs.cpp:2934
msgid "_Input Devices..."
@@ -25776,7 +26124,7 @@ msgstr "_InntakstĂŠki..."
#: ../src/verbs.cpp:2935
msgid "Configure extended input devices, such as a graphics tablet"
-msgstr ""
+msgstr "Stilla aukaleg inntakstÊki, eins og teiknitöflur"
#: ../src/verbs.cpp:2936
msgid "_Extensions..."
@@ -25784,7 +26132,7 @@ msgstr "_ViðbÊtur..."
#: ../src/verbs.cpp:2937
msgid "Query information about extensions"
-msgstr ""
+msgstr "NĂĄlgast upplĂœsingar um viðbĂŠtur"
#: ../src/verbs.cpp:2938
msgid "Layer_s..."
@@ -25800,23 +26148,23 @@ msgstr "_Hlutir..."
#: ../src/verbs.cpp:2941
msgid "View Objects"
-msgstr ""
+msgstr "Skoða hluti"
#: ../src/verbs.cpp:2942
msgid "Selection se_ts..."
-msgstr ""
+msgstr "Myndvalsse_tt..."
#: ../src/verbs.cpp:2943
msgid "View Tags"
-msgstr ""
+msgstr "Skoða merki"
#: ../src/verbs.cpp:2944
msgid "Path E_ffects ..."
-msgstr ""
+msgstr "_Ferilbrellur ..."
#: ../src/verbs.cpp:2945
msgid "Manage, edit, and apply path effects"
-msgstr ""
+msgstr "SĂœsla með, breyta og beita ferilbrellum"
#: ../src/verbs.cpp:2946
msgid "Filter _Editor..."
@@ -25824,7 +26172,7 @@ msgstr "SĂ­_uritill..."
#: ../src/verbs.cpp:2947
msgid "Manage, edit, and apply SVG filters"
-msgstr ""
+msgstr "SĂœsla með, breyta og beita SVG-sĂ­um"
#: ../src/verbs.cpp:2948
msgid "SVG Font Editor..."
@@ -25836,7 +26184,7 @@ msgstr "Breyta SVG letri"
#: ../src/verbs.cpp:2950
msgid "Print Colors..."
-msgstr ""
+msgstr "Prentlitir..."
#: ../src/verbs.cpp:2951
msgid ""
@@ -25849,7 +26197,7 @@ msgstr "_Flytja Ășt PNG mynd..."
#: ../src/verbs.cpp:2953
msgid "Export this document or a selection as a PNG image"
-msgstr ""
+msgstr "Flytja ĂŸetta skjal Ășt eða valin atriði sem PNG bitamynd"
#. Help
#: ../src/verbs.cpp:2955
@@ -25874,58 +26222,58 @@ msgstr "_Um Inkscape"
#: ../src/verbs.cpp:2960
msgid "Inkscape version, authors, license"
-msgstr ""
+msgstr "Inkscape ĂștgĂĄfa, höfundar, notkunarskilmĂĄlar"
#. new HelpVerb(SP_VERB_SHOW_LICENSE, "ShowLicense", N_("_License"),
#. N_("Distribution terms"), /*"show_license"*/"inkscape_options"),
#. Tutorials
#: ../src/verbs.cpp:2965
msgid "Inkscape: _Basic"
-msgstr ""
+msgstr "Inkscape: _Grunnur"
#: ../src/verbs.cpp:2966
msgid "Getting started with Inkscape"
-msgstr ""
+msgstr "Til að komast í gang með Inkscape"
#. "tutorial_basic"
#: ../src/verbs.cpp:2967
msgid "Inkscape: _Shapes"
-msgstr ""
+msgstr "Inkscape: _Lögun"
#: ../src/verbs.cpp:2968
msgid "Using shape tools to create and edit shapes"
-msgstr ""
+msgstr "Notkun umbreytingartĂłla til að bĂșa til og breyta formum"
#: ../src/verbs.cpp:2969
msgid "Inkscape: _Advanced"
-msgstr ""
+msgstr "Inkscape: Í_tarlegt"
#: ../src/verbs.cpp:2970
msgid "Advanced Inkscape topics"
-msgstr ""
+msgstr "Fyrir lengra komna Ă­ Inkcape"
#. "tutorial_advanced"
#. TRANSLATORS: "to trace" means "to convert a bitmap to vector graphics" (to vectorize)
#: ../src/verbs.cpp:2972
msgid "Inkscape: T_racing"
-msgstr ""
+msgstr "Inkscape: LĂ­nu_rakning"
#: ../src/verbs.cpp:2973
msgid "Using bitmap tracing"
-msgstr ""
+msgstr "Línuteiknun bitamynda, breyta svÊðum bitamynda í ferla"
#. "tutorial_tracing"
#: ../src/verbs.cpp:2974
msgid "Inkscape: Tracing Pixel Art"
-msgstr ""
+msgstr "Inkscape: LĂ­nurakning Pixel Art mynda"
#: ../src/verbs.cpp:2975
msgid "Using Trace Pixel Art dialog"
-msgstr ""
+msgstr "Nota Trace Pixel Art lĂ­nuteikningargluggann"
#: ../src/verbs.cpp:2976
msgid "Inkscape: _Calligraphy"
-msgstr ""
+msgstr "Inkscape: _Skrautskrift"
#: ../src/verbs.cpp:2977
msgid "Using the Calligraphy pen tool"
@@ -25933,20 +26281,20 @@ msgstr "Nota skrautskriftarverkfÊrið"
#: ../src/verbs.cpp:2978
msgid "Inkscape: _Interpolate"
-msgstr ""
+msgstr "Inkscape: _BrĂșun"
#: ../src/verbs.cpp:2979
msgid "Using the interpolate extension"
-msgstr ""
+msgstr "Notkun brĂșunarviðbĂłtarinnar (interpolate)"
#. "tutorial_interpolate"
#: ../src/verbs.cpp:2980
msgid "_Elements of Design"
-msgstr ""
+msgstr "GrunnĂŸĂŠttir _hönnunar"
#: ../src/verbs.cpp:2981
msgid "Principles of design in the tutorial form"
-msgstr ""
+msgstr "Kennsla um grunnĂŸĂŠtti hönnunar"
#. "tutorial_design"
#: ../src/verbs.cpp:2982
@@ -25955,7 +26303,7 @@ msgstr "Á_bendingar og góð råð"
#: ../src/verbs.cpp:2983
msgid "Miscellaneous tips and tricks"
-msgstr ""
+msgstr "Ýmsar ábendingar og góð ráð"
#. "tutorial_tips"
#. Effect -- renamed Extension
@@ -25965,7 +26313,7 @@ msgstr "Síðasta _viðbót"
#: ../src/verbs.cpp:2987
msgid "Repeat the last extension with the same settings"
-msgstr ""
+msgstr "Keyra aftur síðustu viðbót með sömu stillingum og åður"
#: ../src/verbs.cpp:2988
msgid "_Previous Extension Settings..."
@@ -25973,20 +26321,21 @@ msgstr "Stillin_gar síðustu viðbótar..."
#: ../src/verbs.cpp:2989
msgid "Repeat the last extension with new settings"
-msgstr ""
+msgstr "Keyra aftur síðustu viðbĂłt með nĂœjum stillingum"
#: ../src/verbs.cpp:2993
msgid "Fit the page to the current selection"
-msgstr ""
+msgstr "Aðlaga síðuna að ĂŸvĂ­ sem nĂș er valið"
#: ../src/verbs.cpp:2995
msgid "Fit the page to the drawing"
-msgstr ""
+msgstr "Aðlaga síðuna að teikningu"
#: ../src/verbs.cpp:2997
msgid ""
"Fit the page to the current selection or the drawing if there is no selection"
msgstr ""
+"Aðlaga síðuna að ĂŸvĂ­ sem nĂș er valið eða að teikningu ef ekkert er valið"
#. LockAndHide
#: ../src/verbs.cpp:2999
@@ -26019,58 +26368,58 @@ msgstr "FjarlÊgja tengt ICC litasnið"
#: ../src/verbs.cpp:3014
msgid "Add External Script"
-msgstr ""
+msgstr "BÊta við ytri skriftu"
#: ../src/verbs.cpp:3014
msgid "Add an external script"
-msgstr ""
+msgstr "BÊta við ytri skriftus"
#: ../src/verbs.cpp:3016
msgid "Add Embedded Script"
-msgstr ""
+msgstr "BÊta við ívafinni skriftu"
#: ../src/verbs.cpp:3016
msgid "Add an embedded script"
-msgstr ""
+msgstr "BÊta við ívafinni skriftu"
#: ../src/verbs.cpp:3018
msgid "Edit Embedded Script"
-msgstr ""
+msgstr "Breyta Ă­vafinni skriftu"
#: ../src/verbs.cpp:3018
msgid "Edit an embedded script"
-msgstr ""
+msgstr "Breyta Ă­vafinni skriftu"
#: ../src/verbs.cpp:3020
msgid "Remove External Script"
-msgstr ""
+msgstr "FjarlĂŠgja ytri skriftu"
#: ../src/verbs.cpp:3020
msgid "Remove an external script"
-msgstr ""
+msgstr "FjarlĂŠgja ytri skriftu"
#: ../src/verbs.cpp:3022
msgid "Remove Embedded Script"
-msgstr ""
+msgstr "FjarlÊgja ívafða skriftu"
#: ../src/verbs.cpp:3022
msgid "Remove an embedded script"
-msgstr ""
+msgstr "FjarlÊgja ívafða skriftu"
#: ../src/verbs.cpp:3044 ../src/verbs.cpp:3045
msgid "Center on horizontal and vertical axis"
-msgstr ""
+msgstr "Miðja å låréttum og lóðréttum åsum"
#: ../src/widgets/arc-toolbar.cpp:132
msgid "Arc: Change start/end"
-msgstr ""
+msgstr "Bogi: Breyta upphafi/enda"
#: ../src/widgets/arc-toolbar.cpp:198
msgid "Arc: Change open/closed"
-msgstr ""
+msgstr "Bogi: Víxla opinn/lokaður"
#: ../src/widgets/arc-toolbar.cpp:289 ../src/widgets/arc-toolbar.cpp:319
-#: ../src/widgets/rect-toolbar.cpp:261 ../src/widgets/rect-toolbar.cpp:300
+#: ../src/widgets/rect-toolbar.cpp:260 ../src/widgets/rect-toolbar.cpp:299
#: ../src/widgets/spiral-toolbar.cpp:214 ../src/widgets/spiral-toolbar.cpp:238
#: ../src/widgets/star-toolbar.cpp:384 ../src/widgets/star-toolbar.cpp:446
msgid "<b>New:</b>"
@@ -26079,7 +26428,7 @@ msgstr "<b>NĂœtt:</b>"
#. FIXME: implement averaging of all parameters for multiple selected
#. gtk_label_set_markup(GTK_LABEL(l), _("<b>Average:</b>"));
#: ../src/widgets/arc-toolbar.cpp:292 ../src/widgets/arc-toolbar.cpp:303
-#: ../src/widgets/rect-toolbar.cpp:269 ../src/widgets/rect-toolbar.cpp:287
+#: ../src/widgets/rect-toolbar.cpp:268 ../src/widgets/rect-toolbar.cpp:286
#: ../src/widgets/spiral-toolbar.cpp:216 ../src/widgets/spiral-toolbar.cpp:227
#: ../src/widgets/star-toolbar.cpp:386
msgid "<b>Change:</b>"
@@ -26103,7 +26452,7 @@ msgstr "Hornið (í gråðum) frå låréttri stöðu að enda bogans"
#: ../src/widgets/arc-toolbar.cpp:358
msgid "Closed arc"
-msgstr ""
+msgstr "Lokaður bogi"
#: ../src/widgets/arc-toolbar.cpp:359
msgid "Switch to segment (closed shape with two radii)"
@@ -26111,7 +26460,7 @@ msgstr "Skipta yfir Ă­ bĂșta (lokað form með tveimur geirum)"
#: ../src/widgets/arc-toolbar.cpp:365
msgid "Open Arc"
-msgstr ""
+msgstr "Opinn bogi"
#: ../src/widgets/arc-toolbar.cpp:366
msgid "Switch to arc (unclosed shape)"
@@ -26119,7 +26468,7 @@ msgstr "Skipta yfir í boga (ólokað form)"
#: ../src/widgets/arc-toolbar.cpp:389
msgid "Make whole"
-msgstr ""
+msgstr "Gera heilt"
#: ../src/widgets/arc-toolbar.cpp:390
msgid "Make the shape a whole ellipse, not arc or segment"
@@ -26142,7 +26491,7 @@ msgstr "Horn hjĂĄlparlĂ­na Ă­ X-stefnu"
#. Translators: VP is short for 'vanishing point'
#: ../src/widgets/box3d-toolbar.cpp:326
msgid "State of VP in X direction"
-msgstr ""
+msgstr "Staða hvarfpunkts í X-stefnu"
#: ../src/widgets/box3d-toolbar.cpp:327
msgid "Toggle VP in X direction between 'finite' and 'infinite' (=parallel)"
@@ -26164,7 +26513,7 @@ msgstr "Horn hjĂĄlparlĂ­na Ă­ Y-stefnu"
#. Translators: VP is short for 'vanishing point'
#: ../src/widgets/box3d-toolbar.cpp:365
msgid "State of VP in Y direction"
-msgstr ""
+msgstr "Staða hvarfpunkts í Y-stefnu"
#: ../src/widgets/box3d-toolbar.cpp:366
msgid "Toggle VP in Y direction between 'finite' and 'infinite' (=parallel)"
@@ -26182,7 +26531,7 @@ msgstr "Horn hjĂĄlparlĂ­na Ă­ Z-stefnu"
#. Translators: VP is short for 'vanishing point'
#: ../src/widgets/box3d-toolbar.cpp:404
msgid "State of VP in Z direction"
-msgstr ""
+msgstr "Staða hvarfpunkts í Z-stefnu"
#: ../src/widgets/box3d-toolbar.cpp:405
msgid "Toggle VP in Z direction between 'finite' and 'infinite' (=parallel)"
@@ -26199,7 +26548,7 @@ msgstr "Engin forstilling"
#: ../src/widgets/calligraphy-toolbar.cpp:427
#: ../src/widgets/eraser-toolbar.cpp:125
msgid "(hairline)"
-msgstr ""
+msgstr "(hĂĄrlĂ­na)"
#. Mean
#. Rotation
@@ -26218,7 +26567,7 @@ msgstr "(sjålfgefið)"
#: ../src/widgets/calligraphy-toolbar.cpp:427
#: ../src/widgets/eraser-toolbar.cpp:125
msgid "(broad stroke)"
-msgstr ""
+msgstr "(breið ĂștlĂ­na)"
#: ../src/widgets/calligraphy-toolbar.cpp:430
#: ../src/widgets/eraser-toolbar.cpp:128
@@ -26232,11 +26581,11 @@ msgstr "Breidd skrautskriftaroddsins (miðað við sĂœnilegan myndflöt)"
#. Thinning
#: ../src/widgets/calligraphy-toolbar.cpp:444
msgid "(speed blows up stroke)"
-msgstr ""
+msgstr "(hraði sprengir upp ĂștlĂ­nu)"
#: ../src/widgets/calligraphy-toolbar.cpp:444
msgid "(slight widening)"
-msgstr ""
+msgstr "(örlítil breikkun)"
#: ../src/widgets/calligraphy-toolbar.cpp:444
msgid "(constant width)"
@@ -26248,7 +26597,7 @@ msgstr "(örlĂ­til ĂŸynning, sjĂĄlfgefið)"
#: ../src/widgets/calligraphy-toolbar.cpp:444
msgid "(speed deflates stroke)"
-msgstr ""
+msgstr "(hraði minnkar ĂștlĂ­nu)"
#: ../src/widgets/calligraphy-toolbar.cpp:447
msgid "Stroke Thinning"
@@ -26263,13 +26612,13 @@ msgid ""
"How much velocity thins the stroke (> 0 makes fast strokes thinner, < 0 "
"makes them broader, 0 makes width independent of velocity)"
msgstr ""
-"Hve mikið hraði ĂŸynnir strokuna (> 0 gerir hraðar strokur ĂŸynnri, < 0 "
-"gerir ĂŸĂŠr breiðari, 0 gerir ĂŸĂŠr Ăłhåðar hraða)"
+"Hve mikið hraði ĂŸynnir strokuna (> 0 gerir hraðar strokur ĂŸynnri, < 0 gerir "
+"ĂŸĂŠr breiðari, 0 gerir ĂŸĂŠr Ăłhåðar hraða)"
#. Angle
#: ../src/widgets/calligraphy-toolbar.cpp:460
msgid "(left edge up)"
-msgstr ""
+msgstr "(vinstri jaðar upp)"
#: ../src/widgets/calligraphy-toolbar.cpp:460
msgid "(horizontal)"
@@ -26277,7 +26626,7 @@ msgstr "(lårétt)"
#: ../src/widgets/calligraphy-toolbar.cpp:460
msgid "(right edge up)"
-msgstr ""
+msgstr "(hÊgri jaðar upp)"
#: ../src/widgets/calligraphy-toolbar.cpp:463
msgid "Pen Angle"
@@ -26321,8 +26670,7 @@ msgid ""
"Angle behavior (0 = nib always perpendicular to stroke direction, 100 = "
"fixed angle)"
msgstr ""
-"Hegðun horns (0 = oddur alltaf hornrétt å stefnu stroku, 100 = "
-"fast horn)"
+"Hegðun horns (0 = oddur alltaf hornrétt å stefnu stroku, 100 = fast horn)"
#. Cap Rounding
#: ../src/widgets/calligraphy-toolbar.cpp:494
@@ -26331,11 +26679,11 @@ msgstr "(sljóir endar, sjålfgefið)"
#: ../src/widgets/calligraphy-toolbar.cpp:494
msgid "(slightly bulging)"
-msgstr ""
+msgstr "(örlítil bunga)"
#: ../src/widgets/calligraphy-toolbar.cpp:494
msgid "(approximately round)"
-msgstr ""
+msgstr "(um ĂŸað bil rĂșnnað)"
#: ../src/widgets/calligraphy-toolbar.cpp:494
msgid "(long protruding caps)"
@@ -26343,7 +26691,7 @@ msgstr "(langir Ăștskagandi endar)"
#: ../src/widgets/calligraphy-toolbar.cpp:498
msgid "Cap rounding"
-msgstr ""
+msgstr "RĂșnnun enda"
#: ../src/widgets/calligraphy-toolbar.cpp:498
msgid "Caps:"
@@ -26359,7 +26707,7 @@ msgstr ""
#. Tremor
#: ../src/widgets/calligraphy-toolbar.cpp:511
msgid "(smooth line)"
-msgstr ""
+msgstr "(mĂœkt lĂ­na)"
#: ../src/widgets/calligraphy-toolbar.cpp:511
msgid "(slight tremor)"
@@ -26392,11 +26740,11 @@ msgstr "(ekkert vagg)"
#: ../src/widgets/calligraphy-toolbar.cpp:529
msgid "(slight deviation)"
-msgstr ""
+msgstr "(örlítið fråvik)"
#: ../src/widgets/calligraphy-toolbar.cpp:529
msgid "(wild waves and curls)"
-msgstr ""
+msgstr "(villtar bylgjur og krullur)"
#: ../src/widgets/calligraphy-toolbar.cpp:532
msgid "Pen Wiggle"
@@ -26413,19 +26761,19 @@ msgstr "Auka til að låta penna vagga og velta"
#. Mass
#: ../src/widgets/calligraphy-toolbar.cpp:546
msgid "(no inertia)"
-msgstr ""
+msgstr "(enginn skriĂ°ĂŸungi)"
#: ../src/widgets/calligraphy-toolbar.cpp:546
msgid "(slight smoothing, default)"
-msgstr ""
+msgstr "(örlĂ­til mĂœking, sjĂĄlfgefið)"
#: ../src/widgets/calligraphy-toolbar.cpp:546
msgid "(noticeable lagging)"
-msgstr ""
+msgstr "(sjĂĄanlegur drĂĄttur)"
#: ../src/widgets/calligraphy-toolbar.cpp:546
msgid "(maximum inertia)"
-msgstr ""
+msgstr "(hĂĄmarks skriĂ°ĂŸungi)"
#: ../src/widgets/calligraphy-toolbar.cpp:549
msgid "Pen Mass"
@@ -26470,11 +26818,11 @@ msgstr "Veldu forstillingu"
#: ../src/widgets/calligraphy-toolbar.cpp:622
msgid "Add/Edit Profile"
-msgstr ""
+msgstr "BÊta við eða breyta sniði"
#: ../src/widgets/calligraphy-toolbar.cpp:623
msgid "Add or edit calligraphic profile"
-msgstr ""
+msgstr "BÊta við eða breyta skrautskriftarsniði"
#: ../src/widgets/connector-toolbar.cpp:120
msgid "Set connector type: orthogonal"
@@ -26535,7 +26883,7 @@ msgstr ""
#: ../src/widgets/connector-toolbar.cpp:372
msgid "Graph"
-msgstr ""
+msgstr "Graf"
#: ../src/widgets/connector-toolbar.cpp:382
msgid "Connector Length"
@@ -26571,7 +26919,7 @@ msgstr "Hliðrun mynsturs"
#: ../src/widgets/desktop-widget.cpp:466
msgid "Zoom drawing if window size changes"
-msgstr ""
+msgstr "Breyta aðdrĂŠtti myndar ĂŸegar stĂŠrð glugga breytist"
#: ../src/widgets/desktop-widget.cpp:665
msgid "Cursor coordinates"
@@ -26660,6 +27008,10 @@ msgid ""
"\n"
"If you close without saving, your changes will be discarded."
msgstr ""
+"<span weight=\"bold\" size=\"larger\">Viltu vista breytingar ĂĄ skjalinu \"%s"
+"\" åður en ĂŸĂș lokar ĂŸvĂ­?</span>\n"
+"\n"
+"Ef ĂŸĂș lokar ĂĄn ĂŸess að vista, munu breytingar sem ĂŸĂș gerðir tapast."
#: ../src/widgets/desktop-widget.cpp:1118
#: ../src/widgets/desktop-widget.cpp:1177
@@ -26674,6 +27026,10 @@ msgid ""
"\n"
"Do you want to save this file as Inkscape SVG?"
msgstr ""
+"<span weight=\"bold\" size=\"larger\">Skråin \"%s\" var vistuð å skråasniði "
+"sem gÊti valdið gagnatapi!</span>\n"
+"\n"
+"Viltu vista ĂŸessa skrĂĄ sem Inkscape SVG?"
#: ../src/widgets/desktop-widget.cpp:1179
msgid "_Save as Inkscape SVG"
@@ -26685,7 +27041,7 @@ msgstr "Athugið:"
#: ../src/widgets/dropper-toolbar.cpp:90
msgid "Pick opacity"
-msgstr ""
+msgstr "Plokka ĂłgegnsĂŠi"
#: ../src/widgets/dropper-toolbar.cpp:91
msgid ""
@@ -26740,7 +27096,7 @@ msgstr "Setja fyllingu"
#: ../src/widgets/fill-style.cpp:445 ../src/widgets/fill-style.cpp:524
msgid "Set stroke color"
-msgstr ""
+msgstr "Setja ĂștlĂ­nulit"
#: ../src/widgets/fill-style.cpp:622
msgid "Set gradient on fill"
@@ -26748,7 +27104,7 @@ msgstr "Setja litstigul Ă­ fyllingu"
#: ../src/widgets/fill-style.cpp:622
msgid "Set gradient on stroke"
-msgstr ""
+msgstr "Setja litstigul Ă­ ĂștlĂ­nu"
#: ../src/widgets/fill-style.cpp:682
msgid "Set pattern on fill"
@@ -26782,129 +27138,129 @@ msgstr "Leturgerð"
msgid "Font size:"
msgstr "LeturstÊrð:"
-#: ../src/widgets/gradient-selector.cpp:196
+#: ../src/widgets/gradient-selector.cpp:201
msgid "Create a duplicate gradient"
-msgstr ""
+msgstr "BĂșa til tvĂ­tekningu litstiguls"
#: ../src/widgets/gradient-selector.cpp:212
msgid "Edit gradient"
msgstr "Breyta litstigli"
-#: ../src/widgets/gradient-selector.cpp:288
+#: ../src/widgets/gradient-selector.cpp:281
#: ../src/widgets/paint-selector.cpp:236
msgid "Swatch"
msgstr "Litaprufa"
-#: ../src/widgets/gradient-selector.cpp:338
+#: ../src/widgets/gradient-selector.cpp:331
msgid "Rename gradient"
-msgstr ""
+msgstr "Endurnefna litstigul"
#: ../src/widgets/gradient-toolbar.cpp:156
#: ../src/widgets/gradient-toolbar.cpp:169
-#: ../src/widgets/gradient-toolbar.cpp:756
-#: ../src/widgets/gradient-toolbar.cpp:1094
+#: ../src/widgets/gradient-toolbar.cpp:758
+#: ../src/widgets/gradient-toolbar.cpp:1097
msgid "No gradient"
msgstr "Engir litstiglar"
-#: ../src/widgets/gradient-toolbar.cpp:175
+#: ../src/widgets/gradient-toolbar.cpp:176
msgid "Multiple gradients"
msgstr "Margir litstiglar"
-#: ../src/widgets/gradient-toolbar.cpp:676
+#: ../src/widgets/gradient-toolbar.cpp:678
msgid "Multiple stops"
msgstr "Mörg stoppmerki"
-#: ../src/widgets/gradient-toolbar.cpp:774
+#: ../src/widgets/gradient-toolbar.cpp:776
#: ../src/widgets/gradient-vector.cpp:609
msgid "No stops in gradient"
msgstr "Engin stoppmerki Ă­ litstigli"
-#: ../src/widgets/gradient-toolbar.cpp:927
+#: ../src/widgets/gradient-toolbar.cpp:930
msgid "Assign gradient to object"
-msgstr ""
+msgstr "Úthluta litstigli á hlut"
-#: ../src/widgets/gradient-toolbar.cpp:949
+#: ../src/widgets/gradient-toolbar.cpp:952
msgid "Set gradient repeat"
-msgstr ""
+msgstr "Setja endurtekningu litstiguls"
-#: ../src/widgets/gradient-toolbar.cpp:987
+#: ../src/widgets/gradient-toolbar.cpp:990
#: ../src/widgets/gradient-vector.cpp:720
msgid "Change gradient stop offset"
-msgstr ""
+msgstr "Breyta hliðrun å stoppmerki litstiguls"
-#: ../src/widgets/gradient-toolbar.cpp:1034
+#: ../src/widgets/gradient-toolbar.cpp:1037
msgid "linear"
msgstr "lĂ­nulegt"
-#: ../src/widgets/gradient-toolbar.cpp:1034
+#: ../src/widgets/gradient-toolbar.cpp:1037
msgid "Create linear gradient"
msgstr "BĂșa til lĂ­nulegan litstigul"
-#: ../src/widgets/gradient-toolbar.cpp:1038
+#: ../src/widgets/gradient-toolbar.cpp:1041
msgid "radial"
msgstr "frå miðju"
-#: ../src/widgets/gradient-toolbar.cpp:1038
+#: ../src/widgets/gradient-toolbar.cpp:1041
msgid "Create radial (elliptic or circular) gradient"
msgstr "BĂșa til hringlaga (sporaskja eða geisli) litstigul"
-#: ../src/widgets/gradient-toolbar.cpp:1041
-#: ../src/widgets/mesh-toolbar.cpp:207
+#: ../src/widgets/gradient-toolbar.cpp:1044
+#: ../src/widgets/mesh-toolbar.cpp:341
msgid "New:"
msgstr "NĂœtt:"
-#: ../src/widgets/gradient-toolbar.cpp:1064
-#: ../src/widgets/mesh-toolbar.cpp:230
+#: ../src/widgets/gradient-toolbar.cpp:1067
+#: ../src/widgets/mesh-toolbar.cpp:364
msgid "fill"
msgstr "fylling"
-#: ../src/widgets/gradient-toolbar.cpp:1064
-#: ../src/widgets/mesh-toolbar.cpp:230
+#: ../src/widgets/gradient-toolbar.cpp:1067
+#: ../src/widgets/mesh-toolbar.cpp:364
msgid "Create gradient in the fill"
msgstr "BĂșa til litstigul Ă­ fyllingu"
-#: ../src/widgets/gradient-toolbar.cpp:1068
-#: ../src/widgets/mesh-toolbar.cpp:234
+#: ../src/widgets/gradient-toolbar.cpp:1071
+#: ../src/widgets/mesh-toolbar.cpp:368
msgid "stroke"
msgstr "ĂștlĂ­na"
-#: ../src/widgets/gradient-toolbar.cpp:1068
-#: ../src/widgets/mesh-toolbar.cpp:234
+#: ../src/widgets/gradient-toolbar.cpp:1071
+#: ../src/widgets/mesh-toolbar.cpp:368
msgid "Create gradient in the stroke"
msgstr "BĂșa til litstigul Ă­ ĂștlĂ­nu"
-#: ../src/widgets/gradient-toolbar.cpp:1071
-#: ../src/widgets/mesh-toolbar.cpp:237
+#: ../src/widgets/gradient-toolbar.cpp:1074
+#: ../src/widgets/mesh-toolbar.cpp:371
msgid "on:"
msgstr "ĂĄ:"
-#: ../src/widgets/gradient-toolbar.cpp:1096
+#: ../src/widgets/gradient-toolbar.cpp:1099
msgid "Select"
msgstr "Velja"
-#: ../src/widgets/gradient-toolbar.cpp:1096
+#: ../src/widgets/gradient-toolbar.cpp:1099
msgid "Choose a gradient"
msgstr "Veldu litstigul"
-#: ../src/widgets/gradient-toolbar.cpp:1097
+#: ../src/widgets/gradient-toolbar.cpp:1100
msgid "Select:"
msgstr "Velja:"
-#: ../src/widgets/gradient-toolbar.cpp:1112
+#: ../src/widgets/gradient-toolbar.cpp:1115
msgctxt "Gradient repeat type"
msgid "None"
msgstr "Ekkert"
-#: ../src/widgets/gradient-toolbar.cpp:1118
+#: ../src/widgets/gradient-toolbar.cpp:1121
msgid "Direct"
msgstr "Beint"
-#: ../src/widgets/gradient-toolbar.cpp:1120
+#: ../src/widgets/gradient-toolbar.cpp:1123
msgid "Repeat"
msgstr "Endurtaka"
#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/pservers.html#LinearGradientSpreadMethodAttribute
-#: ../src/widgets/gradient-toolbar.cpp:1122
+#: ../src/widgets/gradient-toolbar.cpp:1125
msgid ""
"Whether to fill with flat color beyond the ends of the gradient vector "
"(spreadMethod=\"pad\"), or repeat the gradient in the same direction "
@@ -26912,59 +27268,59 @@ msgid ""
"directions (spreadMethod=\"reflect\")"
msgstr ""
-#: ../src/widgets/gradient-toolbar.cpp:1127
+#: ../src/widgets/gradient-toolbar.cpp:1130
msgid "Repeat:"
msgstr "Endurtaka:"
-#: ../src/widgets/gradient-toolbar.cpp:1141
+#: ../src/widgets/gradient-toolbar.cpp:1144
msgid "No stops"
msgstr "Engin stoppmerki"
-#: ../src/widgets/gradient-toolbar.cpp:1143
+#: ../src/widgets/gradient-toolbar.cpp:1146
msgid "Stops"
msgstr "Stoppmerki"
-#: ../src/widgets/gradient-toolbar.cpp:1143
+#: ../src/widgets/gradient-toolbar.cpp:1146
msgid "Select a stop for the current gradient"
msgstr "Veldu stoppmerki fyrir ĂŸennan litstigul"
-#: ../src/widgets/gradient-toolbar.cpp:1144
+#: ../src/widgets/gradient-toolbar.cpp:1147
msgid "Stops:"
msgstr "Stoppmerki:"
#. Label
-#: ../src/widgets/gradient-toolbar.cpp:1156
+#: ../src/widgets/gradient-toolbar.cpp:1159
#: ../src/widgets/gradient-vector.cpp:906
msgctxt "Gradient"
msgid "Offset:"
msgstr "Hliðrun:"
-#: ../src/widgets/gradient-toolbar.cpp:1156
+#: ../src/widgets/gradient-toolbar.cpp:1159
msgid "Offset of selected stop"
msgstr "Hliðrun å völdu stoppmerki"
-#: ../src/widgets/gradient-toolbar.cpp:1174
-#: ../src/widgets/gradient-toolbar.cpp:1175
+#: ../src/widgets/gradient-toolbar.cpp:1177
+#: ../src/widgets/gradient-toolbar.cpp:1178
msgid "Insert new stop"
msgstr "Setja inn nĂœtt stoppmerki"
-#: ../src/widgets/gradient-toolbar.cpp:1188
-#: ../src/widgets/gradient-toolbar.cpp:1189
+#: ../src/widgets/gradient-toolbar.cpp:1191
+#: ../src/widgets/gradient-toolbar.cpp:1192
#: ../src/widgets/gradient-vector.cpp:888
msgid "Delete stop"
msgstr "Eyða stoppmerki"
-#: ../src/widgets/gradient-toolbar.cpp:1203
+#: ../src/widgets/gradient-toolbar.cpp:1206
msgid "Reverse the direction of the gradient"
-msgstr ""
+msgstr "SnĂșa við stefnu litstiguls"
-#: ../src/widgets/gradient-toolbar.cpp:1217
+#: ../src/widgets/gradient-toolbar.cpp:1220
msgid "Link gradients"
-msgstr ""
+msgstr "Tengja litstigla"
-#: ../src/widgets/gradient-toolbar.cpp:1218
+#: ../src/widgets/gradient-toolbar.cpp:1221
msgid "Link gradients to change all related gradients"
-msgstr ""
+msgstr "Tengja litstigla ĂŸannig að hĂŠgt sĂ© að breyta öllum tengdum litstiglum"
#: ../src/widgets/gradient-vector.cpp:312
#: ../src/widgets/paint-selector.cpp:947
@@ -26987,11 +27343,11 @@ msgstr "BÊta við stoppmerki"
#: ../src/widgets/gradient-vector.cpp:886
msgid "Add another control stop to gradient"
-msgstr ""
+msgstr "BÊta við öðru stoppmerki í litstigul"
#: ../src/widgets/gradient-vector.cpp:891
msgid "Delete current control stop from gradient"
-msgstr ""
+msgstr "Eyða ĂŸessu stoppmerki Ășr litstigli"
#. TRANSLATORS: "Stop" means: a "phase" of a gradient
#: ../src/widgets/gradient-vector.cpp:959
@@ -27004,7 +27360,7 @@ msgstr "Litstiglaritill"
#: ../src/widgets/gradient-vector.cpp:1324
msgid "Change gradient stop color"
-msgstr ""
+msgstr "Breyta stopplit litstiguls"
#: ../src/widgets/lpe-toolbar.cpp:233
msgid "Closed"
@@ -27032,11 +27388,11 @@ msgstr ""
#: ../src/widgets/lpe-toolbar.cpp:335
msgid "Show limiting bounding box"
-msgstr ""
+msgstr "SĂœna takmarkandi umgjörð"
#: ../src/widgets/lpe-toolbar.cpp:336
msgid "Show bounding box (used to cut infinite lines)"
-msgstr ""
+msgstr "SĂœna umgjörð (notað til að skera Ăłendanlegar lĂ­nur)"
#: ../src/widgets/lpe-toolbar.cpp:347
msgid "Get limiting bounding box from selection"
@@ -27054,26 +27410,26 @@ msgstr "Veldu gerð lĂ­nubĂșts"
#: ../src/widgets/lpe-toolbar.cpp:376
msgid "Display measuring info"
-msgstr ""
+msgstr "Birta mĂŠlingaupplĂœsingar"
#: ../src/widgets/lpe-toolbar.cpp:377
msgid "Display measuring info for selected items"
-msgstr ""
+msgstr "Birta mĂŠlingaupplĂœsingar fyrir valda hluti"
#. Add the units menu.
#: ../src/widgets/lpe-toolbar.cpp:387 ../src/widgets/node-toolbar.cpp:613
#: ../src/widgets/paintbucket-toolbar.cpp:168
-#: ../src/widgets/rect-toolbar.cpp:379 ../src/widgets/select-toolbar.cpp:538
+#: ../src/widgets/rect-toolbar.cpp:378 ../src/widgets/select-toolbar.cpp:538
msgid "Units"
msgstr "Einingar"
#: ../src/widgets/lpe-toolbar.cpp:397
msgid "Open LPE dialog"
-msgstr ""
+msgstr "Opna LPE glugga"
#: ../src/widgets/lpe-toolbar.cpp:398
msgid "Open LPE dialog (to adapt parameters numerically)"
-msgstr ""
+msgstr "Opna LPE glugga (til að setja inn tölulegar stÊrðir)"
#: ../src/widgets/measure-toolbar.cpp:86 ../src/widgets/text-toolbar.cpp:1262
msgid "Font Size"
@@ -27085,80 +27441,109 @@ msgstr "LeturstÊrð:"
#: ../src/widgets/measure-toolbar.cpp:87
msgid "The font size to be used in the measurement labels"
-msgstr ""
+msgstr "LeturstÊrð sem å að nota í målsetningum"
#: ../src/widgets/measure-toolbar.cpp:99
#: ../src/widgets/measure-toolbar.cpp:107
msgid "The units to be used for the measurements"
-msgstr ""
+msgstr "Einingar sem å að nota í målsetningum"
-#: ../src/widgets/mesh-toolbar.cpp:200
+#: ../src/widgets/mesh-toolbar.cpp:311
+msgid "Set mesh type"
+msgstr "Settu gerð möskva"
+
+#: ../src/widgets/mesh-toolbar.cpp:334
msgid "normal"
msgstr "venjulegt"
-#: ../src/widgets/mesh-toolbar.cpp:200
+#: ../src/widgets/mesh-toolbar.cpp:334
msgid "Create mesh gradient"
-msgstr ""
+msgstr "BĂșa til litstigul möskva"
-#: ../src/widgets/mesh-toolbar.cpp:204
+#: ../src/widgets/mesh-toolbar.cpp:338
msgid "conical"
msgstr "keilulaga"
-#: ../src/widgets/mesh-toolbar.cpp:204
+#: ../src/widgets/mesh-toolbar.cpp:338
msgid "Create conical gradient"
-msgstr ""
+msgstr "BĂșa til keilulaga litstigul"
-#: ../src/widgets/mesh-toolbar.cpp:259
+#: ../src/widgets/mesh-toolbar.cpp:393
msgid "Rows"
msgstr "Raðir"
-#: ../src/widgets/mesh-toolbar.cpp:259
+#: ../src/widgets/mesh-toolbar.cpp:393
#: ../share/extensions/guides_creator.inx.h:5
#: ../share/extensions/layout_nup.inx.h:12
msgid "Rows:"
msgstr "Raðir:"
-#: ../src/widgets/mesh-toolbar.cpp:259
+#: ../src/widgets/mesh-toolbar.cpp:393
msgid "Number of rows in new mesh"
-msgstr ""
+msgstr "Fjöldi raða Ă­ nĂœju möskvaneti"
-#: ../src/widgets/mesh-toolbar.cpp:275
+#: ../src/widgets/mesh-toolbar.cpp:409
msgid "Columns"
msgstr "DĂĄlkar"
-#: ../src/widgets/mesh-toolbar.cpp:275
+#: ../src/widgets/mesh-toolbar.cpp:409
#: ../share/extensions/guides_creator.inx.h:4
msgid "Columns:"
msgstr "DĂĄlkar:"
-#: ../src/widgets/mesh-toolbar.cpp:275
+#: ../src/widgets/mesh-toolbar.cpp:409
msgid "Number of columns in new mesh"
-msgstr ""
+msgstr "Fjöldi dĂĄlka Ă­ nĂœju möskvaneti"
-#: ../src/widgets/mesh-toolbar.cpp:289
+#: ../src/widgets/mesh-toolbar.cpp:423
msgid "Edit Fill"
msgstr "Breyta fyllingu"
-#: ../src/widgets/mesh-toolbar.cpp:290
+#: ../src/widgets/mesh-toolbar.cpp:424
msgid "Edit fill mesh"
-msgstr ""
+msgstr "Breyta möskvafyllingu"
-#: ../src/widgets/mesh-toolbar.cpp:301
+#: ../src/widgets/mesh-toolbar.cpp:435
msgid "Edit Stroke"
msgstr "Breyta ĂștlĂ­nu"
-#: ../src/widgets/mesh-toolbar.cpp:302
+#: ../src/widgets/mesh-toolbar.cpp:436
msgid "Edit stroke mesh"
-msgstr ""
+msgstr "Breyta möskvaĂștlĂ­nu"
-#: ../src/widgets/mesh-toolbar.cpp:313 ../src/widgets/node-toolbar.cpp:521
+#: ../src/widgets/mesh-toolbar.cpp:447 ../src/widgets/node-toolbar.cpp:521
msgid "Show Handles"
msgstr "SĂœna haldföng"
-#: ../src/widgets/mesh-toolbar.cpp:314
+#: ../src/widgets/mesh-toolbar.cpp:448
msgid "Show side and tensor handles"
+msgstr "SĂœna haldföng hliða og strekkjara"
+
+#: ../src/widgets/mesh-toolbar.cpp:463
+msgid "WARNING: Mesh SVG Syntax Subject to Change"
+msgstr "AÐVÖRUN: SVG möskvaframsetning (Mesh SVG Syntax) gĂŠti breyst"
+
+#: ../src/widgets/mesh-toolbar.cpp:473
+msgctxt "Type"
+msgid "Coons"
+msgstr ""
+
+#: ../src/widgets/mesh-toolbar.cpp:476
+msgid "Bicubic"
+msgstr "BĂœkĂșpu"
+
+#: ../src/widgets/mesh-toolbar.cpp:478
+msgid "Coons"
+msgstr ""
+
+#: ../src/widgets/mesh-toolbar.cpp:479
+msgid "Coons: no smoothing. Bicubic: smoothing across patch boundaries."
msgstr ""
+#: ../src/widgets/mesh-toolbar.cpp:481 ../src/widgets/pencil-toolbar.cpp:278
+msgid "Smoothing:"
+msgstr "MĂœking:"
+
#: ../src/widgets/node-toolbar.cpp:341
msgid "Insert node"
msgstr "Setja inn hnĂșt"
@@ -27369,11 +27754,11 @@ msgstr "Hringlaga litstigull"
#: ../src/widgets/paint-selector.cpp:231
msgid "Mesh gradient"
-msgstr ""
+msgstr "Litstigull möskva"
#: ../src/widgets/paint-selector.cpp:238
msgid "Unset paint (make it undefined so it can be inherited)"
-msgstr ""
+msgstr "Afstilla lit (gera hann Ăłskilgreindan svo hann geti erfst)"
#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty
#: ../src/widgets/paint-selector.cpp:255
@@ -27381,12 +27766,15 @@ msgid ""
"Any path self-intersections or subpaths create holes in the fill (fill-rule: "
"evenodd)"
msgstr ""
+"Allar skaranir ferils við sjålfan sig eða undirferlar munu gera holu í "
+"fyllingu (fylliregla: sléttodda)"
#. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty
#: ../src/widgets/paint-selector.cpp:266
msgid ""
"Fill is solid unless a subpath is counterdirectional (fill-rule: nonzero)"
msgstr ""
+"Fylling er gegnheil nema ef undirferill er gagnstÊður (fylliregla: ekkinĂșll)"
#: ../src/widgets/paint-selector.cpp:600
msgid "<b>No objects</b>"
@@ -27419,7 +27807,7 @@ msgstr "<b>Hringlaga litstigull</b>"
#: ../src/widgets/paint-selector.cpp:781
msgid "<b>Mesh gradient</b>"
-msgstr ""
+msgstr "<b>Litstigull möskva</b>"
#: ../src/widgets/paint-selector.cpp:1080
msgid ""
@@ -27453,8 +27841,8 @@ msgid ""
"The maximum allowed difference between the clicked pixel and the neighboring "
"pixels to be counted in the fill"
msgstr ""
-"Håmark leyfðs mismunar milli mynddíls sem smellt er å og någrannadílanna, svo "
-"ĂŸeir sĂ©u taldir með Ă­ fyllingunni"
+"Håmark leyfðs mismunar milli mynddíls sem smellt er å og någrannadílanna, "
+"svo ĂŸeir sĂ©u taldir með Ă­ fyllingunni"
#: ../src/widgets/paintbucket-toolbar.cpp:176
msgid "Grow/shrink by"
@@ -27468,7 +27856,8 @@ msgstr "Vaxa/minnka um:"
msgid ""
"The amount to grow (positive) or shrink (negative) the created fill path"
msgstr ""
-"Magnið sem fyllti ferillinn getur vaxið um (jåkvÊtt) eða minnkað um (neikvÊtt)"
+"Magnið sem fyllti ferillinn getur vaxið um (jåkvÊtt) eða minnkað um "
+"(neikvĂŠtt)"
#: ../src/widgets/paintbucket-toolbar.cpp:202
msgid "Close gaps"
@@ -27563,15 +27952,11 @@ msgstr "(margir hnĂștar, grĂłft)"
#: ../src/widgets/pencil-toolbar.cpp:275
msgid "(few nodes, smooth)"
-msgstr ""
-
-#: ../src/widgets/pencil-toolbar.cpp:278
-msgid "Smoothing:"
-msgstr "MĂœking:"
+msgstr "(fĂĄir hnĂștar, mjĂșkt)"
#: ../src/widgets/pencil-toolbar.cpp:278
msgid "Smoothing: "
-msgstr "MĂœking:"
+msgstr "MĂœking: "
#: ../src/widgets/pencil-toolbar.cpp:279
msgid "How much smoothing (simplifying) is applied to the line"
@@ -27589,91 +27974,91 @@ msgstr ""
msgid "Change rectangle"
msgstr "Breyta rétthyrning"
-#: ../src/widgets/rect-toolbar.cpp:318
+#: ../src/widgets/rect-toolbar.cpp:317
msgid "W:"
msgstr "B:"
-#: ../src/widgets/rect-toolbar.cpp:318
+#: ../src/widgets/rect-toolbar.cpp:317
msgid "Width of rectangle"
msgstr "Breidd rétthyrnings"
-#: ../src/widgets/rect-toolbar.cpp:335
+#: ../src/widgets/rect-toolbar.cpp:334
msgid "H:"
msgstr "H:"
-#: ../src/widgets/rect-toolbar.cpp:335
+#: ../src/widgets/rect-toolbar.cpp:334
msgid "Height of rectangle"
msgstr "HÊð rétthyrnings"
-#: ../src/widgets/rect-toolbar.cpp:349 ../src/widgets/rect-toolbar.cpp:364
+#: ../src/widgets/rect-toolbar.cpp:348 ../src/widgets/rect-toolbar.cpp:363
msgid "not rounded"
msgstr "ekki rĂșnnað"
-#: ../src/widgets/rect-toolbar.cpp:352
+#: ../src/widgets/rect-toolbar.cpp:351
msgid "Horizontal radius"
msgstr ""
-#: ../src/widgets/rect-toolbar.cpp:352
+#: ../src/widgets/rect-toolbar.cpp:351
msgid "Rx:"
msgstr "Rx:"
-#: ../src/widgets/rect-toolbar.cpp:352
+#: ../src/widgets/rect-toolbar.cpp:351
msgid "Horizontal radius of rounded corners"
msgstr "LĂĄrĂ©ttur radĂ­us rĂșnnaðra horna"
-#: ../src/widgets/rect-toolbar.cpp:367
+#: ../src/widgets/rect-toolbar.cpp:366
msgid "Vertical radius"
msgstr ""
-#: ../src/widgets/rect-toolbar.cpp:367
+#: ../src/widgets/rect-toolbar.cpp:366
msgid "Ry:"
msgstr "Ry:"
-#: ../src/widgets/rect-toolbar.cpp:367
+#: ../src/widgets/rect-toolbar.cpp:366
msgid "Vertical radius of rounded corners"
msgstr "LóðrĂ©ttur radĂ­us rĂșnnaðra horna"
-#: ../src/widgets/rect-toolbar.cpp:386
+#: ../src/widgets/rect-toolbar.cpp:385
msgid "Not rounded"
msgstr "Ekki rĂșnnað"
-#: ../src/widgets/rect-toolbar.cpp:387
+#: ../src/widgets/rect-toolbar.cpp:386
msgid "Make corners sharp"
msgstr "Gera horn hvöss"
-#: ../src/widgets/ruler.cpp:192
+#: ../src/widgets/ruler.cpp:193
msgid "The orientation of the ruler"
msgstr "Stefna mĂŠlistikunnar"
-#: ../src/widgets/ruler.cpp:202
+#: ../src/widgets/ruler.cpp:203
msgid "Unit of the ruler"
msgstr "Einingar mĂŠlistikunnar"
-#: ../src/widgets/ruler.cpp:209
+#: ../src/widgets/ruler.cpp:210
msgid "Lower"
msgstr "Neðri"
-#: ../src/widgets/ruler.cpp:210
+#: ../src/widgets/ruler.cpp:211
msgid "Lower limit of ruler"
msgstr "Neðri mörk mÊlistiku"
-#: ../src/widgets/ruler.cpp:219
+#: ../src/widgets/ruler.cpp:220
msgid "Upper"
msgstr "Efri"
-#: ../src/widgets/ruler.cpp:220
+#: ../src/widgets/ruler.cpp:221
msgid "Upper limit of ruler"
msgstr "Efri mörk mÊlistiku"
-#: ../src/widgets/ruler.cpp:230
+#: ../src/widgets/ruler.cpp:231
msgid "Position of mark on the ruler"
msgstr "Staða merkis å mÊlistikunni"
-#: ../src/widgets/ruler.cpp:239
+#: ../src/widgets/ruler.cpp:240
msgid "Max Size"
msgstr "HåmarksstÊrð"
-#: ../src/widgets/ruler.cpp:240
+#: ../src/widgets/ruler.cpp:241
msgid "Maximum size of the ruler"
msgstr "Mesta stÊrð mÊlistikunnar"
@@ -27881,7 +28266,7 @@ msgstr "Laga"
#: ../src/widgets/sp-color-icc-selector.cpp:433
msgid "Fix RGB fallback to match icc-color() value."
-msgstr "Laga varaleið samsvörunar RGB við ICC-litgildi (icc-color() )"
+msgstr "Laga varaleið samsvörunar RGB við ICC-litgildi [icc-color()]."
#. Label
#: ../src/widgets/sp-color-icc-selector.cpp:536
@@ -27948,7 +28333,7 @@ msgstr "Gildi"
#: ../src/widgets/sp-xmlview-content.cpp:151
msgid "Type text in a text node"
-msgstr ""
+msgstr "Settu inn texta ĂĄ textahnĂșt"
#: ../src/widgets/spiral-toolbar.cpp:100
msgid "Change spiral"
@@ -28039,8 +28424,8 @@ msgid ""
"Reset shape parameters to defaults (use Inkscape Preferences > Tools to "
"change defaults)"
msgstr ""
-"Frumstilla formstillingar å sjålfgefin gildi (notaðu Kjörstillingar Inkscape >"
-" VerkfÊri til að breyta sjålfgefnu gildunum)"
+"Frumstilla formstillingar å sjålfgefin gildi (notaðu Kjörstillingar Inkscape "
+"> VerkfÊri til að breyta sjålfgefnu gildunum)"
#. Width
#: ../src/widgets/spray-toolbar.cpp:113
@@ -28383,7 +28768,7 @@ msgstr "Hornskeyting"
#: ../src/widgets/stroke-style.cpp:280
msgid "Miter _limit:"
-msgstr "Mörk hornskeytingar:"
+msgstr "Mörk _hornskeytingar:"
#. Cap type
#. TRANSLATORS: cap type specifies the shape for the ends of lines
@@ -28424,17 +28809,19 @@ msgstr ""
#: ../src/widgets/stroke-style.cpp:358
msgid "Start Markers are drawn on the first node of a path or shape"
-msgstr ""
+msgstr "Upphafsmerki eru teiknuð ĂĄ fyrsta hnĂșt ferils eða forms"
#: ../src/widgets/stroke-style.cpp:367
msgid ""
"Mid Markers are drawn on every node of a path or shape except the first and "
"last nodes"
msgstr ""
+"Miðjuamerki eru teiknuð ĂĄ alla hnĂșta ferils eða forms nema ĂŸann fyrsta og "
+"ĂŸann síðasta"
#: ../src/widgets/stroke-style.cpp:376
msgid "End Markers are drawn on the last node of a path or shape"
-msgstr ""
+msgstr "Endamerki eru teiknuð ĂĄ síðasta hnĂșt ferils eða forms"
#: ../src/widgets/stroke-style.cpp:494
msgid "Set markers"
@@ -28466,39 +28853,39 @@ msgstr "Texti: Breyta leturstĂ­l"
#: ../src/widgets/text-toolbar.cpp:347
msgid "Text: Change superscript or subscript"
-msgstr ""
+msgstr "Texti: Breyta Ă­ hĂĄletur/lĂĄgletur"
#: ../src/widgets/text-toolbar.cpp:489
msgid "Text: Change alignment"
-msgstr ""
+msgstr "Texti: Breyta jöfnun"
#: ../src/widgets/text-toolbar.cpp:532
msgid "Text: Change line-height"
-msgstr ""
+msgstr "Texti: Breyta hÊð línu"
#: ../src/widgets/text-toolbar.cpp:580
msgid "Text: Change word-spacing"
-msgstr ""
+msgstr "Texti: Breyta orðabili"
#: ../src/widgets/text-toolbar.cpp:620
msgid "Text: Change letter-spacing"
-msgstr ""
+msgstr "Texti: Breyta stafabili"
#: ../src/widgets/text-toolbar.cpp:658
msgid "Text: Change dx (kern)"
-msgstr ""
+msgstr "Texti: Breyta dx (hnikun)"
#: ../src/widgets/text-toolbar.cpp:692
msgid "Text: Change dy"
-msgstr ""
+msgstr "Texti: Breyta dy (hnikun)"
#: ../src/widgets/text-toolbar.cpp:727
msgid "Text: Change rotate"
-msgstr ""
+msgstr "Texti: Breyta snĂșningi"
#: ../src/widgets/text-toolbar.cpp:774
msgid "Text: Change orientation"
-msgstr ""
+msgstr "Texti: Breyta stefnu"
#: ../src/widgets/text-toolbar.cpp:1210
msgid "Font Family"
@@ -28665,7 +29052,7 @@ msgstr "Lóðrétt hliðrun"
#. label
#: ../src/widgets/text-toolbar.cpp:1559
msgid "Vert:"
-msgstr ""
+msgstr "Lóðr:"
#. short label
#: ../src/widgets/text-toolbar.cpp:1560
@@ -28729,133 +29116,135 @@ msgstr ""
#: ../src/widgets/toolbox.cpp:219
msgid "Style of Paint Bucket fill objects"
-msgstr ""
+msgstr "Stíll fötyfyllingarhluta"
-#: ../src/widgets/toolbox.cpp:1681
+#: ../src/widgets/toolbox.cpp:1683
msgid "Bounding box"
msgstr "Umgjörð"
-#: ../src/widgets/toolbox.cpp:1681
+#: ../src/widgets/toolbox.cpp:1683
msgid "Snap bounding boxes"
msgstr "Grípa í umgjarðir"
-#: ../src/widgets/toolbox.cpp:1690
+#: ../src/widgets/toolbox.cpp:1692
msgid "Bounding box edges"
msgstr "Hliðar umgjarða"
-#: ../src/widgets/toolbox.cpp:1690
+#: ../src/widgets/toolbox.cpp:1692
msgid "Snap to edges of a bounding box"
msgstr "Grípa í hliðar umgjarðar"
-#: ../src/widgets/toolbox.cpp:1699
+#: ../src/widgets/toolbox.cpp:1701
msgid "Bounding box corners"
msgstr "Horn umgjarðar"
-#: ../src/widgets/toolbox.cpp:1699
+#: ../src/widgets/toolbox.cpp:1701
msgid "Snap bounding box corners"
msgstr "Grípa í horn umgjarðar"
-#: ../src/widgets/toolbox.cpp:1708
+#: ../src/widgets/toolbox.cpp:1710
msgid "BBox Edge Midpoints"
msgstr "Miðpunktar å hliðum umgjarðar"
-#: ../src/widgets/toolbox.cpp:1708
+#: ../src/widgets/toolbox.cpp:1710
msgid "Snap midpoints of bounding box edges"
msgstr "Grípa í miðpunkta å hliðum umgjarðar"
-#: ../src/widgets/toolbox.cpp:1718
+#: ../src/widgets/toolbox.cpp:1720
msgid "BBox Centers"
msgstr "Miðjur umgjarða"
-#: ../src/widgets/toolbox.cpp:1718
+#: ../src/widgets/toolbox.cpp:1720
msgid "Snapping centers of bounding boxes"
msgstr "Grípa í miðjur umgjarða"
-#: ../src/widgets/toolbox.cpp:1727
+#: ../src/widgets/toolbox.cpp:1729
msgid "Snap nodes, paths, and handles"
msgstr "GrĂ­pa Ă­ hnĂșta, ferla og haldföng"
-#: ../src/widgets/toolbox.cpp:1735
+#: ../src/widgets/toolbox.cpp:1737
msgid "Snap to paths"
msgstr "GrĂ­pa Ă­ ferla"
-#: ../src/widgets/toolbox.cpp:1744
+#: ../src/widgets/toolbox.cpp:1746
msgid "Path intersections"
msgstr "Skaranir ferla"
-#: ../src/widgets/toolbox.cpp:1744
+#: ../src/widgets/toolbox.cpp:1746
msgid "Snap to path intersections"
msgstr "GrĂ­pa Ă­ skaranir ferla"
-#: ../src/widgets/toolbox.cpp:1753
+#: ../src/widgets/toolbox.cpp:1755
msgid "To nodes"
msgstr "Í hnĂșta"
-#: ../src/widgets/toolbox.cpp:1753
+#: ../src/widgets/toolbox.cpp:1755
msgid "Snap cusp nodes, incl. rectangle corners"
msgstr ""
-#: ../src/widgets/toolbox.cpp:1762
+#: ../src/widgets/toolbox.cpp:1764
msgid "Smooth nodes"
msgstr "MĂœkja hnĂșta"
-#: ../src/widgets/toolbox.cpp:1762
+#: ../src/widgets/toolbox.cpp:1764
msgid "Snap smooth nodes, incl. quadrant points of ellipses"
msgstr ""
-#: ../src/widgets/toolbox.cpp:1771
+#: ../src/widgets/toolbox.cpp:1773
msgid "Line Midpoints"
msgstr "Miðpunktar å línum"
-#: ../src/widgets/toolbox.cpp:1771
+#: ../src/widgets/toolbox.cpp:1773
msgid "Snap midpoints of line segments"
msgstr "GrĂ­pa Ă­ miðpunkta ĂĄ lĂ­nubĂștum"
-#: ../src/widgets/toolbox.cpp:1780
+#: ../src/widgets/toolbox.cpp:1782
msgid "Others"
msgstr "Annað"
-#: ../src/widgets/toolbox.cpp:1780
+#: ../src/widgets/toolbox.cpp:1782
msgid "Snap other points (centers, guide origins, gradient handles, etc.)"
msgstr ""
+"Grípa í aðra punkta (miðjur, upphafspunkta stoðlína, litstigulshaldföng, o.s."
+"frv.)"
-#: ../src/widgets/toolbox.cpp:1788
+#: ../src/widgets/toolbox.cpp:1790
msgid "Object Centers"
msgstr "Miðjur hluta"
-#: ../src/widgets/toolbox.cpp:1788
+#: ../src/widgets/toolbox.cpp:1790
msgid "Snap centers of objects"
msgstr "Grípa í miðjur hluta"
-#: ../src/widgets/toolbox.cpp:1797
+#: ../src/widgets/toolbox.cpp:1799
msgid "Rotation Centers"
msgstr "SnĂșningsmiðjur"
-#: ../src/widgets/toolbox.cpp:1797
+#: ../src/widgets/toolbox.cpp:1799
msgid "Snap an item's rotation center"
msgstr "GrĂ­pa Ă­ snĂșningsmiðjur hlutar"
-#: ../src/widgets/toolbox.cpp:1806
+#: ../src/widgets/toolbox.cpp:1808
msgid "Text baseline"
msgstr "GrunnlĂ­na texta"
-#: ../src/widgets/toolbox.cpp:1806
+#: ../src/widgets/toolbox.cpp:1808
msgid "Snap text anchors and baselines"
msgstr "GrĂ­pa Ă­ festingar og grunnlĂ­nur texta"
-#: ../src/widgets/toolbox.cpp:1816
+#: ../src/widgets/toolbox.cpp:1818
msgid "Page border"
msgstr "Jaðar síðu"
-#: ../src/widgets/toolbox.cpp:1816
+#: ../src/widgets/toolbox.cpp:1818
msgid "Snap to the page border"
msgstr "Grípa í jaðar síðu"
-#: ../src/widgets/toolbox.cpp:1825
+#: ../src/widgets/toolbox.cpp:1827
msgid "Snap to grids"
msgstr "GrĂ­pa Ă­ hnitanet"
-#: ../src/widgets/toolbox.cpp:1834
+#: ../src/widgets/toolbox.cpp:1836
msgid "Snap guides"
msgstr "Grípa í stoðlínur"
@@ -29044,7 +29433,7 @@ msgstr "(Ășfið, einfaldað)"
#: ../src/widgets/tweak-toolbar.cpp:350
msgid "(fine, but many nodes)"
-msgstr ""
+msgstr "(fĂ­nlegt, en margir hnĂștar)"
#: ../src/widgets/tweak-toolbar.cpp:353
msgid "Fidelity"
@@ -29066,7 +29455,7 @@ msgstr ""
msgid "Use the pressure of the input device to alter the force of tweak action"
msgstr "Notaðu ĂŸrĂœsting frĂĄ inntakstĂŠki til að breyta krafti aðgerðar"
-#: ../share/extensions/convert2dashes.py:93
+#: ../share/extensions/convert2dashes.py:100
msgid ""
"The selected object is not a path.\n"
"Try using the procedure Path->Object to Path."
@@ -29074,7 +29463,7 @@ msgstr ""
#: ../share/extensions/dimension.py:109
msgid "Please select an object."
-msgstr "Veldu einhvern hlut:"
+msgstr "Veldu einhvern hlut."
#: ../share/extensions/dimension.py:134
msgid "Unable to process this object. Try changing it into a path first."
@@ -29126,13 +29515,13 @@ msgid ""
"required by this extension. Please install them and try again."
msgstr ""
-#: ../share/extensions/dxf_outlines.py:300
+#: ../share/extensions/dxf_outlines.py:299
msgid ""
"Error: Field 'Layer match name' must be filled when using 'By name match' "
"option"
msgstr ""
-#: ../share/extensions/dxf_outlines.py:341
+#: ../share/extensions/dxf_outlines.py:340
#, python-format
msgid "Warning: Layer '%s' not found!"
msgstr "Aðvörun: Lagið '%s' fannst ekki!"
@@ -29175,11 +29564,14 @@ msgid "Need at least 2 paths selected"
msgstr ""
#: ../share/extensions/funcplot.py:48
-msgid "x-interval cannot be zero. Please modify 'Start X' or 'End X'"
+msgid ""
+"x-interval cannot be zero. Please modify 'Start X value' or 'End X value'"
msgstr ""
#: ../share/extensions/funcplot.py:60
-msgid "y-interval cannot be zero. Please modify 'Y top' or 'Y bottom'"
+msgid ""
+"y-interval cannot be zero. Please modify 'Y value of rectangle's top' or 'Y "
+"value of rectangle's bottom'"
msgstr ""
#: ../share/extensions/funcplot.py:315
@@ -29409,14 +29801,18 @@ msgid "Please select an object"
msgstr "Veldu hlut"
#: ../share/extensions/gimp_xcf.py:39
-msgid "Gimp must be installed and set in your path variable."
+msgid "Inkscape must be installed and set in your path variable."
msgstr ""
#: ../share/extensions/gimp_xcf.py:43
+msgid "Gimp must be installed and set in your path variable."
+msgstr ""
+
+#: ../share/extensions/gimp_xcf.py:47
msgid "An error occurred while processing the XCF file."
msgstr ""
-#: ../share/extensions/gimp_xcf.py:177
+#: ../share/extensions/gimp_xcf.py:185
msgid "This extension requires at least one non empty layer."
msgstr ""
@@ -29429,8 +29825,8 @@ msgid "Movements"
msgstr "Hreyfingar"
#: ../share/extensions/hpgl_decoder.py:44
-msgid "Pen #"
-msgstr "Penni #"
+msgid "Pen "
+msgstr ""
#. issue error if no hpgl data found
#: ../share/extensions/hpgl_input.py:58
@@ -29507,6 +29903,8 @@ msgid ""
"To assign an effect, please select an object.\n"
"\n"
msgstr ""
+"Til að Ășthluta brellu, veldu einhvern hlut.\n"
+"\n"
#: ../share/extensions/jessyInk_autoTexts.py:54
msgid ""
@@ -29591,12 +29989,16 @@ msgid ""
"\n"
"{0}Initial effect (order number {1}):"
msgstr ""
+"\n"
+"{0}UpprunasjĂłnbrella (röð nĂșmer {1}):"
#: ../share/extensions/jessyInk_summary.py:170
msgid ""
"\n"
"{0}Effect {1!s} (order number {2}):"
msgstr ""
+"\n"
+"{0}SjĂłnbrella {1!s} (röð nĂșmer {2}):"
#: ../share/extensions/jessyInk_summary.py:174
msgid "{0}\tView will be set according to object \"{1}\""
@@ -29616,7 +30018,7 @@ msgstr " mun hverfa"
#: ../share/extensions/jessyInk_summary.py:184
msgid " using effect \"{0}\""
-msgstr ""
+msgstr " notar sjĂłnbrellu \"{0}\""
#: ../share/extensions/jessyInk_summary.py:187
msgid " in {0!s} s"
@@ -29741,16 +30143,16 @@ msgid ""
msgstr ""
#. issue error if no paths found
-#: ../share/extensions/plotter.py:66
+#: ../share/extensions/plotter.py:67
msgid ""
"No paths where found. Please convert all objects you want to plot into paths."
msgstr ""
-#: ../share/extensions/plotter.py:143
+#: ../share/extensions/plotter.py:144
msgid "pySerial is not installed."
msgstr ""
-#: ../share/extensions/plotter.py:163
+#: ../share/extensions/plotter.py:164
msgid ""
"Could not open port. Please check that your plotter is running, connected "
"and the settings are correct."
@@ -29867,7 +30269,7 @@ msgstr ""
#: ../share/extensions/svg_and_media_zip_output.py:128
#, python-format
msgid "Could not locate file: %s"
-msgstr ""
+msgstr "Gat ekki staðsett skrå: %s"
#: ../share/extensions/svgcalendar.py:266
#: ../share/extensions/svgcalendar.py:288
@@ -30059,7 +30461,7 @@ msgstr "Opna kynningaskiptiskrår vistaðar með Corel DRAW (UC)"
#: ../share/extensions/color_HSL_adjust.inx.h:1
msgid "HSL Adjust"
-msgstr ""
+msgstr "Aðlaga HSL"
#: ../share/extensions/color_HSL_adjust.inx.h:3
msgid "Hue (°)"
@@ -30160,27 +30562,27 @@ msgstr "GrĂĄtĂłna"
#: ../share/extensions/color_lesshue.inx.h:1
msgid "Less Hue"
-msgstr ""
+msgstr "Minni litblĂŠr"
#: ../share/extensions/color_lesslight.inx.h:1
msgid "Less Light"
-msgstr ""
+msgstr "Minni ljĂłsleiki"
#: ../share/extensions/color_lesssaturation.inx.h:1
msgid "Less Saturation"
-msgstr ""
+msgstr "Minni litmettun"
#: ../share/extensions/color_morehue.inx.h:1
msgid "More Hue"
-msgstr ""
+msgstr "Meiri litblĂŠr"
#: ../share/extensions/color_morelight.inx.h:1
msgid "More Light"
-msgstr ""
+msgstr "Meiri ljĂłsleiki"
#: ../share/extensions/color_moresaturation.inx.h:1
msgid "More Saturation"
-msgstr ""
+msgstr "Meiri litmettun"
#: ../share/extensions/color_negative.inx.h:1
msgid "Negative"
@@ -30235,7 +30637,7 @@ msgstr ""
#: ../share/extensions/convert2dashes.inx.h:1
msgid "Convert to Dashes"
-msgstr ""
+msgstr "Umbreyta Ă­ strik"
#: ../share/extensions/dhw_input.inx.h:1
msgid "DHW file input"
@@ -30268,11 +30670,11 @@ msgstr ""
#: ../share/extensions/dia.inx.h:4
msgid "Dia Diagram (*.dia)"
-msgstr ""
+msgstr "Dia skĂœringamynd (*.dia)"
#: ../share/extensions/dia.inx.h:5
msgid "A diagram created with the program Dia"
-msgstr ""
+msgstr "SkĂœringamynd sem bĂșin er til með Dia-forritinu"
#: ../share/extensions/dimension.inx.h:1
msgid "Dimensions"
@@ -30709,7 +31111,7 @@ msgstr ""
#: ../share/extensions/edge3d.inx.h:4
msgid "Only black and white:"
-msgstr "Aðeins svarthvítt"
+msgstr "Aðeins svarthvítt:"
#: ../share/extensions/edge3d.inx.h:6
msgid "Blur stdDeviation:"
@@ -30915,7 +31317,7 @@ msgstr "BÊta við stoðlínum"
#: ../share/extensions/fractalize.inx.h:1
msgid "Fractalize"
-msgstr ""
+msgstr "Brotamyndgera"
#: ../share/extensions/fractalize.inx.h:2
msgid "Subdivisions:"
@@ -31421,15 +31823,15 @@ msgstr ""
#: ../share/extensions/gcodetools_dxf_points.inx.h:1
msgid "DXF Points"
-msgstr ""
+msgstr "DXF punktar"
#: ../share/extensions/gcodetools_dxf_points.inx.h:2
msgid "DXF points"
-msgstr ""
+msgstr "DXF punktar"
#: ../share/extensions/gcodetools_dxf_points.inx.h:3
msgid "Convert selection:"
-msgstr ""
+msgstr "Umbreyta vali:"
#: ../share/extensions/gcodetools_dxf_points.inx.h:4
msgid ""
@@ -31453,7 +31855,7 @@ msgstr ""
#: ../share/extensions/gcodetools_engraving.inx.h:1
msgid "Engraving"
-msgstr ""
+msgstr "Myndrista"
#: ../share/extensions/gcodetools_engraving.inx.h:2
msgid "Smooth convex corners between this value and 180 degrees:"
@@ -32112,7 +32514,7 @@ msgstr "Texti:"
#: ../share/extensions/hershey.inx.h:4
msgid "Action: "
-msgstr "Aðgerð:"
+msgstr "Aðgerð: "
#: ../share/extensions/hershey.inx.h:5
msgid "Font face: "
@@ -32258,13 +32660,13 @@ msgstr ""
#: ../share/extensions/hpgl_input.inx.h:3
#: ../share/extensions/hpgl_output.inx.h:4
-#: ../share/extensions/plotter.inx.h:23
+#: ../share/extensions/plotter.inx.h:25
msgid "Resolution X (dpi):"
msgstr ""
#: ../share/extensions/hpgl_input.inx.h:4
#: ../share/extensions/hpgl_output.inx.h:5
-#: ../share/extensions/plotter.inx.h:24
+#: ../share/extensions/plotter.inx.h:26
msgid ""
"The amount of steps the plotter moves if it moves for 1 inch on the X axis "
"(Default: 1016.0)"
@@ -32272,13 +32674,13 @@ msgstr ""
#: ../share/extensions/hpgl_input.inx.h:5
#: ../share/extensions/hpgl_output.inx.h:6
-#: ../share/extensions/plotter.inx.h:25
+#: ../share/extensions/plotter.inx.h:27
msgid "Resolution Y (dpi):"
msgstr ""
#: ../share/extensions/hpgl_input.inx.h:6
#: ../share/extensions/hpgl_output.inx.h:7
-#: ../share/extensions/plotter.inx.h:26
+#: ../share/extensions/plotter.inx.h:28
msgid ""
"The amount of steps the plotter moves if it moves for 1 inch on the Y axis "
"(Default: 1016.0)"
@@ -32313,34 +32715,34 @@ msgid ""
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:3
-#: ../share/extensions/plotter.inx.h:22
+#: ../share/extensions/plotter.inx.h:24
msgid "Plotter Settings "
msgstr "Plotterstillingar "
#: ../share/extensions/hpgl_output.inx.h:8
-#: ../share/extensions/plotter.inx.h:27
+#: ../share/extensions/plotter.inx.h:29
msgid "Pen number:"
msgstr "Penni nĂșmer:"
#: ../share/extensions/hpgl_output.inx.h:9
-#: ../share/extensions/plotter.inx.h:28
+#: ../share/extensions/plotter.inx.h:30
msgid "The number of the pen (tool) to use (Standard: '1')"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:10
-#: ../share/extensions/plotter.inx.h:29
+#: ../share/extensions/plotter.inx.h:31
msgid "Pen force (g):"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:11
-#: ../share/extensions/plotter.inx.h:30
+#: ../share/extensions/plotter.inx.h:32
msgid ""
"The amount of force pushing down the pen in grams, set to 0 to omit command; "
"most plotters ignore this command (Default: 0)"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:12
-#: ../share/extensions/plotter.inx.h:31
+#: ../share/extensions/plotter.inx.h:33
msgid "Pen speed (cm/s or mm/s):"
msgstr ""
@@ -32356,101 +32758,101 @@ msgid "Rotation (°, Clockwise):"
msgstr "SnĂșningur (°, rĂ©ttsĂŠlis):"
#: ../share/extensions/hpgl_output.inx.h:15
-#: ../share/extensions/plotter.inx.h:34
+#: ../share/extensions/plotter.inx.h:36
msgid "Rotation of the drawing (Default: 0°)"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:16
-#: ../share/extensions/plotter.inx.h:35
+#: ../share/extensions/plotter.inx.h:37
msgid "Mirror X axis"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:17
-#: ../share/extensions/plotter.inx.h:36
+#: ../share/extensions/plotter.inx.h:38
msgid "Check this to mirror the X axis (Default: Unchecked)"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:18
-#: ../share/extensions/plotter.inx.h:37
+#: ../share/extensions/plotter.inx.h:39
msgid "Mirror Y axis"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:19
-#: ../share/extensions/plotter.inx.h:38
+#: ../share/extensions/plotter.inx.h:40
msgid "Check this to mirror the Y axis (Default: Unchecked)"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:20
-#: ../share/extensions/plotter.inx.h:39
+#: ../share/extensions/plotter.inx.h:41
msgid "Center zero point"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:21
-#: ../share/extensions/plotter.inx.h:40
+#: ../share/extensions/plotter.inx.h:42
msgid ""
"Check this if your plotter uses a centered zero point (Default: Unchecked)"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:22
-#: ../share/extensions/plotter.inx.h:41
+#: ../share/extensions/plotter.inx.h:43
msgid "Plot Features "
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:23
-#: ../share/extensions/plotter.inx.h:42
+#: ../share/extensions/plotter.inx.h:44
msgid "Overcut (mm):"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:24
-#: ../share/extensions/plotter.inx.h:43
+#: ../share/extensions/plotter.inx.h:45
msgid ""
"The distance in mm that will be cut over the starting point of the path to "
"prevent open paths, set to 0.0 to omit command (Default: 1.00)"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:25
-#: ../share/extensions/plotter.inx.h:44
+#: ../share/extensions/plotter.inx.h:46
msgid "Tool offset (mm):"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:26
-#: ../share/extensions/plotter.inx.h:45
+#: ../share/extensions/plotter.inx.h:47
msgid ""
"The offset from the tool tip to the tool axis in mm, set to 0.0 to omit "
"command (Default: 0.25)"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:27
-#: ../share/extensions/plotter.inx.h:46
+#: ../share/extensions/plotter.inx.h:48
msgid "Use precut"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:28
-#: ../share/extensions/plotter.inx.h:47
+#: ../share/extensions/plotter.inx.h:49
msgid ""
"Check this to cut a small line before the real drawing starts to correctly "
"align the tool orientation. (Default: Checked)"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:29
-#: ../share/extensions/plotter.inx.h:48
+#: ../share/extensions/plotter.inx.h:50
msgid "Curve flatness:"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:30
-#: ../share/extensions/plotter.inx.h:49
+#: ../share/extensions/plotter.inx.h:51
msgid ""
"Curves are divided into lines, this number controls how fine the curves will "
"be reproduced, the smaller the finer (Default: '1.2')"
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:31
-#: ../share/extensions/plotter.inx.h:50
+#: ../share/extensions/plotter.inx.h:52
msgid "Auto align"
msgstr "Sjålfvirk jöfnun"
#: ../share/extensions/hpgl_output.inx.h:32
-#: ../share/extensions/plotter.inx.h:51
+#: ../share/extensions/plotter.inx.h:53
msgid ""
"Check this to auto align the drawing to the zero point (Plus the tool offset "
"if used). If unchecked you have to make sure that all parts of your drawing "
@@ -32458,7 +32860,7 @@ msgid ""
msgstr ""
#: ../share/extensions/hpgl_output.inx.h:33
-#: ../share/extensions/plotter.inx.h:54
+#: ../share/extensions/plotter.inx.h:56
msgid ""
"All these settings depend on the plotter you use, for more information "
"please consult the manual or homepage for your plotter."
@@ -32555,15 +32957,15 @@ msgstr "Aðferð við brĂșun:"
#: ../share/extensions/interp.inx.h:5
msgid "Duplicate endpaths"
-msgstr ""
+msgstr "Tvöfalda endaferla"
#: ../share/extensions/interp.inx.h:6
msgid "Interpolate style"
-msgstr ""
+msgstr "StĂ­ll brĂșunar"
#: ../share/extensions/interp_att_g.inx.h:1
msgid "Interpolate Attribute in a group"
-msgstr ""
+msgstr "SkjĂłta inn eigindi Ă­ hĂłp"
#: ../share/extensions/interp_att_g.inx.h:3
msgid "Attribute to Interpolate:"
@@ -32591,11 +32993,11 @@ msgstr "Lokagildi:"
#: ../share/extensions/interp_att_g.inx.h:13
msgid "Translate X"
-msgstr ""
+msgstr "Hliðra X"
#: ../share/extensions/interp_att_g.inx.h:14
msgid "Translate Y"
-msgstr ""
+msgstr "Hliðra Y"
#: ../share/extensions/interp_att_g.inx.h:15
#: ../share/extensions/markers_strokepaint.inx.h:9
@@ -32683,6 +33085,9 @@ msgid ""
"JessyInk presentation. Please see code.google.com/p/jessyink for more "
"details."
msgstr ""
+"Þessi viðbĂłt gerir ĂŸĂ©r kleift að setja upp, uppfĂŠra eða fjarlĂŠgja sjĂĄlfvirka "
+"texta í JessyInk glÊrukynningu. Skoðaðu code.google.com/p/jessyink fyrir "
+"nĂĄnari upplĂœsingar."
#: ../share/extensions/jessyInk_autoTexts.inx.h:10
#: ../share/extensions/jessyInk_effects.inx.h:15
@@ -32696,7 +33101,7 @@ msgstr ""
#: ../share/extensions/jessyInk_video.inx.h:4
#: ../share/extensions/jessyInk_view.inx.h:9
msgid "JessyInk"
-msgstr ""
+msgstr "JessyInk kynning"
#: ../share/extensions/jessyInk_effects.inx.h:1
msgid "Effects"
@@ -32710,7 +33115,7 @@ msgstr "TĂ­malengd Ă­ sekĂșndum:"
#: ../share/extensions/jessyInk_effects.inx.h:6
msgid "Build-in effect"
-msgstr ""
+msgstr "Byggja-inn sjĂłnbrella"
#: ../share/extensions/jessyInk_effects.inx.h:7
msgid "None (default)"
@@ -32719,20 +33124,20 @@ msgstr "Ekkert (sjålfgefið)"
#: ../share/extensions/jessyInk_effects.inx.h:8
#: ../share/extensions/jessyInk_transitions.inx.h:8
msgid "Appear"
-msgstr "Birtist"
+msgstr "Birtast"
#: ../share/extensions/jessyInk_effects.inx.h:9
msgid "Fade in"
-msgstr ""
+msgstr "Dofna inn"
#: ../share/extensions/jessyInk_effects.inx.h:10
#: ../share/extensions/jessyInk_transitions.inx.h:10
msgid "Pop"
-msgstr ""
+msgstr "Spretta upp"
#: ../share/extensions/jessyInk_effects.inx.h:11
msgid "Build-out effect"
-msgstr ""
+msgstr "Byggja-Ășt sjĂłnbrella"
#: ../share/extensions/jessyInk_effects.inx.h:12
msgid "Fade out"
@@ -32744,10 +33149,13 @@ msgid ""
"JessyInk presentation. Please see code.google.com/p/jessyink for more "
"details."
msgstr ""
+"Þessi viðbĂłt gerir ĂŸĂ©r kleift að setja upp, uppfĂŠra eða fjarlĂŠgja brellur "
+"hluta í JessyInk glÊrukynningu. Skoðaðu code.google.com/p/jessyink fyrir "
+"nĂĄnari upplĂœsingar."
#: ../share/extensions/jessyInk_export.inx.h:1
msgid "JessyInk zipped pdf or png output"
-msgstr ""
+msgstr "ZIP-ĂŸjappað JessyInk PDF eða PNG Ășttak"
#: ../share/extensions/jessyInk_export.inx.h:4
msgid "Resolution:"
@@ -32767,20 +33175,25 @@ msgid ""
"an export layer in your browser. Please see code.google.com/p/jessyink for "
"more details."
msgstr ""
+"Þessi viðbĂłt gerir ĂŸĂ©r kleift að flytja Ășt JessyInk glĂŠrukynningar, eftir að "
+"hafa bĂșið til Ăștflutningslag Ă­ vafranum ĂŸĂ­num. Skoðaðu code.google.com/p/"
+"jessyink fyrir nĂĄnari upplĂœsingar."
#: ../share/extensions/jessyInk_export.inx.h:9
msgid "JessyInk zipped pdf or png output (*.zip)"
-msgstr ""
+msgstr "ZIP-ĂŸjappað JessyInk PDF eða PNG Ășttak (*.zip)"
#: ../share/extensions/jessyInk_export.inx.h:10
msgid ""
"Creates a zip file containing pdfs or pngs of all slides of a JessyInk "
"presentation."
msgstr ""
+"BĂœr til ZIP-skrĂĄ með öllum PDF eða PNG-skrĂĄm allra skyggna Ășr JessyInk "
+"glĂŠrukynningu."
#: ../share/extensions/jessyInk_install.inx.h:1
msgid "Install/update"
-msgstr ""
+msgstr "Setja inn/uppfĂŠrsla"
#: ../share/extensions/jessyInk_install.inx.h:3
msgid ""
@@ -32788,6 +33201,9 @@ msgid ""
"to turn your SVG file into a presentation. Please see code.google.com/p/"
"jessyink for more details."
msgstr ""
+"Þessi viðbĂłt gerir ĂŸĂ©r kleift að setja upp eða uppfĂŠra JessyInk skriftuna, "
+"sem notuð er til ĂŸess að breyta SVG-skrĂĄm Ă­ glĂŠrukynningar. Skoðaðu code."
+"google.com/p/jessyink fyrir nĂĄnari upplĂœsingar."
#: ../share/extensions/jessyInk_keyBindings.inx.h:1
msgid "Key bindings"
@@ -32795,35 +33211,35 @@ msgstr "Lyklabindingar"
#: ../share/extensions/jessyInk_keyBindings.inx.h:2
msgid "Slide mode"
-msgstr ""
+msgstr "Skyggnuhamur"
#: ../share/extensions/jessyInk_keyBindings.inx.h:3
msgid "Back (with effects):"
-msgstr ""
+msgstr "Til baka (með brellum):"
#: ../share/extensions/jessyInk_keyBindings.inx.h:4
msgid "Next (with effects):"
-msgstr ""
+msgstr "NÊsta (með brellum):"
#: ../share/extensions/jessyInk_keyBindings.inx.h:5
msgid "Back (without effects):"
-msgstr ""
+msgstr "Til baka (ĂĄn brellna):"
#: ../share/extensions/jessyInk_keyBindings.inx.h:6
msgid "Next (without effects):"
-msgstr ""
+msgstr "NĂŠsta (ĂĄn brellna):"
#: ../share/extensions/jessyInk_keyBindings.inx.h:7
msgid "First slide:"
-msgstr ""
+msgstr "Fyrsta skyggna:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:8
msgid "Last slide:"
-msgstr ""
+msgstr "Seinasta skyggna:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:9
msgid "Switch to index mode:"
-msgstr ""
+msgstr "Skipta yfir Ă­ yfirlitsham:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:10
msgid "Switch to drawing mode:"
@@ -32831,11 +33247,11 @@ msgstr "Skipta yfir Ă­ teikniham:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:11
msgid "Set duration:"
-msgstr ""
+msgstr "Setja tĂ­malengd:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:12
msgid "Add slide:"
-msgstr ""
+msgstr "BÊta við skyggnu:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:13
msgid "Toggle progress bar:"
@@ -32851,7 +33267,7 @@ msgstr "Flytja kynningu Ășt:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:17
msgid "Switch to slide mode:"
-msgstr ""
+msgstr "Skipta yfir Ă­ skyggnuham:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:18
msgid "Set path width to default:"
@@ -32883,7 +33299,7 @@ msgstr "Setja lit ferils sem blĂĄan:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:25
msgid "Set path color to cyan:"
-msgstr "Setja lit ferils sem blĂĄgrĂŠnan:"
+msgstr "Setja lit ferils sem grĂŠnblĂĄan:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:26
msgid "Set path color to green:"
@@ -32919,23 +33335,23 @@ msgstr "Afturkalla síðasta lĂ­nubĂșt:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:34
msgid "Index mode"
-msgstr ""
+msgstr "Yfirlitshamur"
#: ../share/extensions/jessyInk_keyBindings.inx.h:35
msgid "Select the slide to the left:"
-msgstr ""
+msgstr "Velja skyggnuna til vinstri:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:36
msgid "Select the slide to the right:"
-msgstr ""
+msgstr "Velja skyggnuna til hĂŠgri:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:37
msgid "Select the slide above:"
-msgstr ""
+msgstr "Velja skyggnuna fyrir ofan:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:38
msgid "Select the slide below:"
-msgstr ""
+msgstr "Velja skyggnuna fyrir neðan:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:39
msgid "Previous page:"
@@ -32947,7 +33363,7 @@ msgstr "NÊsta síða:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:41
msgid "Decrease number of columns:"
-msgstr ""
+msgstr "Minnka fjölda dålka:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:42
msgid "Increase number of columns:"
@@ -32955,36 +33371,40 @@ msgstr "Auka fjölda dålka:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:43
msgid "Set number of columns to default:"
-msgstr ""
+msgstr "Setja fjölda dålka å sjålfgefið:"
#: ../share/extensions/jessyInk_keyBindings.inx.h:45
msgid ""
"This extension allows you customise the key bindings JessyInk uses. Please "
"see code.google.com/p/jessyink for more details."
msgstr ""
+"Þessi viðbĂłt gerir ĂŸĂ©r kleift að sĂ©rsníða lyklabindingarnar sem JessyInk "
+"notar. Skoðaðu code.google.com/p/jessyink fyrir nĂĄnari upplĂœsingar."
#: ../share/extensions/jessyInk_masterSlide.inx.h:1
msgid "Master slide"
-msgstr ""
+msgstr "Yfirskyggna"
#: ../share/extensions/jessyInk_masterSlide.inx.h:3
#: ../share/extensions/jessyInk_transitions.inx.h:3
msgid "Name of layer:"
-msgstr ""
+msgstr "Heiti lags:"
#: ../share/extensions/jessyInk_masterSlide.inx.h:4
msgid "If no layer name is supplied, the master slide is unset."
-msgstr ""
+msgstr "Ef ekkert heiti å lagi er tilgreint, verður yfirskyggna óstillt."
#: ../share/extensions/jessyInk_masterSlide.inx.h:6
msgid ""
"This extension allows you to change the master slide JessyInk uses. Please "
"see code.google.com/p/jessyink for more details."
msgstr ""
+"Þessi viðbĂłt gerir ĂŸĂ©r kleift að breyta yfirskyggnunni sem JessyInk notar. "
+"Skoðaðu code.google.com/p/jessyink fyrir nĂĄnari upplĂœsingar."
#: ../share/extensions/jessyInk_mouseHandler.inx.h:1
msgid "Mouse handler"
-msgstr ""
+msgstr "MĂșsameðhöndlari"
#: ../share/extensions/jessyInk_mouseHandler.inx.h:2
msgid "Mouse settings:"
@@ -32992,17 +33412,19 @@ msgstr "Stillingar mĂșsar:"
#: ../share/extensions/jessyInk_mouseHandler.inx.h:4
msgid "No-click"
-msgstr ""
+msgstr "Ekki-smella"
#: ../share/extensions/jessyInk_mouseHandler.inx.h:5
msgid "Dragging/zoom"
-msgstr ""
+msgstr "Draga/Aðdråttur"
#: ../share/extensions/jessyInk_mouseHandler.inx.h:7
msgid ""
"This extension allows you customise the mouse handler JessyInk uses. Please "
"see code.google.com/p/jessyink for more details."
msgstr ""
+"Þessi viðbĂłt gerir ĂŸĂ©r kleift að sĂ©rsníða mĂșsarmeðhöndlunina sem JessyInk "
+"notar. Skoðaðu code.google.com/p/jessyink fyrir nĂĄnari upplĂœsingar."
#: ../share/extensions/jessyInk_summary.inx.h:1
msgid "Summary"
@@ -33014,6 +33436,9 @@ msgid ""
"effects and transitions contained in this SVG file. Please see code.google."
"com/p/jessyink for more details."
msgstr ""
+"Þessi viðbĂłt gerir ĂŸĂ©r kleift að skoða upplĂœsingar um JessyInk skriftuna, "
+"brellurnar og millifĂŠrslur sem ĂŸessi SVG-skrĂĄ inniheldur. Skoðaðu code."
+"google.com/p/jessyink fyrir nĂĄnari upplĂœsingar."
#: ../share/extensions/jessyInk_transitions.inx.h:1
msgid "Transitions"
@@ -33021,7 +33446,7 @@ msgstr "MillifĂŠrslur"
#: ../share/extensions/jessyInk_transitions.inx.h:6
msgid "Transition in effect"
-msgstr ""
+msgstr "MillifĂŠrslubrella inn"
#: ../share/extensions/jessyInk_transitions.inx.h:9
msgid "Fade"
@@ -33029,41 +33454,43 @@ msgstr "Deyfing"
#: ../share/extensions/jessyInk_transitions.inx.h:11
msgid "Transition out effect"
-msgstr ""
+msgstr "MillifĂŠrslubrella Ășt"
#: ../share/extensions/jessyInk_transitions.inx.h:13
msgid ""
"This extension allows you to change the transition JessyInk uses for the "
"selected layer. Please see code.google.com/p/jessyink for more details."
msgstr ""
+"Þessi viðbĂłt gerir ĂŸĂ©r kleift að breyta millifĂŠrslunni sem JessyInk notar ĂĄ "
+"völdu lagi. Skoðaðu code.google.com/p/jessyink fyrir nĂĄnari upplĂœsingar."
#: ../share/extensions/jessyInk_uninstall.inx.h:1
msgid "Uninstall/remove"
-msgstr ""
+msgstr "FjarlĂŠgja/Henda Ășt"
#: ../share/extensions/jessyInk_uninstall.inx.h:3
msgid "Remove script"
-msgstr ""
+msgstr "FjarlĂŠgja skriftu"
#: ../share/extensions/jessyInk_uninstall.inx.h:4
msgid "Remove effects"
-msgstr ""
+msgstr "FjarlĂŠgja brellur"
#: ../share/extensions/jessyInk_uninstall.inx.h:5
msgid "Remove master slide assignment"
-msgstr ""
+msgstr "FjarlĂŠgja Ășthlutun yfirskyggnu"
#: ../share/extensions/jessyInk_uninstall.inx.h:6
msgid "Remove transitions"
-msgstr ""
+msgstr "FjarlĂŠgja millifĂŠrslur"
#: ../share/extensions/jessyInk_uninstall.inx.h:7
msgid "Remove auto-texts"
-msgstr ""
+msgstr "FjarlĂŠgja sjĂĄlfvirka texta"
#: ../share/extensions/jessyInk_uninstall.inx.h:8
msgid "Remove views"
-msgstr ""
+msgstr "FjarlĂŠgja sĂœnir"
#: ../share/extensions/jessyInk_uninstall.inx.h:9
msgid "Please select the parts of JessyInk you want to uninstall/remove."
@@ -33074,6 +33501,8 @@ msgid ""
"This extension allows you to uninstall the JessyInk script. Please see code."
"google.com/p/jessyink for more details."
msgstr ""
+"Þessi viðbĂłt gerir ĂŸĂ©r kleift að fjarlĂŠgja JessyInk skriftuna. Skoðaðu code."
+"google.com/p/jessyink fyrir nĂĄnari upplĂœsingar."
#: ../share/extensions/jessyInk_video.inx.h:1
msgid "Video"
@@ -33085,6 +33514,9 @@ msgid ""
"This element allows you to integrate a video into your JessyInk "
"presentation. Please see code.google.com/p/jessyink for more details."
msgstr ""
+"Þessi viðbĂłt setur myndskeiðseiningu inn Ă­ nĂșverandi skyggnu (lag). SĂș "
+"eining gerir ĂŸĂ©r síðan kleift að setja myndskeið inn Ă­ JessyInk "
+"glĂŠrukynningu. Skoðaðu code.google.com/p/jessyink fyrir nĂĄnari upplĂœsingar."
#: ../share/extensions/jessyInk_view.inx.h:5
msgid "Remove view"
@@ -33099,6 +33531,9 @@ msgid ""
"This extension allows you to set, update and remove views for a JessyInk "
"presentation. Please see code.google.com/p/jessyink for more details."
msgstr ""
+"Þessi viðbĂłt gerir ĂŸĂ©r kleift að setja upp, uppfĂŠra eða fjarlĂŠgja "
+"fjartengdar sĂœnir fyrir JessyInk glĂŠrukynningu. Skoðaðu code.google.com/p/"
+"jessyink fyrir nĂĄnari upplĂœsingar."
#: ../share/extensions/layers2svgfont.inx.h:1
msgid "3 - Convert Glyph Layers to SVG Font"
@@ -33229,7 +33664,7 @@ msgstr ""
#: ../share/extensions/lindenmayer.inx.h:2
msgid "Axiom and rules"
-msgstr ""
+msgstr "Forsendur og reglur"
#: ../share/extensions/lindenmayer.inx.h:3
msgid "Axiom:"
@@ -33524,20 +33959,20 @@ msgstr ""
#: ../share/extensions/pathalongpath.inx.h:1
msgid "Pattern along Path"
-msgstr ""
+msgstr "Mynstur eftir ferli"
#: ../share/extensions/pathalongpath.inx.h:3
msgid "Copies of the pattern:"
-msgstr ""
+msgstr "Afrit af mynstrinu:"
#: ../share/extensions/pathalongpath.inx.h:4
msgid "Deformation type:"
-msgstr ""
+msgstr "Tegund aflögunar:"
#: ../share/extensions/pathalongpath.inx.h:5
#: ../share/extensions/pathscatter.inx.h:5
msgid "Space between copies:"
-msgstr ""
+msgstr "Bil ĂĄ milli eintaka:"
#: ../share/extensions/pathalongpath.inx.h:6
#: ../share/extensions/pathscatter.inx.h:6
@@ -33623,7 +34058,7 @@ msgstr ""
#: ../share/extensions/perfectboundcover.inx.h:1
msgid "Perfect-Bound Cover Template"
-msgstr ""
+msgstr "Sniðmåt kåpu fyrir límdan kjöl (Perfect-Bound)"
#: ../share/extensions/perfectboundcover.inx.h:2
msgid "Book Properties"
@@ -33692,16 +34127,20 @@ msgstr "BlÊðing (tommur):"
#: ../share/extensions/perfectboundcover.inx.h:18
msgid "Note: Bond Weight # calculations are a best-guess estimate."
msgstr ""
+"Athugaðu: Ăștreikningar ĂĄ ĂŸykkt bindis eru aldrei nema nĂĄlgun við raunverulega "
+"ĂŸykkt."
#: ../share/extensions/pixelsnap.inx.h:1
msgid "PixelSnap"
-msgstr ""
+msgstr "GrĂ­pa Ă­ mynddĂ­la"
#: ../share/extensions/pixelsnap.inx.h:2
msgid ""
"Snap all paths in selection to pixels. Snaps borders to half-points and "
"fills to full points."
msgstr ""
+"LÊtur alla valda ferla grípa í mynddíla. Jaðrar grípa í hålfa díla og fylling "
+"að heilum dílum."
#: ../share/extensions/plotter.inx.h:1
msgid "Plot"
@@ -33753,66 +34192,76 @@ msgid "The command language to use (Default: HPGL)"
msgstr "Skipanamålið sem å að nota (sjålfgefið: HPGL)"
#: ../share/extensions/plotter.inx.h:12
+msgid "Initialization commands:"
+msgstr ""
+
+#: ../share/extensions/plotter.inx.h:13
+msgid ""
+"Commands that will be sent to the plotter before the main data stream, only "
+"use this if you know what you are doing! (Default: Empty)"
+msgstr ""
+
+#: ../share/extensions/plotter.inx.h:14
msgid "Software (XON/XOFF)"
msgstr "HugbĂșnaður (XON/XOFF)"
-#: ../share/extensions/plotter.inx.h:13
+#: ../share/extensions/plotter.inx.h:15
msgid "Hardware (RTS/CTS)"
msgstr "VĂ©lbĂșnaður (RTS/CTS)"
-#: ../share/extensions/plotter.inx.h:14
+#: ../share/extensions/plotter.inx.h:16
msgid "Hardware (DSR/DTR + RTS/CTS)"
msgstr "VĂ©lbĂșnaður (DSR/DTR + RTS/CTS)"
-#: ../share/extensions/plotter.inx.h:15
+#: ../share/extensions/plotter.inx.h:17
msgctxt "Flow control"
msgid "None"
msgstr "Ekkert"
-#: ../share/extensions/plotter.inx.h:16
+#: ../share/extensions/plotter.inx.h:18
msgid "HPGL"
msgstr "HPGL"
-#: ../share/extensions/plotter.inx.h:17
+#: ../share/extensions/plotter.inx.h:19
msgid "DMPL"
msgstr "DMPL"
-#: ../share/extensions/plotter.inx.h:18
-msgid "KNK Zing (HPGL variant)"
-msgstr "KNK Zing (HPGL tilbrigði)"
+#: ../share/extensions/plotter.inx.h:20
+msgid "KNK Plotter (HPGL variant)"
+msgstr ""
-#: ../share/extensions/plotter.inx.h:19
+#: ../share/extensions/plotter.inx.h:21
msgid ""
"Using wrong settings can under certain circumstances cause Inkscape to "
"freeze. Always save your work before plotting!"
msgstr ""
-#: ../share/extensions/plotter.inx.h:20
+#: ../share/extensions/plotter.inx.h:22
msgid ""
"This can be a physical serial connection or a USB-to-Serial bridge. Ask your "
"plotter manufacturer for drivers if needed."
msgstr ""
-#: ../share/extensions/plotter.inx.h:21
+#: ../share/extensions/plotter.inx.h:23
msgid "Parallel (LPT) connections are not supported."
msgstr ""
-#: ../share/extensions/plotter.inx.h:32
+#: ../share/extensions/plotter.inx.h:34
msgid ""
"The speed the pen will move with in centimeters or millimeters per second "
"(depending on your plotter model), set to 0 to omit command. Most plotters "
"ignore this command. (Default: 0)"
msgstr ""
-#: ../share/extensions/plotter.inx.h:33
+#: ../share/extensions/plotter.inx.h:35
msgid "Rotation (°, clockwise):"
msgstr "SnĂșningur (°, rĂ©ttsĂŠlis):"
-#: ../share/extensions/plotter.inx.h:52
+#: ../share/extensions/plotter.inx.h:54
msgid "Show debug information"
msgstr "Birta villuleitarupplĂœsingar"
-#: ../share/extensions/plotter.inx.h:53
+#: ../share/extensions/plotter.inx.h:55
msgid ""
"Check this to get verbose information about the plot without actually "
"sending something to the plotter (A.k.a. data dump) (Default: Unchecked)"
@@ -33837,7 +34286,7 @@ msgstr "AutoCAD Plot frĂĄlag"
#: ../share/extensions/plt_output.inx.h:3
msgid "Save a file for plotters"
-msgstr ""
+msgstr "Vista skrĂĄ fyrir plottara"
#: ../share/extensions/polyhedron_3d.inx.h:1
msgid "3D Polyhedron"
@@ -33845,7 +34294,7 @@ msgstr "3D margflötungur"
#: ../share/extensions/polyhedron_3d.inx.h:2
msgid "Model file"
-msgstr ""
+msgstr "MĂłdelskrĂĄ"
#: ../share/extensions/polyhedron_3d.inx.h:3
msgid "Object:"
@@ -33861,7 +34310,7 @@ msgstr "Tegund hlutar:"
#: ../share/extensions/polyhedron_3d.inx.h:6
msgid "Clockwise wound object"
-msgstr ""
+msgstr "RéttsÊlis undinn hlutur"
#: ../share/extensions/polyhedron_3d.inx.h:7
msgid "Cube"
@@ -33921,11 +34370,11 @@ msgstr ""
#: ../share/extensions/polyhedron_3d.inx.h:21
msgid "Great Dodecahedron"
-msgstr ""
+msgstr "Stóri tólfflötungur"
#: ../share/extensions/polyhedron_3d.inx.h:22
msgid "Great Stellated Dodecahedron"
-msgstr ""
+msgstr "Stóri stjörnulaga tólfflötungur"
#: ../share/extensions/polyhedron_3d.inx.h:23
msgid "Load from file"
@@ -33933,11 +34382,11 @@ msgstr "Hlaða inn Ășr skrĂĄ"
#: ../share/extensions/polyhedron_3d.inx.h:24
msgid "Face-Specified"
-msgstr ""
+msgstr "Tilgreint-með-hliðfleti"
#: ../share/extensions/polyhedron_3d.inx.h:25
msgid "Edge-Specified"
-msgstr ""
+msgstr "Tilgreint-með-brĂșn"
#: ../share/extensions/polyhedron_3d.inx.h:27
msgid "Rotate around:"
@@ -34041,15 +34490,15 @@ msgstr "LĂĄgmark"
#: ../share/extensions/polyhedron_3d.inx.h:55
msgid "Mean"
-msgstr "Meðaltal"
+msgstr "Miðgildi"
#: ../share/extensions/previous_glyph_layer.inx.h:1
msgid "View Previous Glyph"
-msgstr ""
+msgstr "Skoða fyrra staftåkn"
#: ../share/extensions/print_win32_vector.inx.h:1
msgid "Win32 Vector Print"
-msgstr ""
+msgstr "Win32 vigurprentun"
#: ../share/extensions/printing_marks.inx.h:1
msgid "Printing Marks"
@@ -34105,11 +34554,11 @@ msgstr "Flökta hnĂștum"
#: ../share/extensions/radiusrand.inx.h:3
msgid "Maximum displacement in X (px):"
-msgstr ""
+msgstr "HĂĄmark tilfĂŠrslu Ă­ X (px):"
#: ../share/extensions/radiusrand.inx.h:4
msgid "Maximum displacement in Y (px):"
-msgstr ""
+msgstr "HĂĄmark tilfĂŠrslu Ă­ Y (px):"
#: ../share/extensions/radiusrand.inx.h:7
msgid "Use normal distribution"
@@ -34245,15 +34694,15 @@ msgstr ""
#: ../share/extensions/replace_font.inx.h:1
msgid "Replace font"
-msgstr ""
+msgstr "Skipta Ășt letri"
#: ../share/extensions/replace_font.inx.h:2
msgid "Find and Replace font"
-msgstr ""
+msgstr "Finna og skipta Ășt letri"
#: ../share/extensions/replace_font.inx.h:3
msgid "Find font: "
-msgstr ""
+msgstr "Finna letur: "
#: ../share/extensions/replace_font.inx.h:4
msgid "Replace with: "
@@ -34261,28 +34710,29 @@ msgstr "Skipta Ășt með: "
#: ../share/extensions/replace_font.inx.h:5
msgid "Replace all fonts with: "
-msgstr ""
+msgstr "Skipta öllu letri með: "
#: ../share/extensions/replace_font.inx.h:6
msgid "List all fonts"
-msgstr ""
+msgstr "Telja upp allt letur"
#: ../share/extensions/replace_font.inx.h:7
msgid ""
"Choose this tab if you would like to see a list of the fonts used/found."
msgstr ""
+"Lokaðu ĂŸessum flipa ef ĂŸĂș vilt sjĂĄ lista yfir allt letur sem fannst/er notað."
#: ../share/extensions/replace_font.inx.h:8
msgid "Work on:"
-msgstr ""
+msgstr "Vinna með:"
#: ../share/extensions/replace_font.inx.h:9
msgid "Entire drawing"
-msgstr ""
+msgstr "Alla teikninguna"
#: ../share/extensions/replace_font.inx.h:10
msgid "Selected objects only"
-msgstr ""
+msgstr "Aðeins valda hluti"
#: ../share/extensions/restack.inx.h:1
msgid "Restack"
@@ -34310,11 +34760,11 @@ msgstr "Ofan og niður (270)"
#: ../share/extensions/restack.inx.h:7
msgid "Radial Outward"
-msgstr ""
+msgstr "Út frá miðju"
#: ../share/extensions/restack.inx.h:8
msgid "Radial Inward"
-msgstr ""
+msgstr "Inn að miðju"
#: ../share/extensions/restack.inx.h:9
msgid "Arbitrary Angle"
@@ -34382,39 +34832,39 @@ msgstr "Bestað SVG frålag"
#: ../share/extensions/scour.inx.h:3
msgid "Shorten color values"
-msgstr ""
+msgstr "Stytta litagildi"
#: ../share/extensions/scour.inx.h:4
msgid "Convert CSS attributes to XML attributes"
-msgstr ""
+msgstr "Umbreyta CSS eigindum Ă­ XML eigindi"
#: ../share/extensions/scour.inx.h:5
msgid "Group collapsing"
-msgstr ""
+msgstr "Innfelling hĂłpa"
#: ../share/extensions/scour.inx.h:6
msgid "Create groups for similar attributes"
-msgstr ""
+msgstr "BĂșa til hĂłpa fyrir svipuð eigindi"
#: ../share/extensions/scour.inx.h:7
msgid "Embed rasters"
-msgstr ""
+msgstr "Ívefja rasta"
#: ../share/extensions/scour.inx.h:8
msgid "Keep editor data"
-msgstr ""
+msgstr "Halda gögnum ritils"
#: ../share/extensions/scour.inx.h:9
msgid "Remove metadata"
-msgstr ""
+msgstr "FjarlĂŠgja lĂœsigögn"
#: ../share/extensions/scour.inx.h:10
msgid "Remove comments"
-msgstr ""
+msgstr "FjarlĂŠgja athugasemdir"
#: ../share/extensions/scour.inx.h:11
msgid "Work around renderer bugs"
-msgstr ""
+msgstr "Fara hjåleiðir framhjå myndgerðarvillum"
#: ../share/extensions/scour.inx.h:12
msgid "Enable viewboxing"
@@ -34422,15 +34872,15 @@ msgstr ""
#: ../share/extensions/scour.inx.h:13
msgid "Remove the xml declaration"
-msgstr ""
+msgstr "FjarlĂŠgja XML-skilgreiningu"
#: ../share/extensions/scour.inx.h:14
msgid "Number of significant digits for coords:"
-msgstr ""
+msgstr "Fjöldi marktÊkra tölustafa í hnitum:"
#: ../share/extensions/scour.inx.h:15
msgid "XML indentation (pretty-printing):"
-msgstr ""
+msgstr "Inndråttur XML (åferðarfalleg prentun):"
#: ../share/extensions/scour.inx.h:16
msgid "Space"
@@ -34455,7 +34905,7 @@ msgstr ""
#: ../share/extensions/scour.inx.h:21
msgid "Shorten IDs"
-msgstr ""
+msgstr "Stytta auðkenni"
#: ../share/extensions/scour.inx.h:22
msgid "Preserve manually created ID names not ending with digits"
@@ -34507,7 +34957,7 @@ msgstr ""
#: ../share/extensions/scour.inx.h:40
msgid "Help (Ids)"
-msgstr ""
+msgstr "HjĂĄlp (Ids)"
#: ../share/extensions/scour.inx.h:41
msgid ""
@@ -34538,76 +34988,70 @@ msgstr "SVG vigurteikningar (Scalable Vector Graphics)"
#: ../share/extensions/seamless_pattern.inx.h:1
msgid "Seamless Pattern"
-msgstr ""
+msgstr "Saumlaust mynstur"
#: ../share/extensions/seamless_pattern.inx.h:2
+#: ../share/extensions/seamless_pattern_procedural.inx.h:2
msgid "Custom Width (px):"
-msgstr ""
+msgstr "Sérsniðin breidd (px):"
#: ../share/extensions/seamless_pattern.inx.h:3
+#: ../share/extensions/seamless_pattern_procedural.inx.h:3
msgid "Custom Height (px):"
-msgstr ""
+msgstr "Sérsniðin hÊð (px):"
#: ../share/extensions/seamless_pattern.inx.h:4
msgid "This extension overwrite current document"
-msgstr ""
+msgstr "Þessi viðbĂłt skrifar yfir nĂșverandi skjal"
#: ../share/extensions/seamless_pattern_procedural.inx.h:1
msgid "Seamless Pattern Procedural"
-msgstr ""
-
-#: ../share/extensions/seamless_pattern_procedural.inx.h:2
-msgid "Custom Width (px.):"
-msgstr ""
-
-#: ../share/extensions/seamless_pattern_procedural.inx.h:3
-msgid "Custom Height (px.):"
-msgstr ""
+msgstr "Aðferð fyrir saumlaust mynstur"
#: ../share/extensions/setup_typography_canvas.inx.h:1
msgid "1 - Setup Typography Canvas"
-msgstr ""
+msgstr "1 - Setja upp myndflöt fyrir stafaframsetningu"
#: ../share/extensions/setup_typography_canvas.inx.h:2
msgid "Em-size:"
-msgstr ""
+msgstr "Em-stÊrð:"
#: ../share/extensions/setup_typography_canvas.inx.h:3
msgid "Ascender:"
-msgstr ""
+msgstr "HĂĄlĂ­na:"
#: ../share/extensions/setup_typography_canvas.inx.h:4
msgid "Caps Height:"
-msgstr ""
+msgstr "HĂĄstafalĂ­na:"
#: ../share/extensions/setup_typography_canvas.inx.h:5
msgid "X-Height:"
-msgstr ""
+msgstr "X-stafhÊð:"
#: ../share/extensions/setup_typography_canvas.inx.h:6
msgid "Descender:"
-msgstr ""
+msgstr "LĂĄglĂ­na:"
#: ../share/extensions/sk1_input.inx.h:1
msgid "sK1 vector graphics files input"
-msgstr ""
+msgstr "Ílag frá sK1 vigurteikningaskrám"
#: ../share/extensions/sk1_input.inx.h:2
#: ../share/extensions/sk1_output.inx.h:2
msgid "sK1 vector graphics files (*.sk1)"
-msgstr ""
+msgstr "sK1 vigurteikningaskrĂĄr (*.sk1)"
#: ../share/extensions/sk1_input.inx.h:3
msgid "Open files saved in sK1 vector graphics editor"
-msgstr ""
+msgstr "Opna skrår sem vistaðar hafa verið í sK1 vigurteikniforritinu"
#: ../share/extensions/sk1_output.inx.h:1
msgid "sK1 vector graphics files output"
-msgstr ""
+msgstr "FrĂĄlag frĂĄ sK1 vigurteikningaskrĂĄm"
#: ../share/extensions/sk1_output.inx.h:3
msgid "File format for use in sK1 vector graphics editor"
-msgstr ""
+msgstr "Skråasnið til notkunar í sK1 vigurteikniforritinu"
#: ../share/extensions/sk_input.inx.h:1
msgid "Sketch Input"
@@ -34619,11 +35063,11 @@ msgstr "Sketch skĂœringamynd (*.sk)"
#: ../share/extensions/sk_input.inx.h:3
msgid "A diagram created with the program Sketch"
-msgstr ""
+msgstr "SkĂœringamynd sem bĂșin er til með Sketch-forritinu"
#: ../share/extensions/spirograph.inx.h:1
msgid "Spirograph"
-msgstr ""
+msgstr "Spirograph hjĂłlferlar"
#: ../share/extensions/spirograph.inx.h:2
msgid "R - Ring Radius (px):"
@@ -34682,7 +35126,7 @@ msgstr "Stafir"
#: ../share/extensions/split.inx.h:9
msgid "This effect splits texts into different lines, words or letters."
-msgstr ""
+msgstr "Þessi brella skiptir texta upp í mismunandi línur, orð eða stafi."
#: ../share/extensions/straightseg.inx.h:1
msgid "Straighten Segments"
@@ -34698,7 +35142,7 @@ msgstr "Hegðun:"
#: ../share/extensions/summersnight.inx.h:1
msgid "Envelope"
-msgstr "Umslag"
+msgstr "Umgjörð"
#: ../share/extensions/svg2fxg.inx.h:1
msgid "FXG Output"
@@ -34734,7 +35178,7 @@ msgstr "Þjappað Inkscape SVG með myndskrám"
#: ../share/extensions/svg_and_media_zip_output.inx.h:2
msgid "Image zip directory:"
-msgstr "Þjöppunarmappa fyrir myndir"
+msgstr "Þjöppunarmappa fyrir myndir:"
#: ../share/extensions/svg_and_media_zip_output.inx.h:3
msgid "Add font list"
@@ -34894,14 +35338,16 @@ msgid ""
"Select your system encoding. More information at http://docs.python.org/"
"library/codecs.html#standard-encodings."
msgstr ""
+"Veldu stafatöflu kerfisins. Meiri upplĂœsingar fĂĄst ĂĄ http://docs.python.org/"
+"library/codecs.html#standard-encodings."
#: ../share/extensions/svgfont2layers.inx.h:1
msgid "Convert SVG Font to Glyph Layers"
-msgstr ""
+msgstr "Umbreyta SVG letri í staftåknalög (glyph layers)"
#: ../share/extensions/svgfont2layers.inx.h:2
msgid "Load only the first 30 glyphs (Recommended)"
-msgstr ""
+msgstr "Hlaða aðeins inn 30 fyrstu staftĂĄknunum (mĂŠlt með ĂŸessu)"
#: ../share/extensions/synfig_output.inx.h:1
msgid "Synfig Output"
@@ -34909,25 +35355,27 @@ msgstr "Synfig frĂĄlag"
#: ../share/extensions/synfig_output.inx.h:2
msgid "Synfig Animation (*.sif)"
-msgstr ""
+msgstr "Synfig teiknimynd (*.sif)"
#: ../share/extensions/synfig_output.inx.h:3
msgid "Synfig Animation written using the sif-file exporter extension"
-msgstr ""
+msgstr "Synfig teiknimynd skrifuð með sif-skrĂĄaĂștflutningsviðbĂłtinni"
#: ../share/extensions/tar_layers.inx.h:1
msgid "Collection of SVG files One per root layer"
-msgstr ""
+msgstr "Safn SVG-skrĂĄa, ein ĂĄ hvert grunnlag (root layer)"
#: ../share/extensions/tar_layers.inx.h:2
msgid "Layers as Separate SVG (*.tar)"
-msgstr ""
+msgstr "Lög sem aðskilin SVG (*.tar)"
#: ../share/extensions/tar_layers.inx.h:3
msgid ""
"Each layer split into it's own svg file and collected as a tape archive (tar "
"file)"
msgstr ""
+"Hverju lagi skipt í sína eigin SVG-skrå og öllu pakkað saman í eina tar-"
+"safnskrĂĄ"
#: ../share/extensions/text_braille.inx.h:1
msgid "Convert to Braille"
@@ -35060,15 +35508,15 @@ msgstr "Frå hlið c og hornum a, b"
#: ../share/extensions/voronoi2svg.inx.h:1
msgid "Voronoi Diagram"
-msgstr ""
+msgstr "Voronoi skĂœringamynd"
#: ../share/extensions/voronoi2svg.inx.h:3
msgid "Type of diagram:"
-msgstr ""
+msgstr "Tegund skĂœringamyndar:"
#: ../share/extensions/voronoi2svg.inx.h:4
msgid "Bounding box of the diagram:"
-msgstr ""
+msgstr "Umgjörð skĂœringamyndarinnar:"
#: ../share/extensions/voronoi2svg.inx.h:5
msgid "Show the bounding box"
@@ -35076,7 +35524,7 @@ msgstr "SĂœna umgjörð"
#: ../share/extensions/voronoi2svg.inx.h:6
msgid "Delaunay Triangulation"
-msgstr ""
+msgstr "Delaunay ĂŸrĂ­hyrningamĂŠling"
#: ../share/extensions/voronoi2svg.inx.h:7
msgid "Voronoi and Delaunay"
@@ -35084,11 +35532,11 @@ msgstr "Voronoi og Delaunay"
#: ../share/extensions/voronoi2svg.inx.h:8
msgid "Options for Voronoi diagram"
-msgstr ""
+msgstr "Valkostir fyrir Voronoi skĂœringamynd"
#: ../share/extensions/voronoi2svg.inx.h:10
msgid "Automatic from selected objects"
-msgstr ""
+msgstr "SjĂĄlfvirkt Ășt frĂĄ völdum hlutum"
#: ../share/extensions/voronoi2svg.inx.h:12
msgid ""
@@ -35102,15 +35550,15 @@ msgstr "Setja eigindi"
#: ../share/extensions/web-set-att.inx.h:3
msgid "Attribute to set:"
-msgstr ""
+msgstr "Eigindi sem å að setja:"
#: ../share/extensions/web-set-att.inx.h:4
msgid "When should the set be done:"
-msgstr ""
+msgstr "HvenĂŠr ĂĄ að setja ĂŸau:"
#: ../share/extensions/web-set-att.inx.h:5
msgid "Value to set:"
-msgstr ""
+msgstr "Gildi sem å að setja:"
#: ../share/extensions/web-set-att.inx.h:6
#: ../share/extensions/web-transmit-att.inx.h:5
@@ -35119,7 +35567,7 @@ msgstr ""
#: ../share/extensions/web-set-att.inx.h:7
msgid "Source and destination of setting:"
-msgstr ""
+msgstr "Uppruni og åfangastaður fyrir stillinguna:"
#: ../share/extensions/web-set-att.inx.h:8
#: ../share/extensions/web-transmit-att.inx.h:7
@@ -35227,27 +35675,27 @@ msgstr "Vefur"
#: ../share/extensions/web-transmit-att.inx.h:1
msgid "Transmit Attributes"
-msgstr ""
+msgstr "Miðla eigindum"
#: ../share/extensions/web-transmit-att.inx.h:3
msgid "Attribute to transmit:"
-msgstr ""
+msgstr "Eigindi sem å að miðla:"
#: ../share/extensions/web-transmit-att.inx.h:4
msgid "When to transmit:"
-msgstr ""
+msgstr "HvenÊr å að miðla:"
#: ../share/extensions/web-transmit-att.inx.h:6
msgid "Source and destination of transmitting:"
-msgstr ""
+msgstr "Uppruni og åfangastaður miðlunar:"
#: ../share/extensions/web-transmit-att.inx.h:21
msgid "All selected ones transmit to the last one"
-msgstr ""
+msgstr "Allt valið miðlar til ĂŸess síðasta"
#: ../share/extensions/web-transmit-att.inx.h:22
msgid "The first selected transmits to all others"
-msgstr ""
+msgstr "Så fyrsti miðlar til allra hinna"
#: ../share/extensions/web-transmit-att.inx.h:25
msgid ""
@@ -35263,17 +35711,17 @@ msgstr ""
#: ../share/extensions/webslicer_create_group.inx.h:1
msgid "Set a layout group"
-msgstr ""
+msgstr "Stilltu framsetningarhĂłp"
#: ../share/extensions/webslicer_create_group.inx.h:3
#: ../share/extensions/webslicer_create_rect.inx.h:18
msgid "HTML id attribute:"
-msgstr ""
+msgstr "HTML auðkenniseigindi:"
#: ../share/extensions/webslicer_create_group.inx.h:4
#: ../share/extensions/webslicer_create_rect.inx.h:19
msgid "HTML class attribute:"
-msgstr ""
+msgstr "HTML klassaeigindi:"
#: ../share/extensions/webslicer_create_group.inx.h:5
msgid "Width unit:"
@@ -35294,25 +35742,28 @@ msgstr "MynddĂ­ll (fast)"
#: ../share/extensions/webslicer_create_group.inx.h:9
msgid "Percent (relative to parent size)"
-msgstr ""
+msgstr "Prósent (miðað við stÊrð forvera)"
#: ../share/extensions/webslicer_create_group.inx.h:10
msgid "Undefined (relative to non-floating content size)"
-msgstr ""
+msgstr "Óskilgreint (miðað við stérð ekki-fljótandi innihalds)"
#: ../share/extensions/webslicer_create_group.inx.h:12
msgid ""
"Layout Group is only about to help a better code generation (if you need "
"it). To use this, you must to select some \"Slicer rectangles\" first."
msgstr ""
+"FramsetningarhĂłpur er aðeins til aðstoðar við að ĂștbĂșa betri kóða (ef ĂŸess "
+"ĂŸarf). Til að nota slĂ­kt ĂŸarftu að velja nokkra \"sneiðingarĂ©tthyrninga\" "
+"fyrst."
#: ../share/extensions/webslicer_create_group.inx.h:14
msgid "Slicer"
-msgstr ""
+msgstr "Sneiðari"
#: ../share/extensions/webslicer_create_rect.inx.h:1
msgid "Create a slicer rectangle"
-msgstr ""
+msgstr "BĂșa til rĂ©tthyrning til sneiðinga"
#: ../share/extensions/webslicer_create_rect.inx.h:4
msgid "DPI:"
@@ -35325,11 +35776,11 @@ msgstr "Þvinga stérðir:"
#. i18n. Description duplicated in a fake value attribute in order to make it translatable
#: ../share/extensions/webslicer_create_rect.inx.h:7
msgid "Force Dimension must be set as <width>x<height>"
-msgstr ""
+msgstr "Þvinga stérðir verður að vera stillt sem <width>x<height>"
#: ../share/extensions/webslicer_create_rect.inx.h:8
msgid "If set, this will replace DPI."
-msgstr ""
+msgstr "Ef stillt, mun ĂŸetta koma Ă­ stað PÁT."
#: ../share/extensions/webslicer_create_rect.inx.h:10
msgid "JPG specific options"
@@ -35344,6 +35795,8 @@ msgid ""
"0 is the lowest image quality and highest compression, and 100 is the best "
"quality but least effective compression"
msgstr ""
+"0 eru minnstu myndgÊði og mesta ĂŸjöppun, og 100 eru mestu myndgÊði en "
+"minnsta virka ĂŸjöppun"
#: ../share/extensions/webslicer_create_rect.inx.h:13
msgid "GIF specific options"
@@ -35363,43 +35816,43 @@ msgstr "Valkostir fyrir HTML-Ăștflutning"
#: ../share/extensions/webslicer_create_rect.inx.h:21
msgid "Layout disposition:"
-msgstr ""
+msgstr "Framsetning:"
#: ../share/extensions/webslicer_create_rect.inx.h:22
msgid "Positioned html block element with the image as Background"
-msgstr ""
+msgstr "Staðsett HTML blokkareining með myndina sem bakgrunn"
#: ../share/extensions/webslicer_create_rect.inx.h:23
msgid "Tiled Background (on parent group)"
-msgstr ""
+msgstr "Flísalagður bakgrunnur (å yfirhóp)"
#: ../share/extensions/webslicer_create_rect.inx.h:24
msgid "Background — repeat horizontally (on parent group)"
-msgstr ""
+msgstr "Bakgrunnur — endurtaka lĂĄrĂ©tt (ĂĄ yfirhĂłp)"
#: ../share/extensions/webslicer_create_rect.inx.h:25
msgid "Background — repeat vertically (on parent group)"
-msgstr ""
+msgstr "Bakgrunnur — endurtaka lóðrĂ©tt (ĂĄ yfirhĂłp)"
#: ../share/extensions/webslicer_create_rect.inx.h:26
msgid "Background — no repeat (on parent group)"
-msgstr ""
+msgstr "Bakgrunnur — engin endurtekning (á yfirhóp)"
#: ../share/extensions/webslicer_create_rect.inx.h:27
msgid "Positioned Image"
-msgstr ""
+msgstr "Staðsett mynd"
#: ../share/extensions/webslicer_create_rect.inx.h:28
msgid "Non Positioned Image"
-msgstr ""
+msgstr "Óstaðsett mynd"
#: ../share/extensions/webslicer_create_rect.inx.h:29
msgid "Left Floated Image"
-msgstr ""
+msgstr "Vinstri fljĂłtandi mynd"
#: ../share/extensions/webslicer_create_rect.inx.h:30
msgid "Right Floated Image"
-msgstr ""
+msgstr "HĂŠgri fljĂłtandi mynd"
#: ../share/extensions/webslicer_create_rect.inx.h:31
msgid "Position anchor:"
@@ -35443,11 +35896,11 @@ msgstr "Neðst til hÊgri"
#: ../share/extensions/webslicer_export.inx.h:1
msgid "Export layout pieces and HTML+CSS code"
-msgstr ""
+msgstr "Flytja Ășt uppsett stykki og HTML+CSS kóða"
#: ../share/extensions/webslicer_export.inx.h:3
msgid "Directory path to export:"
-msgstr ""
+msgstr "Slóð möppu til að flytja Ășt Ă­:"
#: ../share/extensions/webslicer_export.inx.h:4
msgid "Create directory, if it does not exists"
@@ -35462,6 +35915,8 @@ msgid ""
"All sliced images, and optionally - code, will be generated as you had "
"configured and saved to one directory."
msgstr ""
+"Allar myndir sneiddar, og valkvĂŠtt - kóði, verður ĂștbĂșið eins og ĂŸĂș stilltir "
+"ĂŸetta og vistað Ă­ eina möppu."
#: ../share/extensions/whirl.inx.h:1
msgid "Whirl"
@@ -35481,11 +35936,11 @@ msgstr "Víravirkishnöttur"
#: ../share/extensions/wireframe_sphere.inx.h:2
msgid "Lines of latitude:"
-msgstr ""
+msgstr "Línur å breiddargråðum:"
#: ../share/extensions/wireframe_sphere.inx.h:3
msgid "Lines of longitude:"
-msgstr ""
+msgstr "Línur å lengdargråðum:"
#: ../share/extensions/wireframe_sphere.inx.h:4
msgid "Tilt (deg):"
@@ -35493,7 +35948,7 @@ msgstr "Halli (gråður):"
#: ../share/extensions/wireframe_sphere.inx.h:7
msgid "Hide lines behind the sphere"
-msgstr ""
+msgstr "Fela línur å bak við hnöttinn"
#: ../share/extensions/wmf_input.inx.h:1
#: ../share/extensions/wmf_output.inx.h:1
diff --git a/po/ru.po b/po/ru.po
index 198fbadfa..02ff9375c 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -36990,7 +36990,7 @@ msgstr "ĐŸĐŸĐČĐ”ĐŽĐ”ĐœĐžĐ”:"
#: ../share/extensions/summersnight.inx.h:1
msgid "Envelope"
-msgstr "ĐŸĐ”Ń€ŃĐżĐ”ĐșтоĐČа"
+msgstr "ĐŸĐŸ ĐŸĐłĐžĐ±Đ°ŃŽŃ‰Đ”Đč"
#: ../share/extensions/svg2fxg.inx.h:1
#, fuzzy
diff --git a/share/CMakeLists.txt b/share/CMakeLists.txt
new file mode 100644
index 000000000..b34875502
--- /dev/null
+++ b/share/CMakeLists.txt
@@ -0,0 +1,17 @@
+add_subdirectory(attributes)
+add_subdirectory(branding)
+add_subdirectory(examples)
+add_subdirectory(extensions)
+add_subdirectory(filters)
+add_subdirectory(fonts)
+add_subdirectory(gradients)
+add_subdirectory(icons)
+add_subdirectory(keys)
+add_subdirectory(markers)
+add_subdirectory(palettes)
+add_subdirectory(patterns)
+add_subdirectory(screens)
+add_subdirectory(symbols)
+add_subdirectory(templates)
+add_subdirectory(tutorials)
+add_subdirectory(ui) \ No newline at end of file
diff --git a/share/attributes/CMakeLists.txt b/share/attributes/CMakeLists.txt
new file mode 100644
index 000000000..9b6b0de0a
--- /dev/null
+++ b/share/attributes/CMakeLists.txt
@@ -0,0 +1,2 @@
+set(_FILES "svgprops" "cssprops" "css_defaults" "README")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/attributes)
diff --git a/share/branding/CMakeLists.txt b/share/branding/CMakeLists.txt
new file mode 100644
index 000000000..ff12059ca
--- /dev/null
+++ b/share/branding/CMakeLists.txt
@@ -0,0 +1,2 @@
+file(GLOB _FILES "README" "*.svg")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/branding)
diff --git a/share/examples/CMakeLists.txt b/share/examples/CMakeLists.txt
new file mode 100644
index 000000000..be73c5a87
--- /dev/null
+++ b/share/examples/CMakeLists.txt
@@ -0,0 +1,2 @@
+file(GLOB _FILES "README" "*.svg" "*.svgz" "*.pov")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/examples)
diff --git a/share/extensions/CMakeLists.txt b/share/extensions/CMakeLists.txt
new file mode 100644
index 000000000..c167a156a
--- /dev/null
+++ b/share/extensions/CMakeLists.txt
@@ -0,0 +1,46 @@
+file(GLOB _FILES
+ "README"
+ "fontfix.conf"
+ "inkweb.js"
+ "jessyInk.js"
+ "jessyInk_core_mouseHandler_noclick.js"
+ "jessyInk_core_mouseHandler_zoomControl.js"
+ "aisvg.xslt"
+ "colors.xml"
+ "jessyInk_video.svg"
+ "seamless_pattern.svg"
+ "svg2fxg.xsl"
+ "svg2xaml.xsl"
+ "xaml2svg.xsl"
+ "inkscape.extension.rng"
+ "*.py"
+ "*.pl"
+ "*.sh"
+ "*.rb"
+ "*.inx"
+ )
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions)
+
+file(GLOB _FILES "alphabet_soup/*.svg")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions/alphabet_soup)
+
+file(GLOB _FILES "Barcode/*.py")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions/Barcode)
+
+file(GLOB _FILES "Poly3DObjects/*.obj")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions/Poly3DObjects)
+
+# file(GLOB _FILES
+# "test/*.svg"
+# "test/*.sh"
+# "test/*.py"
+# "test/*.js"
+# "test/run-all-extension-tests"
+# )
+# install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions/test)
+
+file(GLOB _FILES "ink2canvas/*.py")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions/ink2canvas)
+
+file(GLOB _FILES "xaml2svg/*.xsl")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions/xaml2svg)
diff --git a/share/extensions/synfig_prepare.py b/share/extensions/synfig_prepare.py
index c6ad48c97..ebc50fd8e 100755
--- a/share/extensions/synfig_prepare.py
+++ b/share/extensions/synfig_prepare.py
@@ -86,7 +86,7 @@ class InkscapeActionGroup(object):
def select_id(self, object_id):
"""Select object with given id"""
- self.command += "--select='%s' " % (object_id)
+ self.command += "--select=%s " % (object_id)
if not self.has_selection:
self.has_selection = True
diff --git a/share/filters/CMakeLists.txt b/share/filters/CMakeLists.txt
new file mode 100644
index 000000000..6b5356e53
--- /dev/null
+++ b/share/filters/CMakeLists.txt
@@ -0,0 +1,10 @@
+add_custom_command(
+ OUTPUT filters.svg.h
+ COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/i18n.py ${CMAKE_CURRENT_SOURCE_DIR}/filters.svg > ${CMAKE_CURRENT_BINARY_DIR}/filters.svg.h
+ MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/filters.svg
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/i18n.py
+)
+add_custom_target(filters.svg.h ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/filters.svg.h)
+
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/filters.svg.h DESTINATION ${SHARE_INSTALL}/inkscape/filters)
+install(FILES "filters.svg" "README" DESTINATION ${SHARE_INSTALL}/inkscape/filters)
diff --git a/share/fonts/CMakeLists.txt b/share/fonts/CMakeLists.txt
new file mode 100644
index 000000000..d8d9e3684
--- /dev/null
+++ b/share/fonts/CMakeLists.txt
@@ -0,0 +1 @@
+install(FILES "README" DESTINATION ${SHARE_INSTALL}/inkscape/fonts)
diff --git a/share/gradients/CMakeLists.txt b/share/gradients/CMakeLists.txt
new file mode 100644
index 000000000..ec5e388af
--- /dev/null
+++ b/share/gradients/CMakeLists.txt
@@ -0,0 +1 @@
+install(FILES "README" DESTINATION ${SHARE_INSTALL}/inkscape/gradients)
diff --git a/share/icons/CMakeLists.txt b/share/icons/CMakeLists.txt
new file mode 100644
index 000000000..d4994a694
--- /dev/null
+++ b/share/icons/CMakeLists.txt
@@ -0,0 +1,6 @@
+add_subdirectory(application)
+
+file(GLOB _FILES "*.svg" "*.jpg" "*.png" "README")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/icons)
+
+install(FILES ../branding/inkscape.svg DESTINATION ${SHARE_INSTALL}/inkscape/icons)
diff --git a/share/icons/application/CMakeLists.txt b/share/icons/application/CMakeLists.txt
new file mode 100644
index 000000000..f93b4068e
--- /dev/null
+++ b/share/icons/application/CMakeLists.txt
@@ -0,0 +1,9 @@
+set(PIXMAP_SIZES "16x16" "22x22" "24x24" "32x32" "48x48" "256x256")
+set(THEME hicolor)
+foreach(pixmap_size ${PIXMAP_SIZES})
+ FILE(GLOB PIXMAP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${pixmap_size}/*.png ${CMAKE_CURRENT_SOURCE_DIR}/${pixmap_size}/*.svg)
+ install(FILES ${PIXMAP_FILES} DESTINATION ${SHARE_INSTALL}/icons/${THEME}/${pixmap_size}/apps)
+endforeach(pixmap_size)
+
+# I hope that this is actually run after installing the files.
+install(CODE "execute_process(COMMAND gtk-update-icon-cache -f -t ${CMAKE_INSTALL_PREFIX}/${SHARE_INSTALL}/icons/${THEME})") \ No newline at end of file
diff --git a/share/keys/CMakeLists.txt b/share/keys/CMakeLists.txt
new file mode 100644
index 000000000..e968007dc
--- /dev/null
+++ b/share/keys/CMakeLists.txt
@@ -0,0 +1,2 @@
+file(GLOB _FILES "*.xml")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/keys)
diff --git a/share/markers/CMakeLists.txt b/share/markers/CMakeLists.txt
new file mode 100644
index 000000000..410df1cf4
--- /dev/null
+++ b/share/markers/CMakeLists.txt
@@ -0,0 +1,2 @@
+file(GLOB _FILES "*.svg")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/markers)
diff --git a/share/palettes/CMakeLists.txt b/share/palettes/CMakeLists.txt
new file mode 100644
index 000000000..77b4b2a37
--- /dev/null
+++ b/share/palettes/CMakeLists.txt
@@ -0,0 +1,13 @@
+set(I18N_FILES "inkscape.gpl" "svg.gpl" "Tango-Palette.gpl")
+
+add_custom_command(
+ OUTPUT palettes.h
+ COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/i18n.py ${I18N_FILES} > ${CMAKE_CURRENT_BINARY_DIR}/palettes.h
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/i18n.py ${I18N_FILES}
+)
+add_custom_target(palettes.h ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/palettes.h)
+
+file(GLOB _FILES "*.gpl")
+
+install(FILES ${_FILES} "README" ${CMAKE_CURRENT_BINARY_DIR}/palettes.h DESTINATION ${SHARE_INSTALL}/inkscape/palettes)
diff --git a/share/patterns/CMakeLists.txt b/share/patterns/CMakeLists.txt
new file mode 100644
index 000000000..98415b225
--- /dev/null
+++ b/share/patterns/CMakeLists.txt
@@ -0,0 +1,10 @@
+add_custom_command(
+ OUTPUT patterns.svg.h
+ COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/i18n.py ${CMAKE_CURRENT_SOURCE_DIR}/patterns.svg > ${CMAKE_CURRENT_BINARY_DIR}/patterns.svg.h
+ MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/patterns.svg
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/i18n.py
+)
+add_custom_target(patterns.svg.h ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/patterns.svg.h)
+
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/patterns.svg.h DESTINATION ${SHARE_INSTALL}/inkscape/patterns)
+install(FILES "patterns.svg" "README" DESTINATION ${SHARE_INSTALL}/inkscape/patterns) \ No newline at end of file
diff --git a/share/screens/CMakeLists.txt b/share/screens/CMakeLists.txt
new file mode 100644
index 000000000..b8b848708
--- /dev/null
+++ b/share/screens/CMakeLists.txt
@@ -0,0 +1,2 @@
+file(GLOB _FILES "README" "*.svg")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/screens)
diff --git a/share/symbols/CMakeLists.txt b/share/symbols/CMakeLists.txt
new file mode 100644
index 000000000..ef44c89e4
--- /dev/null
+++ b/share/symbols/CMakeLists.txt
@@ -0,0 +1,11 @@
+file(GLOB _FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.svg")
+
+add_custom_command(
+ OUTPUT symbols.h
+ COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/i18n.py ${_FILES} > ${CMAKE_CURRENT_BINARY_DIR}/symbols.h
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/i18n.py ${_FILES}
+)
+add_custom_target(symbols.h ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/symbols.h)
+
+install(FILES ${_FILES} "README" ${CMAKE_CURRENT_BINARY_DIR}/symbols.h DESTINATION ${SHARE_INSTALL}/inkscape/symbols)
diff --git a/share/templates/CMakeLists.txt b/share/templates/CMakeLists.txt
new file mode 100644
index 000000000..eee5b4458
--- /dev/null
+++ b/share/templates/CMakeLists.txt
@@ -0,0 +1,11 @@
+file(GLOB _FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.svg")
+
+add_custom_command(
+ OUTPUT templates.h
+ COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/i18n.py ${_FILES} > ${CMAKE_CURRENT_BINARY_DIR}/templates.h
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/i18n.py ${_FILES}
+)
+add_custom_target(templates.h ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/templates.h)
+
+install(FILES ${_FILES} "README" ${CMAKE_CURRENT_BINARY_DIR}/templates.h DESTINATION ${SHARE_INSTALL}/inkscape/templates)
diff --git a/share/tutorials/CMakeLists.txt b/share/tutorials/CMakeLists.txt
new file mode 100644
index 000000000..f8491bf32
--- /dev/null
+++ b/share/tutorials/CMakeLists.txt
@@ -0,0 +1,2 @@
+file(GLOB _FILES "README" "*.svg" "*.jpg" "*.png")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/tutorials)
diff --git a/share/ui/CMakeLists.txt b/share/ui/CMakeLists.txt
new file mode 100644
index 000000000..89b9f9b0f
--- /dev/null
+++ b/share/ui/CMakeLists.txt
@@ -0,0 +1,3 @@
+file(GLOB _FILES "*.xml" "*.rc")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/ui)
+
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 27c5e49db..efb604aca 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -519,7 +519,7 @@ add_dependencies(inkscape inkscape_version)
target_link_libraries(inkscape
# order from automake
#sp_LIB
- nrtype_LIB
+ #nrtype_LIB
#inkscape_LIB
#sp_LIB # annoying, we need both!
diff --git a/src/attributes.cpp b/src/attributes.cpp
index 568f0528a..af19360c1 100644
--- a/src/attributes.cpp
+++ b/src/attributes.cpp
@@ -419,6 +419,16 @@ static SPStyleProp const props[] = {
{SP_PROP_FONT_STYLE, "font-style"},
{SP_PROP_FONT_VARIANT, "font-variant"},
{SP_PROP_FONT_WEIGHT, "font-weight"},
+
+ /* Font Variants CSS 3 */
+ {SP_PROP_FONT_VARIANT_LIGATURES, "font-variant-ligatures"},
+ {SP_PROP_FONT_VARIANT_POSITION, "font-variant-position"},
+ {SP_PROP_FONT_VARIANT_CAPS, "font-variant-caps"},
+ {SP_PROP_FONT_VARIANT_NUMERIC, "font-variant-numeric"},
+ {SP_PROP_FONT_VARIANT_ALTERNATES, "font-variant-alternates"},
+ {SP_PROP_FONT_VARIANT_EAST_ASIAN, "font-variant-east-asian"},
+ {SP_PROP_FONT_FEATURE_SETTINGS, "font-feature-settings"},
+
/* Text */
{SP_PROP_TEXT_INDENT, "text-indent"},
{SP_PROP_TEXT_ALIGN, "text-align"},
@@ -426,6 +436,7 @@ static SPStyleProp const props[] = {
{SP_PROP_LETTER_SPACING, "letter-spacing"},
{SP_PROP_WORD_SPACING, "word-spacing"},
{SP_PROP_TEXT_TRANSFORM, "text-transform"},
+
/* Text (css3) */
{SP_PROP_DIRECTION, "direction"},
{SP_PROP_BLOCK_PROGRESSION, "block-progression"},
@@ -439,16 +450,21 @@ static SPStyleProp const props[] = {
{SP_PROP_KERNING, "kerning"},
{SP_PROP_TEXT_ANCHOR, "text-anchor"},
{SP_PROP_WHITE_SPACE, "white-space"},
+
/* SVG 2 Text Wrapping */
{SP_PROP_SHAPE_INSIDE, "shape-inside"},
{SP_PROP_SHAPE_OUTSIDE, "shape-outside"},
{SP_PROP_SHAPE_PADDING, "shape-padding"},
{SP_PROP_SHAPE_MARGIN, "shape-margin"},
+
/* Text Decoration */
- {SP_PROP_TEXT_DECORATION, "text-decoration"},
- {SP_PROP_TEXT_DECORATION_LINE, "text-decoration-line"},
- {SP_PROP_TEXT_DECORATION_STYLE,"text-decoration-style"},
- {SP_PROP_TEXT_DECORATION_COLOR,"text-decoration-color"},
+ {SP_PROP_TEXT_DECORATION, "text-decoration"},
+ {SP_PROP_TEXT_DECORATION_LINE, "text-decoration-line"},
+ {SP_PROP_TEXT_DECORATION_STYLE, "text-decoration-style"},
+ {SP_PROP_TEXT_DECORATION_COLOR, "text-decoration-color"},
+ {SP_PROP_TEXT_DECORATION_FILL, "text-decoration-fill"},
+ {SP_PROP_TEXT_DECORATION_STROKE,"text-decoration-stroke"},
+
/* Misc */
{SP_PROP_CLIP, "clip"},
{SP_PROP_COLOR, "color"},
diff --git a/src/attributes.h b/src/attributes.h
index 91c8868f9..7d6ea70a0 100644
--- a/src/attributes.h
+++ b/src/attributes.h
@@ -424,6 +424,15 @@ enum SPAttributeEnum {
SP_PROP_FONT_VARIANT,
SP_PROP_FONT_WEIGHT,
+ /* Font Variants CSS 3 */
+ SP_PROP_FONT_VARIANT_LIGATURES,
+ SP_PROP_FONT_VARIANT_POSITION,
+ SP_PROP_FONT_VARIANT_CAPS,
+ SP_PROP_FONT_VARIANT_NUMERIC,
+ SP_PROP_FONT_VARIANT_ALTERNATES,
+ SP_PROP_FONT_VARIANT_EAST_ASIAN,
+ SP_PROP_FONT_FEATURE_SETTINGS,
+
/* Text Layout */
SP_PROP_TEXT_INDENT,
SP_PROP_TEXT_ALIGN,
@@ -446,16 +455,20 @@ enum SPAttributeEnum {
SP_PROP_TEXT_ANCHOR,
SP_PROP_WHITE_SPACE,
+ /* SVG 2 Text Wrapping */
SP_PROP_SHAPE_INSIDE,
SP_PROP_SHAPE_OUTSIDE,
SP_PROP_SHAPE_PADDING,
SP_PROP_SHAPE_MARGIN,
- /* Text Decoration */
- SP_PROP_TEXT_DECORATION, /* SVG 1 underline etc.( no color or style) OR SVG2 with _LINE, _STYLE, _COLOR values */
- SP_PROP_TEXT_DECORATION_LINE, /* SVG 2 underline etc. */
- SP_PROP_TEXT_DECORATION_STYLE, /* SVG 2 proposed solid [SVG 1], dotted, etc.)*/
- SP_PROP_TEXT_DECORATION_COLOR, /* SVG 2 proposed same as text [SVG 1], specified*/
+ /* Text Decoration CSS 2/CSS 3 Shorthand */
+ SP_PROP_TEXT_DECORATION,
+ /* Text Decoration CSS 3/SVG 2 */
+ SP_PROP_TEXT_DECORATION_LINE,
+ SP_PROP_TEXT_DECORATION_STYLE,
+ SP_PROP_TEXT_DECORATION_COLOR,
+ SP_PROP_TEXT_DECORATION_FILL,
+ SP_PROP_TEXT_DECORATION_STROKE,
/* Misc */
SP_PROP_CLIP,
diff --git a/src/conn-avoid-ref.cpp b/src/conn-avoid-ref.cpp
index 4a49bf645..ec9aba793 100644
--- a/src/conn-avoid-ref.cpp
+++ b/src/conn-avoid-ref.cpp
@@ -252,8 +252,9 @@ static std::vector<Geom::Point> approxItemWithPoints(SPItem const *item, const G
{
SPGroup* group = SP_GROUP(item);
// consider all first-order children
- for (GSList const* i = sp_item_group_item_list(group); i != NULL; i = i->next) {
- SPItem* child_item = SP_ITEM(i->data);
+ std::vector<SPItem*> itemlist = sp_item_group_item_list(group);
+ for (std::vector<SPItem*>::const_iterator i = itemlist.begin(); i != itemlist.end(); i++) {
+ SPItem* child_item = *i;
std::vector<Geom::Point> child_points = approxItemWithPoints(child_item, item_transform * child_item->transform);
poly_points.insert(poly_points.end(), child_points.begin(), child_points.end());
}
diff --git a/src/desktop-style.cpp b/src/desktop-style.cpp
index c713e0d61..afdc3064a 100644
--- a/src/desktop-style.cpp
+++ b/src/desktop-style.cpp
@@ -194,10 +194,10 @@ sp_desktop_set_style(SPDesktop *desktop, SPCSSAttr *css, bool change, bool write
sp_repr_css_merge(css_write, css);
sp_css_attr_unset_uris(css_write);
prefs->mergeStyle("/desktop/style", css_write);
-
- for (const GSList *i = desktop->selection->itemList(); i != NULL; i = i->next) {
+ std::vector<SPItem*> const itemlist = desktop->selection->itemList();
+ for (std::vector<SPItem*>::const_iterator i = itemlist.begin(); i!= itemlist.end(); i++) {
/* last used styles for 3D box faces are stored separately */
- SPObject *obj = reinterpret_cast<SPObject *>(i->data); // TODO unsafe until Selection is refactored.
+ SPObject *obj = *i;
Box3DSide *side = dynamic_cast<Box3DSide *>(obj);
if (side) {
const char * descr = box3d_side_axes_string(side);
@@ -234,8 +234,9 @@ sp_desktop_set_style(SPDesktop *desktop, SPCSSAttr *css, bool change, bool write
sp_repr_css_merge(css_no_text, css);
css_no_text = sp_css_attr_unset_text(css_no_text);
- for (GSList const *i = desktop->selection->itemList(); i != NULL; i = i->next) {
- SPItem *item = reinterpret_cast<SPItem *>(i->data);
+ std::vector<SPItem*> const itemlist = desktop->selection->itemList();
+ for (std::vector<SPItem*>::const_iterator i = itemlist.begin(); i!= itemlist.end(); i++) {
+ SPItem *item = *i;
// If not text, don't apply text attributes (can a group have text attributes? Yes! FIXME)
if (isTextualItem(item)) {
@@ -438,18 +439,16 @@ sp_desktop_get_font_size_tool(SPDesktop *desktop)
/** Determine average stroke width, simple method */
// see TODO in dialogs/stroke-style.cpp on how to get rid of this eventually
gdouble
-stroke_average_width (GSList const *objects)
+stroke_average_width (const std::vector<SPItem*> &objects)
{
- if (g_slist_length ((GSList *) objects) == 0)
+ if (objects.empty())
return Geom::infinity();
gdouble avgwidth = 0.0;
bool notstroked = true;
int n_notstroked = 0;
-
- for (GSList const *l = objects; l != NULL; l = l->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(l->data);
- SPItem *item = dynamic_cast<SPItem *>(obj);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ SPItem *item = *i;
if (!item) {
continue;
}
@@ -471,7 +470,7 @@ stroke_average_width (GSList const *objects)
if (notstroked)
return Geom::infinity();
- return avgwidth / (g_slist_length ((GSList *) objects) - n_notstroked);
+ return avgwidth / (objects.size() - n_notstroked);
}
static bool vectorsClose( std::vector<double> const &lhs, std::vector<double> const &rhs )
@@ -492,9 +491,9 @@ static bool vectorsClose( std::vector<double> const &lhs, std::vector<double> co
* Write to style_res the average fill or stroke of list of objects, if applicable.
*/
int
-objects_query_fillstroke (GSList *objects, SPStyle *style_res, bool const isfill)
+objects_query_fillstroke (const std::vector<SPItem*> &objects, SPStyle *style_res, bool const isfill)
{
- if (g_slist_length(objects) == 0) {
+ if (objects.empty()) {
/* No objects, set empty */
return QUERY_STYLE_NOTHING;
}
@@ -514,8 +513,8 @@ objects_query_fillstroke (GSList *objects, SPStyle *style_res, bool const isfill
prev[0] = prev[1] = prev[2] = 0.0;
bool same_color = true;
- for (GSList const *i = objects; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i!= objects.end(); i++) {
+ SPObject *obj = *i;
if (!obj) {
continue;
}
@@ -674,7 +673,7 @@ objects_query_fillstroke (GSList *objects, SPStyle *style_res, bool const isfill
}
// Not color
- if (g_slist_length(objects) > 1) {
+ if (objects.size() > 1) {
return QUERY_STYLE_MULTIPLE_SAME;
} else {
return QUERY_STYLE_SINGLE;
@@ -685,9 +684,9 @@ objects_query_fillstroke (GSList *objects, SPStyle *style_res, bool const isfill
* Write to style_res the average opacity of a list of objects.
*/
int
-objects_query_opacity (GSList *objects, SPStyle *style_res)
+objects_query_opacity (const std::vector<SPItem*> &objects, SPStyle *style_res)
{
- if (g_slist_length(objects) == 0) {
+ if (objects.empty()) {
/* No objects, set empty */
return QUERY_STYLE_NOTHING;
}
@@ -698,8 +697,8 @@ objects_query_opacity (GSList *objects, SPStyle *style_res)
guint opacity_items = 0;
- for (GSList const *i = objects; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ SPObject *obj = *i;
if (!obj) {
continue;
}
@@ -739,9 +738,9 @@ objects_query_opacity (GSList *objects, SPStyle *style_res)
* Write to style_res the average stroke width of a list of objects.
*/
int
-objects_query_strokewidth (GSList *objects, SPStyle *style_res)
+objects_query_strokewidth (const std::vector<SPItem*> &objects, SPStyle *style_res)
{
- if (g_slist_length(objects) == 0) {
+ if (objects.empty()) {
/* No objects, set empty */
return QUERY_STYLE_NOTHING;
}
@@ -754,8 +753,8 @@ objects_query_strokewidth (GSList *objects, SPStyle *style_res)
int n_stroked = 0;
- for (GSList const *i = objects; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ SPObject *obj = *i;
if (!obj) {
continue;
}
@@ -815,9 +814,9 @@ objects_query_strokewidth (GSList *objects, SPStyle *style_res)
* Write to style_res the average miter limit of a list of objects.
*/
int
-objects_query_miterlimit (GSList *objects, SPStyle *style_res)
+objects_query_miterlimit (const std::vector<SPItem*> &objects, SPStyle *style_res)
{
- if (g_slist_length(objects) == 0) {
+ if (objects.empty()) {
/* No objects, set empty */
return QUERY_STYLE_NOTHING;
}
@@ -828,8 +827,8 @@ objects_query_miterlimit (GSList *objects, SPStyle *style_res)
gdouble prev_ml = -1;
bool same_ml = true;
- for (GSList const *i = objects; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ SPObject *obj = *i;
if (!dynamic_cast<SPItem *>(obj)) {
continue;
}
@@ -875,9 +874,9 @@ objects_query_miterlimit (GSList *objects, SPStyle *style_res)
* Write to style_res the stroke cap of a list of objects.
*/
int
-objects_query_strokecap (GSList *objects, SPStyle *style_res)
+objects_query_strokecap (const std::vector<SPItem*> &objects, SPStyle *style_res)
{
- if (g_slist_length(objects) == 0) {
+ if (objects.empty()) {
/* No objects, set empty */
return QUERY_STYLE_NOTHING;
}
@@ -887,8 +886,8 @@ objects_query_strokecap (GSList *objects, SPStyle *style_res)
bool same_cap = true;
int n_stroked = 0;
- for (GSList const *i = objects; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ SPObject *obj = *i;
if (!dynamic_cast<SPItem *>(obj)) {
continue;
}
@@ -929,9 +928,9 @@ objects_query_strokecap (GSList *objects, SPStyle *style_res)
* Write to style_res the stroke join of a list of objects.
*/
int
-objects_query_strokejoin (GSList *objects, SPStyle *style_res)
+objects_query_strokejoin (const std::vector<SPItem*> &objects, SPStyle *style_res)
{
- if (g_slist_length(objects) == 0) {
+ if (objects.empty()) {
/* No objects, set empty */
return QUERY_STYLE_NOTHING;
}
@@ -941,8 +940,8 @@ objects_query_strokejoin (GSList *objects, SPStyle *style_res)
bool same_join = true;
int n_stroked = 0;
- for (GSList const *i = objects; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ SPObject *obj = *i;
if (!dynamic_cast<SPItem *>(obj)) {
continue;
}
@@ -984,7 +983,7 @@ objects_query_strokejoin (GSList *objects, SPStyle *style_res)
* Write to style_res the average font size and spacing of objects.
*/
int
-objects_query_fontnumbers (GSList *objects, SPStyle *style_res)
+objects_query_fontnumbers (const std::vector<SPItem*> &objects, SPStyle *style_res)
{
bool different = false;
@@ -1004,8 +1003,8 @@ objects_query_fontnumbers (GSList *objects, SPStyle *style_res)
int texts = 0;
int no_size = 0;
- for (GSList const *i = objects; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ SPObject *obj = *i;
if (!isTextualItem(obj)) {
continue;
@@ -1116,15 +1115,15 @@ objects_query_fontnumbers (GSList *objects, SPStyle *style_res)
* Write to style_res the average font style of objects.
*/
int
-objects_query_fontstyle (GSList *objects, SPStyle *style_res)
+objects_query_fontstyle (const std::vector<SPItem*> &objects, SPStyle *style_res)
{
bool different = false;
bool set = false;
int texts = 0;
- for (GSList const *i = objects; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ SPObject *obj = *i;
if (!isTextualItem(obj)) {
continue;
@@ -1173,7 +1172,7 @@ objects_query_fontstyle (GSList *objects, SPStyle *style_res)
* Write to style_res the baseline numbers.
*/
static int
-objects_query_baselines (GSList *objects, SPStyle *style_res)
+objects_query_baselines (const std::vector<SPItem*> &objects, SPStyle *style_res)
{
bool different = false;
@@ -1192,8 +1191,8 @@ objects_query_baselines (GSList *objects, SPStyle *style_res)
int texts = 0;
- for (GSList const *i = objects; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ SPObject *obj = *i;
if (!isTextualItem(obj)) {
continue;
@@ -1269,7 +1268,7 @@ objects_query_baselines (GSList *objects, SPStyle *style_res)
* Write to style_res the average font family of objects.
*/
int
-objects_query_fontfamily (GSList *objects, SPStyle *style_res)
+objects_query_fontfamily (const std::vector<SPItem*> &objects, SPStyle *style_res)
{
bool different = false;
int texts = 0;
@@ -1280,8 +1279,8 @@ objects_query_fontfamily (GSList *objects, SPStyle *style_res)
}
style_res->font_family.set = FALSE;
- for (GSList const *i = objects; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ SPObject *obj = *i;
// std::cout << " " << reinterpret_cast<SPObject*>(i->data)->getId() << std::endl;
if (!isTextualItem(obj)) {
@@ -1325,7 +1324,7 @@ objects_query_fontfamily (GSList *objects, SPStyle *style_res)
}
static int
-objects_query_fontspecification (GSList *objects, SPStyle *style_res)
+objects_query_fontspecification (const std::vector<SPItem*> &objects, SPStyle *style_res)
{
bool different = false;
int texts = 0;
@@ -1336,8 +1335,8 @@ objects_query_fontspecification (GSList *objects, SPStyle *style_res)
}
style_res->font_specification.set = FALSE;
- for (GSList const *i = objects; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ SPObject *obj = *i;
// std::cout << " " << reinterpret_cast<SPObject*>(i->data)->getId() << std::endl;
if (!isTextualItem(obj)) {
@@ -1385,7 +1384,7 @@ objects_query_fontspecification (GSList *objects, SPStyle *style_res)
}
static int
-objects_query_blend (GSList *objects, SPStyle *style_res)
+objects_query_blend (const std::vector<SPItem*> &objects, SPStyle *style_res)
{
const int empty_prev = -2;
const int complex_filter = 5;
@@ -1394,8 +1393,8 @@ objects_query_blend (GSList *objects, SPStyle *style_res)
bool same_blend = true;
guint items = 0;
- for (GSList const *i = objects; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ SPObject *obj = *i;
if (!obj) {
continue;
}
@@ -1471,9 +1470,9 @@ objects_query_blend (GSList *objects, SPStyle *style_res)
* Write to style_res the average blurring of a list of objects.
*/
int
-objects_query_blur (GSList *objects, SPStyle *style_res)
+objects_query_blur (const std::vector<SPItem*> &objects, SPStyle *style_res)
{
- if (g_slist_length(objects) == 0) {
+ if (objects.empty()) {
/* No objects, set empty */
return QUERY_STYLE_NOTHING;
}
@@ -1484,8 +1483,8 @@ objects_query_blur (GSList *objects, SPStyle *style_res)
guint blur_items = 0;
guint items = 0;
- for (GSList const *i = objects; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = objects.begin(); i != objects.end(); i++) {
+ SPObject *obj = *i;
if (!obj) {
continue;
}
@@ -1553,7 +1552,7 @@ objects_query_blur (GSList *objects, SPStyle *style_res)
* the result to style, return appropriate flag.
*/
int
-sp_desktop_query_style_from_list (GSList *list, SPStyle *style, int property)
+sp_desktop_query_style_from_list (const std::vector<SPItem*> &list, SPStyle *style, int property)
{
if (property == QUERY_STYLE_PROPERTY_FILL) {
return objects_query_fillstroke (list, style, true);
@@ -1606,7 +1605,7 @@ sp_desktop_query_style(SPDesktop *desktop, SPStyle *style, int property)
// otherwise, do querying and averaging over selection
if (desktop->selection != NULL) {
- return sp_desktop_query_style_from_list ((GSList *) desktop->selection->itemList(), style, property);
+ return sp_desktop_query_style_from_list (desktop->selection->itemList(), style, property);
}
return QUERY_STYLE_NOTHING;
diff --git a/src/desktop-style.h b/src/desktop-style.h
index 40ca27e9e..a72f49776 100644
--- a/src/desktop-style.h
+++ b/src/desktop-style.h
@@ -17,6 +17,7 @@ class ColorRGBA;
class SPCSSAttr;
class SPDesktop;
class SPObject;
+class SPItem;
class SPStyle;
typedef struct _GSList GSList;
namespace Inkscape {
@@ -64,21 +65,21 @@ guint32 sp_desktop_get_color_tool(SPDesktop *desktop, Glib::ustring const &tool,
double sp_desktop_get_font_size_tool (SPDesktop *desktop);
void sp_desktop_apply_style_tool(SPDesktop *desktop, Inkscape::XML::Node *repr, Glib::ustring const &tool, bool with_text);
-gdouble stroke_average_width (GSList const *objects);
+gdouble stroke_average_width (const std::vector<SPItem*> &objects);
-int objects_query_fillstroke (GSList *objects, SPStyle *style_res, bool const isfill);
-int objects_query_fontnumbers (GSList *objects, SPStyle *style_res);
-int objects_query_fontstyle (GSList *objects, SPStyle *style_res);
-int objects_query_fontfamily (GSList *objects, SPStyle *style_res);
-int objects_query_opacity (GSList *objects, SPStyle *style_res);
-int objects_query_strokewidth (GSList *objects, SPStyle *style_res);
-int objects_query_miterlimit (GSList *objects, SPStyle *style_res);
-int objects_query_strokecap (GSList *objects, SPStyle *style_res);
-int objects_query_strokejoin (GSList *objects, SPStyle *style_res);
+int objects_query_fillstroke (const std::vector<SPItem*> &objects, SPStyle *style_res, bool const isfill);
+int objects_query_fontnumbers (const std::vector<SPItem*> &objects, SPStyle *style_res);
+int objects_query_fontstyle (const std::vector<SPItem*> &objects, SPStyle *style_res);
+int objects_query_fontfamily (const std::vector<SPItem*> &objects, SPStyle *style_res);
+int objects_query_opacity (const std::vector<SPItem*> &objects, SPStyle *style_res);
+int objects_query_strokewidth (const std::vector<SPItem*> &objects, SPStyle *style_res);
+int objects_query_miterlimit (const std::vector<SPItem*> &objects, SPStyle *style_res);
+int objects_query_strokecap (const std::vector<SPItem*> &objects, SPStyle *style_res);
+int objects_query_strokejoin (const std::vector<SPItem*> &objects, SPStyle *style_res);
-int objects_query_blur (GSList *objects, SPStyle *style_res);
+int objects_query_blur (const std::vector<SPItem*> &objects, SPStyle *style_res);
-int sp_desktop_query_style_from_list (GSList *list, SPStyle *style, int property);
+int sp_desktop_query_style_from_list (const std::vector<SPItem*> &list, SPStyle *style, int property);
int sp_desktop_query_style(SPDesktop *desktop, SPStyle *style, int property);
bool sp_desktop_query_style_all (SPDesktop *desktop, SPStyle *query);
diff --git a/src/desktop.cpp b/src/desktop.cpp
index 1152184c9..02df50c6b 100644
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
@@ -716,7 +716,7 @@ Inkscape::UI::Widget::Dock* SPDesktop::getDock() {
/**
* \see SPDocument::getItemFromListAtPointBottom()
*/
-SPItem *SPDesktop::getItemFromListAtPointBottom(const GSList *list, Geom::Point const &p) const
+SPItem *SPDesktop::getItemFromListAtPointBottom(const std::vector<SPItem*> &list, Geom::Point const &p) const
{
g_return_val_if_fail (doc() != NULL, NULL);
return SPDocument::getItemFromListAtPointBottom(dkey, doc()->getRoot(), list, p);
@@ -947,7 +947,6 @@ void SPDesktop::zoom_quick(bool enable)
if (!zoomed) {
zoom_relative(_quick_zoom_stored_area.midpoint()[Geom::X], _quick_zoom_stored_area.midpoint()[Geom::Y], 2.0);
- zoomed = true;
}
} else {
set_display_area(_quick_zoom_stored_area, false);
diff --git a/src/desktop.h b/src/desktop.h
index a0b9592d0..754e09766 100644
--- a/src/desktop.h
+++ b/src/desktop.h
@@ -319,7 +319,7 @@ public:
//void push_event_context (GType type, const gchar *config, unsigned int key);
void set_coordinate_status (Geom::Point p);
- SPItem *getItemFromListAtPointBottom(const GSList *list, Geom::Point const &p) const;
+ SPItem *getItemFromListAtPointBottom(const std::vector<SPItem*> &list, Geom::Point const &p) const;
SPItem *getItemAtPoint(Geom::Point const &p, bool into_groups, SPItem *upto = NULL) const;
SPItem *getGroupAtPoint(Geom::Point const &p) const;
Geom::Point point() const;
diff --git a/src/dir-util.cpp b/src/dir-util.cpp
index c9b88b007..64f7ab7e7 100644
--- a/src/dir-util.cpp
+++ b/src/dir-util.cpp
@@ -217,7 +217,7 @@ erange:
return (NULL);
}
-gchar *prepend_current_dir_if_relative(gchar const *uri)
+char *prepend_current_dir_if_relative(gchar const *uri)
{
if (!uri) {
return NULL;
diff --git a/src/dir-util.h b/src/dir-util.h
index e78cad6a6..327e1ad5f 100644
--- a/src/dir-util.h
+++ b/src/dir-util.h
@@ -12,7 +12,7 @@
#include <cstdlib>
#include <string>
-/**
+/**
* Returns a form of \a path relative to \a base if that is easy to construct (eg if \a path
* appears to be in the directory specified by \a base), otherwise returns \a path.
*
@@ -49,7 +49,7 @@ char *inkscape_rel2abs(char const *path, char const *base, char *result, size_t
char *inkscape_abs2rel(char const *path, char const *base, char *result, size_t const size);
-gchar *prepend_current_dir_if_relative(char const *filename);
+char *prepend_current_dir_if_relative(char const *filename);
#endif // !SEEN_DIR_UTIL_H
diff --git a/src/display/canvas-arena.cpp b/src/display/canvas-arena.cpp
index 8738b93e4..ec99eca9a 100644
--- a/src/display/canvas-arena.cpp
+++ b/src/display/canvas-arena.cpp
@@ -290,7 +290,7 @@ sp_canvas_arena_event (SPCanvasItem *item, GdkEvent *event)
ret = sp_canvas_arena_send_event (arena, (GdkEvent *) &ec);
}
}
- ret = sp_canvas_arena_send_event (arena, event);
+ ret = ret || sp_canvas_arena_send_event (arena, event);
break;
case GDK_SCROLL: {
diff --git a/src/display/canvas-axonomgrid.cpp b/src/display/canvas-axonomgrid.cpp
index a2df86823..1794ccbab 100644
--- a/src/display/canvas-axonomgrid.cpp
+++ b/src/display/canvas-axonomgrid.cpp
@@ -17,10 +17,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/label.h>
diff --git a/src/display/canvas-grid.cpp b/src/display/canvas-grid.cpp
index 9b9f64529..decf93626 100644
--- a/src/display/canvas-grid.cpp
+++ b/src/display/canvas-grid.cpp
@@ -17,10 +17,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/label.h>
@@ -910,7 +906,7 @@ CanvasXYGrid::Render (SPCanvasBuf *buf)
gdouble const syg = floor ((buf->rect.top() - ow[Geom::Y]) / sw[Geom::Y]) * sw[Geom::Y] + ow[Geom::Y];
gint const ylinestart = round((syg - ow[Geom::Y]) / sw[Geom::Y]);
- //set correct coloring, depending preference (when zoomed out, always major coloring or minor coloring)
+ // no_emphasize_when_zoomedout determines color (minor or major) when only major grid lines/dots shown.
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
guint32 _empcolor;
bool no_emp_when_zoomed_out = prefs->getBool("/options/grids/no_emphasize_when_zoomedout", false);
@@ -926,6 +922,7 @@ CanvasXYGrid::Render (SPCanvasBuf *buf)
cairo_set_line_cap(buf->ct, CAIRO_LINE_CAP_SQUARE);
if (!render_dotted) {
+ // Line grid
gint ylinenum;
gdouble y;
for (y = syg, ylinenum = ylinestart; y < buf->rect.bottom(); y += sw[Geom::Y], ylinenum++) {
@@ -948,8 +945,23 @@ CanvasXYGrid::Render (SPCanvasBuf *buf)
}
}
} else {
+ // Dotted grid
gint ylinenum;
gdouble y;
+
+ // alpha needs to be larger than in the line case to maintain a similar visual impact but
+ // setting it to the maximal value makes the dots dominant in some cases. Solution,
+ // increase the alpha by a factor of 4. This then allows some user adjustment.
+ guint32 _empdot = (_empcolor & 0xff) << 2;
+ if (_empdot > 0xff)
+ _empdot = 0xff;
+ _empdot += (_empcolor & 0xffffff00);
+
+ guint32 _colordot = (color & 0xff) << 2;
+ if (_colordot > 0xff)
+ _colordot = 0xff;
+ _colordot += (color & 0xffffff00);
+
for (y = syg, ylinenum = ylinestart; y < buf->rect.bottom(); y += sw[Geom::Y], ylinenum++) {
gint const iy = round(y);
@@ -961,13 +973,15 @@ CanvasXYGrid::Render (SPCanvasBuf *buf)
|| (!scaled[Geom::Y] && (ylinenum % empspacing) != 0)
|| ((scaled[Geom::X] || scaled[Geom::Y]) && no_emp_when_zoomed_out) )
{
- grid_dot (buf, ix, iy, color | (guint32)0x000000FF); // put alpha to max value
+ // Minor point: dot only
+ grid_dot (buf, ix, iy, _colordot); // | (guint32)0x000000FF); // put alpha to max value
} else {
+ // Major point: small cross
gint const pitch = 1;
grid_dot (buf, ix-pitch, iy, _empcolor);
grid_dot (buf, ix+pitch, iy, _empcolor);
- grid_dot (buf, ix, iy, _empcolor | (guint32)0x000000FF); // put alpha to max value
+ grid_dot (buf, ix, iy, _empdot ); // | (guint32)0x000000FF); // put alpha to max value
grid_dot (buf, ix, iy-pitch, _empcolor);
grid_dot (buf, ix, iy+pitch, _empcolor);
diff --git a/src/document.cpp b/src/document.cpp
index 1c6bb76de..741e7c812 100644
--- a/src/document.cpp
+++ b/src/document.cpp
@@ -1266,7 +1266,7 @@ static bool overlaps(Geom::Rect const &area, Geom::Rect const &box)
return area.intersects(box);
}
-static GSList *find_items_in_area(GSList *s, SPGroup *group, unsigned int dkey, Geom::Rect const &area,
+static std::vector<SPItem*> &find_items_in_area(std::vector<SPItem*> &s, SPGroup *group, unsigned int dkey, Geom::Rect const &area,
bool (*test)(Geom::Rect const &, Geom::Rect const &), bool take_insensitive = false)
{
g_return_val_if_fail(SP_IS_GROUP(group), s);
@@ -1279,7 +1279,7 @@ static GSList *find_items_in_area(GSList *s, SPGroup *group, unsigned int dkey,
SPItem *child = SP_ITEM(o);
Geom::OptRect box = child->desktopVisualBounds();
if ( box && test(area, *box) && (take_insensitive || child->isVisibleAndUnlocked(dkey))) {
- s = g_slist_append(s, child);
+ s.push_back(child);
}
}
}
@@ -1306,7 +1306,7 @@ static bool item_is_in_group(SPItem *item, SPGroup *group)
return inGroup;
}
-SPItem *SPDocument::getItemFromListAtPointBottom(unsigned int dkey, SPGroup *group, GSList const *list,Geom::Point const &p, bool take_insensitive)
+SPItem *SPDocument::getItemFromListAtPointBottom(unsigned int dkey, SPGroup *group, std::vector<SPItem*> const &list,Geom::Point const &p, bool take_insensitive)
{
g_return_val_if_fail(group, NULL);
SPItem *bottomMost = 0;
@@ -1320,7 +1320,7 @@ SPItem *SPDocument::getItemFromListAtPointBottom(unsigned int dkey, SPGroup *gro
Inkscape::DrawingItem *arenaitem = item->get_arenaitem(dkey);
if (arenaitem && arenaitem->pick(p, delta, 1) != NULL
&& (take_insensitive || item->isVisibleAndUnlocked(dkey))) {
- if (g_slist_find((GSList *) list, item) != NULL) {
+ if (find(list.begin(),list.end(),item)!=list.end() ) {
bottomMost = item;
}
}
@@ -1422,11 +1422,11 @@ static SPItem *find_group_at_point(unsigned int dkey, SPGroup *group, Geom::Poin
* Assumes box is normalized (and g_asserts it!)
*
*/
-GSList *SPDocument::getItemsInBox(unsigned int dkey, Geom::Rect const &box) const
+std::vector<SPItem*> SPDocument::getItemsInBox(unsigned int dkey, Geom::Rect const &box) const
{
- g_return_val_if_fail(this->priv != NULL, NULL);
-
- return find_items_in_area(NULL, SP_GROUP(this->root), dkey, box, is_within);
+ std::vector<SPItem*> x;
+ g_return_val_if_fail(this->priv != NULL, x);
+ return find_items_in_area(x, SP_GROUP(this->root), dkey, box, is_within);
}
/*
@@ -1436,16 +1436,16 @@ GSList *SPDocument::getItemsInBox(unsigned int dkey, Geom::Rect const &box) cons
*
*/
-GSList *SPDocument::getItemsPartiallyInBox(unsigned int dkey, Geom::Rect const &box) const
+std::vector<SPItem*> SPDocument::getItemsPartiallyInBox(unsigned int dkey, Geom::Rect const &box) const
{
- g_return_val_if_fail(this->priv != NULL, NULL);
-
- return find_items_in_area(NULL, SP_GROUP(this->root), dkey, box, overlaps);
+ std::vector<SPItem*> x;
+ g_return_val_if_fail(this->priv != NULL, x);
+ return find_items_in_area(x, SP_GROUP(this->root), dkey, box, overlaps);
}
-GSList *SPDocument::getItemsAtPoints(unsigned const key, std::vector<Geom::Point> points) const
+std::vector<SPItem*> SPDocument::getItemsAtPoints(unsigned const key, std::vector<Geom::Point> points) const
{
- GSList *items = NULL;
+ std::vector<SPItem*> items;
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
// When picking along the path, we don't want small objects close together
@@ -1454,11 +1454,11 @@ GSList *SPDocument::getItemsAtPoints(unsigned const key, std::vector<Geom::Point
gdouble saved_delta = prefs->getDouble("/options/cursortolerance/value", 1.0);
prefs->setDouble("/options/cursortolerance/value", 0.25);
- for(unsigned int i = 0; i < points.size(); i++) {
+ for(int i = points.size()-1;i>=0; i--) {
SPItem *item = getItemAtPoint(key, points[i],
false, NULL);
- if (item && !g_slist_find(items, item))
- items = g_slist_prepend (items, item);
+ if (item && items.end()==find(items.begin(),items.end(), item))
+ items.push_back(item);
}
// and now we restore it back
@@ -1591,7 +1591,7 @@ static void vacuum_document_recursive(SPObject *obj)
unsigned int SPDocument::vacuumDocument()
{
unsigned int start = objects_in_document(this);
- unsigned int end = start;
+ unsigned int end;
unsigned int newend = start;
unsigned int iterations = 0;
diff --git a/src/document.h b/src/document.h
index 74dcfa75e..16b9bb28d 100644
--- a/src/document.h
+++ b/src/document.h
@@ -232,7 +232,7 @@ public:
/**
* Returns the bottommost item from the list which is at the point, or NULL if none.
*/
- static SPItem *getItemFromListAtPointBottom(unsigned int dkey, SPGroup *group, const GSList *list, Geom::Point const &p, bool take_insensitive = false);
+ static SPItem *getItemFromListAtPointBottom(unsigned int dkey, SPGroup *group, const std::vector<SPItem*> &list, Geom::Point const &p, bool take_insensitive = false);
static SPDocument *createDoc(Inkscape::XML::Document *rdoc, char const *uri,
char const *base, char const *name, unsigned int keepalive,
@@ -259,10 +259,10 @@ public:
bool addResource(char const *key, SPObject *object);
bool removeResource(char const *key, SPObject *object);
const GSList *getResourceList(char const *key) const;
- GSList *getItemsInBox(unsigned int dkey, Geom::Rect const &box) const;
- GSList *getItemsPartiallyInBox(unsigned int dkey, Geom::Rect const &box) const;
+ std::vector<SPItem*> getItemsInBox(unsigned int dkey, Geom::Rect const &box) const;
+ std::vector<SPItem*> getItemsPartiallyInBox(unsigned int dkey, Geom::Rect const &box) const;
SPItem *getItemAtPoint(unsigned int key, Geom::Point const &p, bool into_groups, SPItem *upto = NULL) const;
- GSList *getItemsAtPoints(unsigned const key, std::vector<Geom::Point> points) const;
+ std::vector<SPItem*> getItemsAtPoints(unsigned const key, std::vector<Geom::Point> points) const;
SPItem *getGroupAtPoint(unsigned int key, Geom::Point const &p) const;
void changeUriAndHrefs(char const *uri);
diff --git a/src/extension/CMakeLists.txt b/src/extension/CMakeLists.txt
index 47292fd97..d1104f3cc 100644
--- a/src/extension/CMakeLists.txt
+++ b/src/extension/CMakeLists.txt
@@ -57,6 +57,7 @@ set(extension_SRC
internal/vsd-input.cpp
internal/wmf-inout.cpp
internal/wmf-print.cpp
+ internal/wpg-input.cpp
internal/filter/filter-all.cpp
internal/filter/filter-file.cpp
@@ -142,6 +143,7 @@ set(extension_SRC
internal/vsd-input.h
internal/wmf-inout.h
internal/wmf-print.h
+ internal/wpg-input.h
)
if(WIN32)
diff --git a/src/extension/dbus/document-interface.cpp b/src/extension/dbus/document-interface.cpp
index 4fde6885f..d64bdbc5c 100644
--- a/src/extension/dbus/document-interface.cpp
+++ b/src/extension/dbus/document-interface.cpp
@@ -186,10 +186,10 @@ selection_get_center_y (Inkscape::Selection *sel){
* know we never bothered to implement it seperatly. Although
* they might see the selection box flicker if used in a loop.
*/
-const GSList *
+std::vector<SPObject*>
selection_swap(Inkscape::Selection *sel, gchar *name, GError **error)
{
- const GSList *oldsel = g_slist_copy((GSList *)sel->list());
+ std::vector<SPObject*> oldsel = sel->list();
sel->set(get_object_by_name(sel->layers()->getDocument(), name, error));
return oldsel;
@@ -199,9 +199,11 @@ selection_swap(Inkscape::Selection *sel, gchar *name, GError **error)
* See selection_swap, above
*/
void
-selection_restore(Inkscape::Selection *sel, const GSList * oldsel)
+selection_restore(Inkscape::Selection *sel, std::vector<SPObject*> oldsel)
{
- sel->setList(oldsel);
+ // ... setList used to work here
+ sel->clear();
+ sel->add(oldsel.begin(), oldsel.end());
}
/*
@@ -708,8 +710,8 @@ gboolean
document_interface_move (DocumentInterface *doc_interface, gchar *name, gdouble x,
gdouble y, GError **error)
{
- const GSList *oldsel = selection_swap(doc_interface->target.getSelection(), name, error);
- if (!oldsel)
+ std::vector<SPObject*> oldsel = selection_swap(doc_interface->target.getSelection(), name, error);
+ if (oldsel.empty())
return FALSE;
sp_selection_move (doc_interface->target.getSelection(), x, 0 - y);
selection_restore(doc_interface->target.getSelection(), oldsel);
@@ -720,8 +722,8 @@ gboolean
document_interface_move_to (DocumentInterface *doc_interface, gchar *name, gdouble x,
gdouble y, GError **error)
{
- const GSList *oldsel = selection_swap(doc_interface->target.getSelection(), name, error);
- if (!oldsel)
+ std::vector<SPObject*> oldsel = selection_swap(doc_interface->target.getSelection(), name, error);
+ if (oldsel.empty())
return FALSE;
Inkscape::Selection * sel = doc_interface->target.getSelection();
sp_selection_move (doc_interface->target.getSelection(), x - selection_get_center_x(sel),
@@ -734,8 +736,8 @@ gboolean
document_interface_object_to_path (DocumentInterface *doc_interface,
char *shape, GError **error)
{
- const GSList *oldsel = selection_swap(doc_interface->target.getSelection(), shape, error);
- if (!oldsel)
+ std::vector<SPObject*> oldsel = selection_swap(doc_interface->target.getSelection(), shape, error);
+ if (oldsel.empty())
return FALSE;
dbus_call_verb (doc_interface, SP_VERB_OBJECT_TO_CURVE, error);
selection_restore(doc_interface->target.getSelection(), oldsel);
@@ -849,8 +851,8 @@ gboolean
document_interface_move_to_layer (DocumentInterface *doc_interface, gchar *shape,
gchar *layerstr, GError **error)
{
- const GSList *oldsel = selection_swap(doc_interface->target.getSelection(), shape, error);
- if (!oldsel)
+ std::vector<SPObject*> oldsel = selection_swap(doc_interface->target.getSelection(), shape, error);
+ if (oldsel.empty())
return FALSE;
document_interface_selection_move_to_layer(doc_interface, layerstr, error);
@@ -1085,15 +1087,15 @@ void document_interface_update(DocumentInterface *doc_interface, GError ** error
gboolean document_interface_selection_get(DocumentInterface *doc_interface, char ***out, GError ** /*error*/)
{
Inkscape::Selection * sel = doc_interface->target.getSelection();
- GSList const *oldsel = sel->list();
+ std::vector<SPObject*> oldsel = sel->list();
- int size = g_slist_length((GSList *) oldsel);
+ int size = oldsel.size();
*out = g_new0 (char *, size + 1);
int i = 0;
- for (GSList const *iter = oldsel; iter != NULL; iter = iter->next) {
- (*out)[i] = g_strdup(SP_OBJECT(iter->data)->getRepr()->attribute("id"));
+ for (std::vector<SPObject*>::iterator iter = oldsel.begin(), e = oldsel.end(); iter != e; ++iter) {
+ (*out)[i] = g_strdup((*iter)->getId());
i++;
}
(*out)[i] = NULL;
@@ -1426,23 +1428,21 @@ gboolean dbus_send_ping (SPDesktop* desk, SPItem *item)
gboolean
document_interface_get_children (DocumentInterface *doc_interface, char *name, char ***out, GError **error)
{
- SPItem* parent=(SPItem* )get_object_by_name(doc_interface->target.getDocument(), name, error);
+ SPItem* parent=(SPItem* )get_object_by_name(doc_interface->target.getDocument(), name, error);
+ std::vector<SPObject*> children = parent->childList(false);
- GSList const *children = parent->childList(false);
-
- int size = g_slist_length((GSList *) children);
+ int size = children.size();
*out = g_new0 (char *, size + 1);
int i = 0;
- for (GSList const *iter = children; iter != NULL; iter = iter->next) {
- (*out)[i] = g_strdup(SP_OBJECT(iter->data)->getRepr()->attribute("id"));
+ for (std::vector<SPObject*>::iterator iter = children.begin(), e = children.end(); iter != e; ++iter) {
+ (*out)[i] = g_strdup((*iter)->getId());
i++;
}
(*out)[i] = NULL;
return TRUE;
-
}
diff --git a/src/extension/execution-env.cpp b/src/extension/execution-env.cpp
index 13b8d60c4..29c2b5537 100644
--- a/src/extension/execution-env.cpp
+++ b/src/extension/execution-env.cpp
@@ -14,10 +14,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include "gtkmm/messagedialog.h"
#include "execution-env.h"
@@ -64,14 +60,12 @@ ExecutionEnv::ExecutionEnv (Effect * effect, Inkscape::UI::View::View * doc, Imp
sp_namedview_document_from_window(desktop);
if (desktop != NULL) {
- Inkscape::Util::GSListConstIterator<SPItem *> selected =
- desktop->getSelection()->itemList();
- while ( selected != NULL ) {
+ std::vector<SPItem*> selected = desktop->getSelection()->itemList();
+ for(std::vector<SPItem*>::const_iterator x = selected.begin(); x != selected.end(); x++){
Glib::ustring selected_id;
- selected_id = (*selected)->getId();
+ selected_id = (*x)->getId();
_selected.insert(_selected.end(), selected_id);
//std::cout << "Selected: " << selected_id << std::endl;
- ++selected;
}
}
diff --git a/src/extension/extension.cpp b/src/extension/extension.cpp
index 3d0f49a20..6f7539360 100644
--- a/src/extension/extension.cpp
+++ b/src/extension/extension.cpp
@@ -19,10 +19,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/label.h>
#include <gtkmm/frame.h>
diff --git a/src/extension/implementation/implementation.cpp b/src/extension/implementation/implementation.cpp
index 52f63499a..b0ff3e91c 100644
--- a/src/extension/implementation/implementation.cpp
+++ b/src/extension/implementation/implementation.cpp
@@ -47,12 +47,10 @@ Gtk::Widget *Implementation::prefs_effect(Inkscape::Extension::Effect *module, I
SPDocument * current_document = view->doc();
- using Inkscape::Util::GSListConstIterator;
- // FIXME very unsafe cast
- GSListConstIterator<SPItem *> selected = ((SPDesktop *)view)->getSelection()->itemList();
+ std::vector<SPItem*> selected = ((SPDesktop *)view)->getSelection()->itemList();
Inkscape::XML::Node const* first_select = NULL;
- if (selected != NULL) {
- const SPItem * item = *selected;
+ if (!selected.empty()) {
+ const SPItem * item = selected[0];
first_select = item->getRepr();
}
diff --git a/src/extension/implementation/script.cpp b/src/extension/implementation/script.cpp
index bbc567f75..e07a3963c 100644
--- a/src/extension/implementation/script.cpp
+++ b/src/extension/implementation/script.cpp
@@ -689,14 +689,13 @@ void Script::effect(Inkscape::Extension::Effect *module,
return;
}
- Inkscape::Util::GSListConstIterator<SPItem *> selected =
+ std::vector<SPItem*> selected =
desktop->getSelection()->itemList(); //desktop should not be NULL since doc was checked and desktop is a casted pointer
- while ( selected != NULL ) {
+ for(std::vector<SPItem*>::const_iterator x = selected.begin(); x != selected.end(); x++){
Glib::ustring selected_id;
selected_id += "--id=";
- selected_id += (*selected)->getId();
+ selected_id += (*x)->getId();
params.insert(params.begin(), selected_id);
- ++selected;
}
file_listener fileout;
@@ -813,6 +812,12 @@ void Script::copy_doc (Inkscape::XML::Node * oldroot, Inkscape::XML::Node * newr
}
}
+ if(!oldroot_namedview)
+ {
+ g_warning("Error on copy_doc: No namedview on destination document.");
+ return;
+ }
+
// Unparent (delete)
for (unsigned int i = 0; i < delete_list.size(); i++) {
sp_repr_unparent(delete_list[i]);
@@ -824,12 +829,10 @@ void Script::copy_doc (Inkscape::XML::Node * oldroot, Inkscape::XML::Node * newr
child = child->next()) {
if (!strcmp("sodipodi:namedview", child->name())) {
newroot_namedview = child;
- if (oldroot_namedview != NULL) {
- for (Inkscape::XML::Node * newroot_namedview_child = child->firstChild();
- newroot_namedview_child != NULL;
- newroot_namedview_child = newroot_namedview_child->next()) {
- oldroot_namedview->appendChild(newroot_namedview_child->duplicate(oldroot->document()));
- }
+ for (Inkscape::XML::Node * newroot_namedview_child = child->firstChild();
+ newroot_namedview_child != NULL;
+ newroot_namedview_child = newroot_namedview_child->next()) {
+ oldroot_namedview->appendChild(newroot_namedview_child->duplicate(oldroot->document()));
}
} else {
oldroot->appendChild(child->duplicate(oldroot->document()));
@@ -1027,7 +1030,10 @@ int Script::execute (const std::list<std::string> &in_command,
return 0;
}
- _main_loop = Glib::MainLoop::create(false);
+ // Create a new MainContext for the loop so that the original context sources are not run here,
+ // this enforces that only the file_listeners should be read in this new MainLoop
+ Glib::RefPtr<Glib::MainContext> _main_context = Glib::MainContext::create();
+ _main_loop = Glib::MainLoop::create(_main_context, false);
file_listener fileerr;
fileout.init(stdout_pipe, _main_loop);
diff --git a/src/extension/implementation/script.h b/src/extension/implementation/script.h
index 6a7d0c3b8..4cf33c989 100644
--- a/src/extension/implementation/script.h
+++ b/src/extension/implementation/script.h
@@ -90,7 +90,7 @@ private:
void init (int fd, Glib::RefPtr<Glib::MainLoop> main) {
_channel = Glib::IOChannel::create_from_fd(fd);
_channel->set_encoding();
- _conn = Glib::signal_io().connect(sigc::mem_fun(*this, &file_listener::read), _channel, Glib::IO_IN | Glib::IO_HUP | Glib::IO_ERR);
+ _conn = main->get_context()->signal_io().connect(sigc::mem_fun(*this, &file_listener::read), _channel, Glib::IO_IN | Glib::IO_HUP | Glib::IO_ERR);
_main_loop = main;
return;
diff --git a/src/extension/internal/bitmap/imagemagick.cpp b/src/extension/internal/bitmap/imagemagick.cpp
index 76f35415e..bc0dd8e33 100644
--- a/src/extension/internal/bitmap/imagemagick.cpp
+++ b/src/extension/internal/bitmap/imagemagick.cpp
@@ -12,10 +12,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <libintl.h>
#include <gtkmm/box.h>
@@ -70,8 +66,8 @@ ImageMagickDocCache::ImageMagickDocCache(Inkscape::UI::View::View * view) :
_imageItems(NULL)
{
SPDesktop *desktop = (SPDesktop*)view;
- const GSList *selectedItemList = desktop->selection->itemList();
- int selectCount = g_slist_length((GSList *)selectedItemList);
+ const std::vector<SPItem*> selectedItemList = desktop->selection->itemList();
+ int selectCount = selectedItemList.size();
// Init the data-holders
_nodes = new Inkscape::XML::Node*[selectCount];
@@ -83,9 +79,8 @@ ImageMagickDocCache::ImageMagickDocCache(Inkscape::UI::View::View * view) :
_imageItems = new SPItem*[selectCount];
// Loop through selected items
- for (; selectedItemList != NULL; selectedItemList = g_slist_next(selectedItemList))
- {
- SPItem *item = SP_ITEM(selectedItemList->data);
+ for (std::vector<SPItem*>::const_iterator i = selectedItemList.begin(); i != selectedItemList.end(); i++) {
+ SPItem *item = *i;
Inkscape::XML::Node *node = reinterpret_cast<Inkscape::XML::Node *>(item->getRepr());
if (!strcmp(node->name(), "image") || !strcmp(node->name(), "svg:image"))
{
@@ -241,13 +236,10 @@ ImageMagick::prefs_effect(Inkscape::Extension::Effect *module, Inkscape::UI::Vie
{
SPDocument * current_document = view->doc();
- using Inkscape::Util::GSListConstIterator;
-
- // FIXME very unsafe cast
- GSListConstIterator<SPItem *> selected = ((SPDesktop *)view)->getSelection()->itemList();
+ std::vector<SPItem*> selected = ((SPDesktop *)view)->getSelection()->itemList();
Inkscape::XML::Node * first_select = NULL;
- if (selected != NULL) {
- first_select = (*selected)->getRepr();
+ if (!selected.empty()) {
+ first_select = (selected.front())->getRepr();
}
return module->autogui(current_document, first_select, changeSignal);
diff --git a/src/extension/internal/bluredge.cpp b/src/extension/internal/bluredge.cpp
index 3ce537d9f..9f19f8b3b 100644
--- a/src/extension/internal/bluredge.cpp
+++ b/src/extension/internal/bluredge.cpp
@@ -63,13 +63,11 @@ BlurEdge::effect (Inkscape::Extension::Effect *module, Inkscape::UI::View::View
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
double old_offset = prefs->getDouble("/options/defaultoffsetwidth/value", 1.0, "px");
- using Inkscape::Util::GSListConstIterator;
// TODO need to properly refcount the items, at least
- std::list<SPItem *> items;
- items.insert<GSListConstIterator<SPItem *> >(items.end(), selection->itemList(), NULL);
+ std::vector<SPItem*> items(selection->itemList());
selection->clear();
- for(std::list<SPItem *>::iterator item = items.begin();
+ for(std::vector<SPItem*>::iterator item = items.begin();
item != items.end(); ++item) {
SPItem * spitem = *item;
diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp
index 2d6619e1e..27e34dbcf 100644
--- a/src/extension/internal/cairo-render-context.cpp
+++ b/src/extension/internal/cairo-render-context.cpp
@@ -1393,6 +1393,7 @@ CairoRenderContext::_setStrokeStyle(SPStyle const *style, Geom::OptRect const &p
dashes[i] = style->stroke_dasharray.values[i];
}
cairo_set_dash(_cr, dashes, ndashes, style->stroke_dashoffset.value);
+ free(dashes);
} else {
cairo_set_dash(_cr, NULL, 0, 0.0); // disable dashing
}
diff --git a/src/extension/internal/cairo-renderer.cpp b/src/extension/internal/cairo-renderer.cpp
index 7fbdc4296..5a5553e97 100644
--- a/src/extension/internal/cairo-renderer.cpp
+++ b/src/extension/internal/cairo-renderer.cpp
@@ -294,14 +294,12 @@ static void sp_group_render(SPGroup *group, CairoRenderContext *ctx)
CairoRenderer *renderer = ctx->getRenderer();
TRACE(("sp_group_render opacity: %f\n", SP_SCALE24_TO_FLOAT(item->style->opacity.value)));
- GSList *l = g_slist_reverse(group->childList(false));
- while (l) {
- SPObject *o = reinterpret_cast<SPObject *>(l->data);
- SPItem *item = dynamic_cast<SPItem *>(o);
+ std::vector<SPObject*> l(group->childList(false));
+ for(std::vector<SPObject*>::const_iterator x = l.begin(); x!= l.end(); x++){
+ SPItem *item = dynamic_cast<SPItem*>(*x);
if (item) {
renderer->renderItem(ctx, item);
}
- l = g_slist_remove (l, o);
}
}
diff --git a/src/extension/internal/cdr-input.h b/src/extension/internal/cdr-input.h
index 3de6c1ed0..10af41d5a 100644
--- a/src/extension/internal/cdr-input.h
+++ b/src/extension/internal/cdr-input.h
@@ -19,10 +19,6 @@
#ifdef WITH_LIBCDR
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/dialog.h>
#include "../implementation/implementation.h"
diff --git a/src/extension/internal/emf-inout.cpp b/src/extension/internal/emf-inout.cpp
index 31e69706f..e88cf3d42 100644
--- a/src/extension/internal/emf-inout.cpp
+++ b/src/extension/internal/emf-inout.cpp
@@ -480,7 +480,7 @@ uint32_t Emf::add_image(PEMF_CALLBACK_DATA d, void *pEmr, uint32_t cbBits, uint
uint32_t width, height, colortype, numCt, invert; // if needed these values will be set in get_DIB_params
if(cbBits && cbBmi && (iUsage == U_DIB_RGB_COLORS)){
// next call returns pointers and values, but allocates no memory
- dibparams = get_DIB_params(pEmr, offBits, offBmi, &px, (const U_RGBQUAD **) &ct,
+ dibparams = get_DIB_params((const char *)pEmr, offBits, offBmi, &px, (const U_RGBQUAD **) &ct,
&numCt, &width, &height, &colortype, &invert);
if(dibparams ==U_BI_RGB){
// U_EMRCREATEMONOBRUSH uses text/bk colors instead of what is in the color map.
@@ -1307,7 +1307,7 @@ Emf::select_extpen(PEMF_CALLBACK_DATA d, int index)
d->dc[d->level].stroke_set = true;
}
else if(pEmr->elp.elpBrushStyle == U_BS_DIBPATTERN || pEmr->elp.elpBrushStyle == U_BS_DIBPATTERNPT){
- d->dc[d->level].stroke_idx = add_image(d, pEmr, pEmr->cbBits, pEmr->cbBmi, *(uint32_t *) &(pEmr->elp.elpColor), pEmr->offBits, pEmr->offBmi);
+ d->dc[d->level].stroke_idx = add_image(d, (void *)pEmr, pEmr->cbBits, pEmr->cbBmi, *(uint32_t *) &(pEmr->elp.elpColor), pEmr->offBits, pEmr->offBmi);
d->dc[d->level].stroke_mode = DRAW_IMAGE;
d->dc[d->level].stroke_set = true;
}
@@ -1530,7 +1530,7 @@ void Emf::common_image_extraction(PEMF_CALLBACK_DATA d, void *pEmr,
uint32_t width, height, colortype, numCt, invert; // if needed these values will be set in get_DIB_params
if(cbBits && cbBmi && (iUsage == U_DIB_RGB_COLORS)){
// next call returns pointers and values, but allocates no memory
- dibparams = get_DIB_params(pEmr, offBits, offBmi, &px, (const U_RGBQUAD **) &ct,
+ dibparams = get_DIB_params((const char *)pEmr, offBits, offBmi, &px, (const U_RGBQUAD **) &ct,
&numCt, &width, &height, &colortype, &invert);
if(dibparams ==U_BI_RGB){
if(sw == 0 || sh == 0){
@@ -1611,6 +1611,10 @@ int Emf::myEnhMetaFileProc(char *contents, unsigned int length, PEMF_CALLBACK_DA
uint32_t off=0;
uint32_t emr_mask;
int OK =1;
+ int file_status=1;
+ uint32_t nSize;
+ uint32_t iType;
+ const char *blimit = contents + length;
PU_ENHMETARECORD lpEMFR;
TCHUNK_SPECS tsp;
uint32_t tbkMode = U_TRANSPARENT; // holds proposed change to bkMode, if text is involved saving these to the DC must wait until the text is written
@@ -1641,19 +1645,32 @@ int Emf::myEnhMetaFileProc(char *contents, unsigned int length, PEMF_CALLBACK_DA
while(OK){
if(off>=length)return(0); //normally should exit from while after EMREOF sets OK to false.
+ // check record sizes and types thoroughly
+ int badrec = 0;
+ if (!U_emf_record_sizeok(contents + off, blimit, &nSize, &iType, 1) ||
+ !U_emf_record_safe(contents + off)){
+ badrec = 1;
+ }
+ else {
+ emr_mask = emr_properties(iType);
+ if (emr_mask == U_EMR_INVALID) { badrec = 1; }
+ }
+ if (badrec) {
+ file_status = 0;
+ break;
+ }
+
lpEMFR = (PU_ENHMETARECORD)(contents + off);
+
// Uncomment the following to track down toxic records
-// std::cout << "record type: " << lpEMFR->iType << " name " << U_emr_names(lpEMFR->iType) << " length: " << lpEMFR->nSize << " offset: " << off <<std::endl;
- off += lpEMFR->nSize;
+// std::cout << "record type: " << iType << " name " << U_emr_names(iType) << " length: " << nSize << " offset: " << off <<std::endl;
+ off += nSize;
SVGOStringStream tmp_outsvg;
SVGOStringStream tmp_path;
SVGOStringStream tmp_str;
SVGOStringStream dbg_str;
- emr_mask = emr_properties(lpEMFR->iType);
- if(emr_mask == U_EMR_INVALID){ throw "Inkscape fatal memory allocation error - cannot continue"; }
-
/* Uncomment the following to track down text problems */
//std::cout << "tri->dirty:"<< d->tri->dirty << " emr_mask: " << std::hex << emr_mask << std::dec << std::endl;
@@ -1753,7 +1770,7 @@ std::cout << "BEFORE DRAW"
}
// std::cout << "AFTER DRAW logic d->mask: " << std::hex << d->mask << " emr_mask: " << emr_mask << std::dec << std::endl;
- switch (lpEMFR->iType)
+ switch (iType)
{
case U_EMR_HEADER:
{
@@ -3471,7 +3488,7 @@ std::cout << "BEFORE DRAW"
// std::cout << d->outsvg << std::endl;
(void) emr_properties(U_EMR_INVALID); // force the release of the lookup table memory, returned value is irrelevant
- return 1;
+ return(file_status);
}
void Emf::free_emf_strings(EMF_STRINGS name){
@@ -3486,12 +3503,14 @@ void Emf::free_emf_strings(EMF_STRINGS name){
SPDocument *
Emf::open( Inkscape::Extension::Input * /*mod*/, const gchar *uri )
{
- EMF_CALLBACK_DATA d;
-
if (uri == NULL) {
return NULL;
}
+ EMF_CALLBACK_DATA d;
+
+ d.n_obj = 0; //these might not be set otherwise if the input file is corrupt
+ d.emf_obj = NULL;
d.dc[0].font_name = strdup("Arial"); // Default font, set only on lowest level, it copies up from there EMF spec says device can pick whatever it wants
// set up the size default for patterns in defs. This might not be referenced if there are no patterns defined in the drawing.
@@ -3518,14 +3537,17 @@ Emf::open( Inkscape::Extension::Input * /*mod*/, const gchar *uri )
FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP,
FT_KERNING_UNSCALED);
- (void) myEnhMetaFileProc(contents,length, &d);
+ int good = myEnhMetaFileProc(contents,length, &d);
free(contents);
if (d.pDesc){ free( d.pDesc ); }
// std::cout << "SVG Output: " << std::endl << d.outsvg << std::endl;
- SPDocument *doc = SPDocument::createNewDocFromMem(d.outsvg.c_str(), strlen(d.outsvg.c_str()), TRUE);
+ SPDocument *doc = NULL;
+ if (good) {
+ doc = SPDocument::createNewDocFromMem(d.outsvg.c_str(), strlen(d.outsvg.c_str()), TRUE);
+ }
free_emf_strings(d.hatches);
free_emf_strings(d.images);
diff --git a/src/extension/internal/emf-inout.h b/src/extension/internal/emf-inout.h
index c64299093..dd1d8f9c4 100644
--- a/src/extension/internal/emf-inout.h
+++ b/src/extension/internal/emf-inout.h
@@ -13,6 +13,8 @@
#define SEEN_EXTENSION_INTERNAL_EMF_H
#include <libuemf/uemf.h>
+#include <libuemf/uemf_safe.h>
+#include <libuemf/uemf_endian.h> // for U_emf_record_sizeok()
#include "extension/internal/metafile-inout.h" // picks up PNG
#include "extension/implementation/implementation.h"
#include "style.h"
diff --git a/src/extension/internal/emf-print.cpp b/src/extension/internal/emf-print.cpp
index 7815c51c7..7c514d6e7 100644
--- a/src/extension/internal/emf-print.cpp
+++ b/src/extension/internal/emf-print.cpp
@@ -60,6 +60,7 @@
#include "splivarot.h" // pieces for union on shapes
#include "2geom/svg-path-parser.h" // to get from SVG text to Geom::Path
#include "display/canvas-bpath.h" // for SPWindRule
+#include "display/cairo-utils.h" // for Inkscape::Pixbuf::PF_CAIRO
#include "emf-print.h"
@@ -70,7 +71,6 @@ namespace Internal {
#define PXPERMETER 2835
-
/* globals */
static double PX2WORLD;
static bool FixPPTCharPos, FixPPTDashLine, FixPPTGrad2Polys, FixPPTLinGrad, FixPPTPatternAsHatch, FixImageRot;
@@ -481,9 +481,8 @@ int PrintEmf::create_brush(SPStyle const *style, PU_COLORREF fcolor)
rgba_px = (char *) pixbuf->pixels(); // Do NOT free this!!!
colortype = U_BCBM_COLOR32;
(void) RGBA_to_DIB(&px, &cbPx, &ct, &numCt, rgba_px, width, height, width * 4, colortype, 0, 1);
- // Not sure why the next swap is needed because the preceding does it, and the code is identical
- // to that in stretchdibits_set, which does not need this.
- swapRBinRGBA(px, width * height);
+ // pixbuf can be either PF_CAIRO or PF_GDK, and these have R and B bytes swapped
+ if (pixbuf->pixelFormat() == Inkscape::Pixbuf::PF_CAIRO) { swapRBinRGBA(px, width * height); }
Bmih = bitmapinfoheader_set(width, height, 1, colortype, U_BI_RGB, 0, PXPERMETER, PXPERMETER, numCt, 0);
Bmi = bitmapinfo_set(Bmih, ct);
rec = createdibpatternbrushpt_set(&brush, eht, U_DIB_RGB_COLORS, Bmi, cbPx, px);
@@ -584,9 +583,8 @@ int PrintEmf::create_pen(SPStyle const *style, const Geom::Affine &transform)
rgba_px = (char *) pixbuf->pixels(); // Do NOT free this!!!
colortype = U_BCBM_COLOR32;
(void) RGBA_to_DIB(&px, &cbPx, &ct, &numCt, rgba_px, width, height, width * 4, colortype, 0, 1);
- // Not sure why the next swap is needed because the preceding does it, and the code is identical
- // to that in stretchdibits_set, which does not need this.
- swapRBinRGBA(px, width * height);
+ // pixbuf can be either PF_CAIRO or PF_GDK, and these have R and B bytes swapped
+ if (pixbuf->pixelFormat() == Inkscape::Pixbuf::PF_CAIRO) { swapRBinRGBA(px, width * height); }
Bmih = bitmapinfoheader_set(width, height, 1, colortype, U_BI_RGB, 0, PXPERMETER, PXPERMETER, numCt, 0);
Bmi = bitmapinfo_set(Bmih, ct);
} else { // pattern
diff --git a/src/extension/internal/filter/filter.cpp b/src/extension/internal/filter/filter.cpp
index a2c565699..65162af22 100644
--- a/src/extension/internal/filter/filter.cpp
+++ b/src/extension/internal/filter/filter.cpp
@@ -125,15 +125,13 @@ void Filter::effect(Inkscape::Extension::Effect *module, Inkscape::UI::View::Vie
//printf("Calling filter effect\n");
Inkscape::Selection * selection = ((SPDesktop *)document)->selection;
- using Inkscape::Util::GSListConstIterator;
// TODO need to properly refcount the items, at least
- std::list<SPItem *> items;
- items.insert<GSListConstIterator<SPItem *> >(items.end(), selection->itemList(), NULL);
+ std::vector<SPItem*> items(selection->itemList());
Inkscape::XML::Document * xmldoc = document->doc()->getReprDoc();
Inkscape::XML::Node * defsrepr = document->doc()->getDefs()->getRepr();
- for(std::list<SPItem *>::iterator item = items.begin();
+ for(std::vector<SPItem*>::iterator item = items.begin();
item != items.end(); ++item) {
SPItem * spitem = *item;
Inkscape::XML::Node * node = spitem->getRepr();
diff --git a/src/extension/internal/grid.cpp b/src/extension/internal/grid.cpp
index 270edfe44..8fd82b675 100644
--- a/src/extension/internal/grid.cpp
+++ b/src/extension/internal/grid.cpp
@@ -15,10 +15,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/adjustment.h>
#include <gtkmm/spinbutton.h>
@@ -190,13 +186,10 @@ Grid::prefs_effect(Inkscape::Extension::Effect *module, Inkscape::UI::View::View
{
SPDocument * current_document = view->doc();
- using Inkscape::Util::GSListConstIterator;
-
- // FIXME very unsafe cast
- GSListConstIterator<SPItem *> selected = ((SPDesktop *)view)->getSelection()->itemList();
+ std::vector<SPItem*> selected = ((SPDesktop *)view)->getSelection()->itemList();
Inkscape::XML::Node * first_select = NULL;
- if (selected != NULL) {
- first_select = (*selected)->getRepr();
+ if (!selected.empty()) {
+ first_select = selected[0]->getRepr();
}
return module->autogui(current_document, first_select, changeSignal);
diff --git a/src/extension/internal/latex-text-renderer.cpp b/src/extension/internal/latex-text-renderer.cpp
index ab0733848..1026f51ad 100644
--- a/src/extension/internal/latex-text-renderer.cpp
+++ b/src/extension/internal/latex-text-renderer.cpp
@@ -228,14 +228,12 @@ LaTeXTextRenderer::writePostamble()
void LaTeXTextRenderer::sp_group_render(SPGroup *group)
{
- GSList *l = g_slist_reverse(group->childList(false));
- while (l) {
- SPObject *o = reinterpret_cast<SPObject *>(l->data);
- SPItem *item = dynamic_cast<SPItem *>(o);
+ std::vector<SPObject*> l = (group->childList(false));
+ for(std::vector<SPObject*>::const_iterator x = l.begin(); x != l.end(); x++){
+ SPItem *item = dynamic_cast<SPItem*>(*x);
if (item) {
renderItem(item);
}
- l = g_slist_remove (l, o);
}
}
diff --git a/src/extension/internal/pdfinput/pdf-input.h b/src/extension/internal/pdfinput/pdf-input.h
index d57c3e993..866db5d82 100644
--- a/src/extension/internal/pdfinput/pdf-input.h
+++ b/src/extension/internal/pdfinput/pdf-input.h
@@ -16,10 +16,6 @@
#ifdef HAVE_POPPLER
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/dialog.h>
#include "../../implementation/implementation.h"
diff --git a/src/extension/internal/vsd-input.h b/src/extension/internal/vsd-input.h
index 3414e0ec9..acc52debf 100644
--- a/src/extension/internal/vsd-input.h
+++ b/src/extension/internal/vsd-input.h
@@ -19,10 +19,6 @@
#ifdef WITH_LIBVISIO
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/dialog.h>
#include "../implementation/implementation.h"
diff --git a/src/extension/internal/wmf-inout.cpp b/src/extension/internal/wmf-inout.cpp
index 503a93418..f76fa16b4 100644
--- a/src/extension/internal/wmf-inout.cpp
+++ b/src/extension/internal/wmf-inout.cpp
@@ -95,7 +95,6 @@ Wmf::print_document_to_file(SPDocument *doc, const gchar *filename)
SPPrintContext context;
const gchar *oldconst;
gchar *oldoutput;
- unsigned int ret;
doc->ensureUpToDate();
@@ -114,13 +113,12 @@ Wmf::print_document_to_file(SPDocument *doc, const gchar *filename)
mod->root = mod->base->invoke_show(drawing, mod->dkey, SP_ITEM_SHOW_DISPLAY);
drawing.setRoot(mod->root);
/* Print document */
- ret = mod->begin(doc);
- if (ret) {
+ if (mod->begin(doc)) {
g_free(oldoutput);
throw Inkscape::Extension::Output::save_failed();
}
mod->base->invoke_print(&context);
- ret = mod->finish();
+ mod->finish();
/* Release arena */
mod->base->invoke_hide(mod->dkey);
mod->base = NULL;
@@ -1497,6 +1495,7 @@ int Wmf::myMetaFileProc(const char *contents, unsigned int length, PWMF_CALLBACK
uint32_t off=0;
uint32_t wmr_mask;
int OK =1;
+ int file_status=1;
TCHUNK_SPECS tsp;
uint8_t iType;
int nSize; // size of the current record, in bytes, or an error value if <=0
@@ -1562,7 +1561,9 @@ int Wmf::myMetaFileProc(const char *contents, unsigned int length, PWMF_CALLBACK
U_WMRHEADER Header;
off = 0;
nSize = wmfheader_get(contents, blimit, &Placeable, &Header);
- if(!nSize)return(0);
+ if (!nSize) {
+ return(0);
+ }
if(!Header.nObjects){ Header.nObjects = 256; }// there _may_ be WMF files with no objects, more likely it is corrupt. Try to use it anyway.
d->n_obj = Header.nObjects;
d->wmf_obj = new WMF_OBJECT[d->n_obj];
@@ -1602,7 +1603,10 @@ int Wmf::myMetaFileProc(const char *contents, unsigned int length, PWMF_CALLBACK
else {
off += nSize;
}
- }
+ }
+ else {
+ return(0);
+ }
}
off=0;
nSize = hold_nSize;
@@ -1665,27 +1669,32 @@ int Wmf::myMetaFileProc(const char *contents, unsigned int length, PWMF_CALLBACK
while(OK){
- if(off>=length)return(0); //normally should exit from while after WMREOF sets OK to false.
+ if (off>=length) {
+ return(0); //normally should exit from while after WMREOF sets OK to false.
+ }
contents += nSize; // pointer to the start of the next record
off += nSize; // offset from beginning of buffer to the start of the next record
- SVGOStringStream tmp_path;
- SVGOStringStream tmp_str;
-
- /* Check that the current record size is OK, abort if not.
- Pointer math might wrap, so check both sides of the range.
- Some of the records will reset this with the same value,others will not
- return a value at this time. */
+ /* Currently this is a weaker check than for EMF, it only checks the size of the constant part
+ of the record */
nSize = U_WMRRECSAFE_get(contents, blimit);
- if(!nSize)break;
+ if(!nSize) {
+ file_status = 0;
+ break;
+ }
iType = *(uint8_t *)(contents + offsetof(U_METARECORD, iType ) );
+ wmr_mask = U_wmr_properties(iType);
+ if (wmr_mask == U_WMR_INVALID) {
+ file_status = 0;
+ break;
+ }
// Uncomment the following to track down toxic records
// std::cout << "record type: " << (int) iType << " name " << U_wmr_names(iType) << " length: " << nSize << " offset: " << off <<std::endl;
- wmr_mask = U_wmr_properties(iType);
- if(wmr_mask == U_WMR_INVALID){ throw "Inkscape fatal programming error at U_wmr_properties"; }
+ SVGOStringStream tmp_path;
+ SVGOStringStream tmp_str;
/* Uncomment the following to track down text problems */
//std::cout << "tri->dirty:"<< d->tri->dirty << " wmr_mask: " << std::hex << wmr_mask << std::dec << std::endl;
@@ -3026,14 +3035,17 @@ std::cout << "BEFORE DRAW"
// When testing, uncomment the following to place a comment for each processed WMR record in the SVG
// d->outsvg += dbg_str.str().c_str();
d->path += tmp_path.str().c_str();
- if(!nSize){ OK=0; std::cout << "nSize == 0, oops!!!" << std::endl; } // There was some problem with this record, it is not safe to continue
+ if(!nSize){ // There was some problem with the processing of this record, it is not safe to continue
+ file_status = 0;
+ break;
+ }
- } //end of while
+ } //end of while on OK
// When testing, uncomment the following to show the final SVG derived from the WMF
// std::cout << d->outsvg << std::endl;
(void) U_wmr_properties(U_WMR_INVALID); // force the release of the lookup table memory, returned value is irrelevant
- return 1;
+ return(file_status);
}
void Wmf::free_wmf_strings(WMF_STRINGS name){
@@ -3049,7 +3061,14 @@ SPDocument *
Wmf::open( Inkscape::Extension::Input * /*mod*/, const gchar *uri )
{
+ if (uri == NULL) {
+ return NULL;
+ }
+
WMF_CALLBACK_DATA d;
+
+ d.n_obj = 0; //these might not be set otherwise if the input file is corrupt
+ d.wmf_obj=NULL;
// Default font, WMF spec says device can pick whatever it wants.
// WMF files that do not specify a font are unlikely to look very good!
@@ -3064,12 +3083,12 @@ Wmf::open( Inkscape::Extension::Input * /*mod*/, const gchar *uri )
d.dc[0].style.stroke_dasharray.set = 0;
d.dc[0].style.stroke_linecap.computed = 2; // U_PS_ENDCAP_SQUARE;
d.dc[0].style.stroke_linejoin.computed = 0; // U_PS_JOIN_MITER;
- d.dc[0].style.stroke_width.value = 1.0; // will be reset to something reasonable once WMF draying size is known
+ d.dc[0].style.stroke_width.value = 1.0; // will be reset to something reasonable once WMF drawing size is known
d.dc[0].style.stroke.value.color.set( 0, 0, 0 );
+ d.dc[0].stroke_set = true;
- if (uri == NULL) {
- return NULL;
- }
+ // Default brush is none - no fill. WMF files that do not specify a brush are unlikely to look very good!
+ d.dc[0].fill_set = false;
d.dc[0].font_name = strdup("Arial"); // Default font, set only on lowest level, it copies up from there WMF spec says device can pick whatever it wants
@@ -3095,12 +3114,15 @@ Wmf::open( Inkscape::Extension::Input * /*mod*/, const gchar *uri )
FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP,
FT_KERNING_UNSCALED);
- (void) myMetaFileProc(contents,length, &d);
+ int good = myMetaFileProc(contents,length, &d);
free(contents);
// std::cout << "SVG Output: " << std::endl << d.outsvg << std::endl;
- SPDocument *doc = SPDocument::createNewDocFromMem(d.outsvg.c_str(), strlen(d.outsvg.c_str()), TRUE);
+ SPDocument *doc = NULL;
+ if (good) {
+ doc = SPDocument::createNewDocFromMem(d.outsvg.c_str(), strlen(d.outsvg.c_str()), TRUE);
+ }
free_wmf_strings(d.hatches);
free_wmf_strings(d.images);
diff --git a/src/extension/internal/wmf-print.cpp b/src/extension/internal/wmf-print.cpp
index f750044eb..127030832 100644
--- a/src/extension/internal/wmf-print.cpp
+++ b/src/extension/internal/wmf-print.cpp
@@ -60,6 +60,7 @@
#include "splivarot.h" // pieces for union on shapes
#include <2geom/svg-path-parser.h> // to get from SVG text to Geom::Path
#include "display/canvas-bpath.h" // for SPWindRule
+#include "display/cairo-utils.h" // for Inkscape::Pixbuf::PF_CAIRO
#include "wmf-print.h"
@@ -470,9 +471,8 @@ int PrintWmf::create_brush(SPStyle const *style, U_COLORREF *fcolor)
rgba_px = (char *) pixbuf->pixels(); // Do NOT free this!!!
colortype = U_BCBM_COLOR32;
(void) RGBA_to_DIB(&px, &cbPx, &ct, &numCt, rgba_px, width, height, width * 4, colortype, 0, 1);
- // Not sure why the next swap is needed because the preceding does it, and the code is identical
- // to that in stretchdibits_set, which does not need this.
- swapRBinRGBA(px, width * height);
+ // pixbuf can be either PF_CAIRO or PF_GDK, and these have R and B bytes swapped
+ if (pixbuf->pixelFormat() == Inkscape::Pixbuf::PF_CAIRO) { swapRBinRGBA(px, width * height); }
Bmih = bitmapinfoheader_set(width, height, 1, colortype, U_BI_RGB, 0, PXPERMETER, PXPERMETER, numCt, 0);
Bmi = bitmapinfo_set(Bmih, ct);
rec = wcreatedibpatternbrush_srcdib_set(&brush, wht, U_DIB_RGB_COLORS, Bmi, cbPx, px);
diff --git a/src/extension/param/bool.cpp b/src/extension/param/bool.cpp
index 548dec4fa..de9b1c586 100644
--- a/src/extension/param/bool.cpp
+++ b/src/extension/param/bool.cpp
@@ -10,10 +10,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/adjustment.h>
#include <gtkmm/box.h>
#include <gtkmm/spinbutton.h>
diff --git a/src/extension/param/color.cpp b/src/extension/param/color.cpp
index 5bd70359f..b774bac83 100644
--- a/src/extension/param/color.cpp
+++ b/src/extension/param/color.cpp
@@ -14,10 +14,6 @@
#include <iostream>
#include <sstream>
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/adjustment.h>
#include <gtkmm/box.h>
#include <gtkmm/spinbutton.h>
diff --git a/src/extension/param/description.cpp b/src/extension/param/description.cpp
index 95ed04afc..326e75e4a 100644
--- a/src/extension/param/description.cpp
+++ b/src/extension/param/description.cpp
@@ -13,10 +13,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/label.h>
#include <glibmm/i18n.h>
diff --git a/src/extension/param/enum.cpp b/src/extension/param/enum.cpp
index 74b2a75ad..8bc0fbda7 100644
--- a/src/extension/param/enum.cpp
+++ b/src/extension/param/enum.cpp
@@ -18,10 +18,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/comboboxtext.h>
#include <glibmm/i18n.h>
diff --git a/src/extension/param/float.cpp b/src/extension/param/float.cpp
index 464938f03..81508f6c0 100644
--- a/src/extension/param/float.cpp
+++ b/src/extension/param/float.cpp
@@ -10,10 +10,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/adjustment.h>
#include <gtkmm/box.h>
#include <gtkmm/scale.h>
diff --git a/src/extension/param/int.cpp b/src/extension/param/int.cpp
index 819c75693..c286018fd 100644
--- a/src/extension/param/int.cpp
+++ b/src/extension/param/int.cpp
@@ -10,10 +10,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/adjustment.h>
#include <gtkmm/box.h>
#include <gtkmm/scale.h>
diff --git a/src/extension/param/notebook.cpp b/src/extension/param/notebook.cpp
index 9ec31ca6b..20c8e8481 100644
--- a/src/extension/param/notebook.cpp
+++ b/src/extension/param/notebook.cpp
@@ -16,10 +16,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/adjustment.h>
#include <gtkmm/box.h>
#include <gtkmm/spinbutton.h>
diff --git a/src/extension/param/radiobutton.cpp b/src/extension/param/radiobutton.cpp
index 740acf1d1..8181c6f51 100644
--- a/src/extension/param/radiobutton.cpp
+++ b/src/extension/param/radiobutton.cpp
@@ -18,10 +18,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/comboboxtext.h>
#include <gtkmm/radiobutton.h>
diff --git a/src/extension/param/string.cpp b/src/extension/param/string.cpp
index d6e438db5..4e525ff73 100644
--- a/src/extension/param/string.cpp
+++ b/src/extension/param/string.cpp
@@ -10,10 +10,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/adjustment.h>
#include <gtkmm/box.h>
#include <gtkmm/spinbutton.h>
diff --git a/src/extension/prefdialog.h b/src/extension/prefdialog.h
index 905d35744..4714c2c3f 100644
--- a/src/extension/prefdialog.h
+++ b/src/extension/prefdialog.h
@@ -10,19 +10,10 @@
#ifndef INKSCAPE_EXTENSION_DIALOG_H__
#define INKSCAPE_EXTENSION_DIALOG_H__
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/dialog.h>
#include <glibmm/value.h>
#include <glibmm/ustring.h>
-
namespace Gtk {
class CheckButton;
}
diff --git a/src/file.cpp b/src/file.cpp
index f9e259fe2..984bf7e08 100644
--- a/src/file.cpp
+++ b/src/file.cpp
@@ -769,7 +769,7 @@ file_save_remote(SPDocument */*doc*/,
return false;
}
- result = gnome_vfs_create (&to_handle, uri_local, GNOME_VFS_OPEN_WRITE, FALSE, GNOME_VFS_PERM_USER_ALL);
+ gnome_vfs_create (&to_handle, uri_local, GNOME_VFS_OPEN_WRITE, FALSE, GNOME_VFS_PERM_USER_ALL);
result = gnome_vfs_open (&to_handle, uri_local, GNOME_VFS_OPEN_WRITE);
if (result != GNOME_VFS_OK) {
@@ -782,8 +782,8 @@ file_save_remote(SPDocument */*doc*/,
result = gnome_vfs_read (from_handle, buffer, 8192, &bytes_read);
if ((result == GNOME_VFS_ERROR_EOF) &&(!bytes_read)){
- result = gnome_vfs_close (from_handle);
- result = gnome_vfs_close (to_handle);
+ gnome_vfs_close (from_handle);
+ gnome_vfs_close (to_handle);
return true;
}
@@ -1069,7 +1069,7 @@ void sp_import_document(SPDesktop *desktop, SPDocument *clipdoc, bool in_place)
desktop->doc()->importDefs(clipdoc);
// copy objects
- GSList *pasted_objects = NULL;
+ std::vector<Inkscape::XML::Node*> pasted_objects;
for (Inkscape::XML::Node *obj = root->firstChild() ; obj ; obj = obj->next()) {
// Don't copy metadata, defs, named views and internal clipboard contents to the document
if (!strcmp(obj->name(), "svg:defs")) {
@@ -1088,9 +1088,8 @@ void sp_import_document(SPDesktop *desktop, SPDocument *clipdoc, bool in_place)
target_parent->appendChild(obj_copy);
Inkscape::GC::release(obj_copy);
- pasted_objects = g_slist_prepend(pasted_objects, (gpointer) obj_copy);
+ pasted_objects.push_back(obj_copy);
}
-
// Change the selection to the freshly pasted objects
Inkscape::Selection *selection = desktop->getSelection();
selection->setReprList(pasted_objects);
@@ -1129,8 +1128,6 @@ void sp_import_document(SPDesktop *desktop, SPDocument *clipdoc, bool in_place)
sp_selection_move_relative(selection, offset);
}
-
- g_slist_free(pasted_objects);
}
diff --git a/src/gradient-chemistry.cpp b/src/gradient-chemistry.cpp
index 02513379d..409e9f0e6 100644
--- a/src/gradient-chemistry.cpp
+++ b/src/gradient-chemistry.cpp
@@ -1570,8 +1570,9 @@ void sp_gradient_invert_selected_gradients(SPDesktop *desktop, Inkscape::PaintTa
{
Inkscape::Selection *selection = desktop->getSelection();
- for (GSList const* i = selection->itemList(); i != NULL; i = i->next) {
- sp_item_gradient_invert_vector_color(SP_ITEM(i->data), fill_or_stroke);
+ const std::vector<SPItem*> list=selection->itemList();
+ for (std::vector<SPItem*>::const_iterator i = list.begin(); i != list.end(); i++) {
+ sp_item_gradient_invert_vector_color(*i, fill_or_stroke);
}
// we did an undoable action
@@ -1594,9 +1595,10 @@ void sp_gradient_reverse_selected_gradients(SPDesktop *desktop)
if (drag && drag->selected) {
drag->selected_reverse_vector();
} else { // If no drag or no dragger selected, act on selection (both fill and stroke gradients)
- for (GSList const* i = selection->itemList(); i != NULL; i = i->next) {
- sp_item_gradient_reverse_vector(SP_ITEM(i->data), Inkscape::FOR_FILL);
- sp_item_gradient_reverse_vector(SP_ITEM(i->data), Inkscape::FOR_STROKE);
+ const std::vector<SPItem*> list=selection->itemList();
+ for (std::vector<SPItem*>::const_iterator i = list.begin(); i != list.end(); i++) {
+ sp_item_gradient_reverse_vector(*i, Inkscape::FOR_FILL);
+ sp_item_gradient_reverse_vector(*i, Inkscape::FOR_STROKE);
}
}
diff --git a/src/gradient-drag.cpp b/src/gradient-drag.cpp
index 7af7b11b2..b5a988729 100644
--- a/src/gradient-drag.cpp
+++ b/src/gradient-drag.cpp
@@ -1155,7 +1155,7 @@ static void gr_knot_clicked_handler(SPKnot */*knot*/, guint state, gpointer data
break;
default:
- break;
+ return;
}
@@ -2082,9 +2082,9 @@ void GrDrag::updateDraggers()
this->draggers = NULL;
g_return_if_fail(this->selection != NULL);
-
- for (GSList const* i = this->selection->itemList(); i != NULL; i = i->next) {
- SPItem *item = SP_ITEM(i->data);
+ std::vector<SPItem*> list = this->selection->itemList();
+ for (std::vector<SPItem*>::const_iterator i = list.begin(); i != list.end(); i++) {
+ SPItem *item = *i;
SPStyle *style = item->style;
if (style && (style->fill.isPaintserver())) {
@@ -2151,9 +2151,9 @@ void GrDrag::updateLines()
g_return_if_fail(this->selection != NULL);
- for (GSList const* i = this->selection->itemList(); i != NULL; i = i->next) {
-
- SPItem *item = SP_ITEM(i->data);
+ std::vector<SPItem*> list = this->selection->itemList();
+ for (std::vector<SPItem*>::const_iterator i = list.begin(); i != list.end(); i++) {
+ SPItem *item = *i;
SPStyle *style = item->style;
@@ -2295,8 +2295,9 @@ void GrDrag::updateLevels()
g_return_if_fail (this->selection != NULL);
- for (GSList const* i = this->selection->itemList(); i != NULL; i = i->next) {
- SPItem *item = SP_ITEM(i->data);
+ std::vector<SPItem*> list = this->selection->itemList();
+ for (std::vector<SPItem*>::const_iterator i = list.begin(); i != list.end(); i++) {
+ SPItem *item = *i;
Geom::OptRect rect = item->desktopVisualBounds();
if (rect) {
// Remember the edges of the bbox and the center axis
diff --git a/src/graphlayout.cpp b/src/graphlayout.cpp
index e5d61ab64..40994347c 100644
--- a/src/graphlayout.cpp
+++ b/src/graphlayout.cpp
@@ -88,9 +88,9 @@ struct CheckProgress : TestConvergence {
* Scans the items list and places those items that are
* not connectors in filtered
*/
-void filterConnectors(GSList const *const items, list<SPItem *> &filtered) {
- for(GSList *i=(GSList *)items; i!=NULL; i=i->next) {
- SPItem *item=SP_ITEM(i->data);
+void filterConnectors(std::vector<SPItem*> const &items, list<SPItem *> &filtered) {
+ for(std::vector<SPItem*>::const_iterator i = items.begin();i !=items.end(); i++){
+ SPItem *item = *i;
if(!isConnector(item)) {
filtered.push_back(item);
}
@@ -101,8 +101,8 @@ void filterConnectors(GSList const *const items, list<SPItem *> &filtered) {
* connectors between them, and uses graph layout techniques to find
* a nice layout
*/
-void graphlayout(GSList const *const items) {
- if(!items) {
+void graphlayout(std::vector<SPItem*> const &items) {
+ if(items.empty()) {
return;
}
diff --git a/src/graphlayout.h b/src/graphlayout.h
index 0ffb645b6..9794dd6b5 100644
--- a/src/graphlayout.h
+++ b/src/graphlayout.h
@@ -19,10 +19,10 @@
typedef struct _GSList GSList;
class SPItem;
-void graphlayout(GSList const *const items);
+void graphlayout(std::vector<SPItem*> const &items);
bool isConnector(SPItem const *const item);
-void filterConnectors(GSList const *const items, std::list<SPItem *> &filtered);
+void filterConnectors(std::vector<SPItem*> const &items, std::list<SPItem *> &filtered);
#endif // SEEN_GRAPHLAYOUT_H
diff --git a/src/helper-fns.h b/src/helper-fns.h
index 2f1829c37..79771a001 100644
--- a/src/helper-fns.h
+++ b/src/helper-fns.h
@@ -78,7 +78,7 @@ inline std::vector<gdouble> helperfns_read_vector(const gchar* value){
g_warning("helper-fns::helperfns_read_vector() Unable to convert \"%s\" to number", beg);
// We could leave this out, too. If strtod can't convert
// anything, it will return zero.
- ret = 0;
+ // ret = 0;
break;
}
v.push_back(ret);
diff --git a/src/helper/geom-pathstroke.cpp b/src/helper/geom-pathstroke.cpp
index 97e3c6806..a152af62c 100644
--- a/src/helper/geom-pathstroke.cpp
+++ b/src/helper/geom-pathstroke.cpp
@@ -127,87 +127,104 @@ static Circle touching_circle( D2<SBasis> const &curve, double t, double tol=0.0
namespace {
-// Join functions may:
-// - inspect any curve of the current path
-// - append any type of curve to the current path
-// - inspect the outgoing path
-//
-// Join functions must:
-// - append the outgoing curve
-// OR
-// - end at outgoing.finalPoint
-
-typedef void join_func(Geom::Path& res, Geom::Curve const& outgoing, double miter, double width);
-
-void bevel_join(Geom::Path& res, Geom::Curve const& outgoing, double /*miter*/, double /*width*/)
+// Internal data structure
+
+struct join_data
+{
+ join_data(Geom::Path &_res, Geom::Path const&_outgoing, Geom::Point _in_tang, Geom::Point _out_tang, double _miter, double _width)
+ : res(_res), outgoing(_outgoing), in_tang(_in_tang)
+ , out_tang(_out_tang), miter(_miter), width(_width) {}
+
+ // I/O
+ Geom::Path &res;
+ Geom::Path const& outgoing;
+
+ // input tangents
+ Geom::Point in_tang;
+ Geom::Point out_tang;
+
+ // line parameters
+ double miter;
+ double width;
+};
+
+// Join functions must append the outgoing path
+
+typedef void join_func(join_data jd);
+
+void bevel_join(join_data jd)
{
- res.appendNew<Geom::LineSegment>(outgoing.initialPoint());
- res.append(outgoing);
+ jd.res.appendNew<Geom::LineSegment>(jd.outgoing.initialPoint());
+ jd.res.append(jd.outgoing);
}
-void round_join(Geom::Path& res, Geom::Curve const& outgoing, double /*miter*/, double width)
+void round_join(join_data jd)
{
- res.appendNew<Geom::SVGEllipticalArc>(width, width, 0, false, width <= 0, outgoing.initialPoint());
- res.append(outgoing);
+ jd.res.appendNew<Geom::SVGEllipticalArc>(jd.width, jd.width, 0, false, jd.width <= 0, jd.outgoing.initialPoint());
+ jd.res.append(jd.outgoing);
}
-void miter_join_internal(Geom::Path& res, Geom::Curve const& outgoing, double miter, double width, bool clip)
+void miter_join_internal(join_data jd, bool clip)
{
- Geom::Curve const& incoming = res.back();
- Geom::Point tang1 = Geom::unitTangentAt(reverse(incoming.toSBasis()), 0.);
- Geom::Point tang2 = outgoing.unitTangentAt(0);
- Geom::Point p = Geom::intersection_point(incoming.finalPoint(), tang1, outgoing.initialPoint(), tang2);
+ using namespace Geom;
+
+ Curve const& incoming = jd.res.back();
+ Curve const& outgoing = jd.outgoing.front();
+ Path &res = jd.res;
+ double width = jd.width, miter = jd.miter;
+
+ Point tang1 = jd.in_tang;
+ Point tang2 = jd.out_tang;
+ Point p = intersection_point(incoming.finalPoint(), tang1, outgoing.initialPoint(), tang2);
bool satisfied = false;
bool inc_ls = res.back_open().degreesOfFreedom() <= 4;
if (p.isFinite()) {
// check size of miter
- Geom::Point point_on_path = incoming.finalPoint() + Geom::rot90(tang1)*width;
- satisfied = Geom::distance(p, point_on_path) <= miter * 2.0 * width;
+ Point point_on_path = incoming.finalPoint() + rot90(tang1)*width;
+ satisfied = distance(p, point_on_path) <= miter * 2.0 * width;
if (satisfied) {
// miter OK, check to see if we can do a relocation
if (inc_ls) {
res.setFinal(p);
} else {
- res.appendNew<Geom::LineSegment>(p);
+ res.appendNew<LineSegment>(p);
}
} else if (clip) {
// miter needs clipping, find two points
- Geom::Point bisector_versor = Geom::Line(point_on_path, p).versor();
- Geom::Point point_limit = point_on_path + miter * 2.0 * width * bisector_versor;
+ Point bisector_versor = Line(point_on_path, p).versor();
+ Point point_limit = point_on_path + miter * 2.0 * width * bisector_versor;
- Geom::Point p1 = Geom::intersection_point(incoming.finalPoint(), tang1, point_limit, bisector_versor.cw());
- Geom::Point p2 = Geom::intersection_point(outgoing.initialPoint(), tang2, point_limit, bisector_versor.cw());
+ Point p1 = intersection_point(incoming.finalPoint(), tang1, point_limit, bisector_versor.cw());
+ Point p2 = intersection_point(outgoing.initialPoint(), tang2, point_limit, bisector_versor.cw());
if (inc_ls) {
res.setFinal(p1);
} else {
- res.appendNew<Geom::LineSegment>(p1);
+ res.appendNew<LineSegment>(p1);
}
- res.appendNew<Geom::LineSegment>(p2);
+ res.appendNew<LineSegment>(p2);
}
}
- res.appendNew<Geom::LineSegment>(outgoing.initialPoint());
+ res.appendNew<LineSegment>(outgoing.initialPoint());
// check if we can do another relocation
bool out_ls = outgoing.degreesOfFreedom() <= 4;
- if ( (satisfied || clip) && out_ls) {
+ if ((satisfied || clip) && out_ls) {
res.setFinal(outgoing.finalPoint());
} else {
res.append(outgoing);
}
-}
-void miter_join(Geom::Path& res, Geom::Curve const& outgoing, double miter, double width) {
- miter_join_internal( res, outgoing, miter, width, false );
+ // either way, add the rest of the path
+ res.insert(res.end(), ++jd.outgoing.begin(), jd.outgoing.end());
}
-void miter_clip_join(Geom::Path& res, Geom::Curve const& outgoing, double miter, double width) {
- miter_join_internal( res, outgoing, miter, width, true );
-}
+void miter_join(join_data jd) { miter_join_internal(jd, false); }
+void miter_clip_join(join_data jd) { miter_join_internal(jd, true); }
Geom::Point pick_solution(Geom::Point points[2], Geom::Point tang2, Geom::Point endPt)
{
@@ -225,15 +242,18 @@ Geom::Point pick_solution(Geom::Point points[2], Geom::Point tang2, Geom::Point
return sol;
}
-void extrapolate_join(Geom::Path& res, Geom::Curve const& outgoing, double miter, double width)
+void extrapolate_join(join_data jd)
{
using namespace Geom;
+ Geom::Path &res = jd.res;
Geom::Curve const& incoming = res.back();
+ Geom::Curve const& outgoing = jd.outgoing.front();
Geom::Point startPt = incoming.finalPoint();
Geom::Point endPt = outgoing.initialPoint();
- Geom::Point tang1 = Geom::unitTangentAt(reverse(incoming.toSBasis()), 0.);
- Geom::Point tang2 = outgoing.unitTangentAt(0);
+ Geom::Point tang1 = jd.in_tang;
+ Geom::Point tang2 = jd.out_tang;
+ double width = jd.width, miter = jd.miter;
Geom::Circle circle1 = Geom::touching_circle(Geom::reverse(incoming.toSBasis()), 0.);
Geom::Circle circle2 = Geom::touching_circle(outgoing.toSBasis(), 0);
@@ -280,7 +300,7 @@ void extrapolate_join(Geom::Path& res, Geom::Curve const& outgoing, double miter
if (solutions != 2)
// no solutions available, fall back to miter
- return miter_clip_join(res, outgoing, miter, width);
+ return miter_clip_join(jd);
// We have a solution, thus sol is defined.
p1 = sol;
@@ -381,53 +401,78 @@ void extrapolate_join(Geom::Path& res, Geom::Curve const& outgoing, double miter
// Straight line segment:
res.appendNew<Geom::LineSegment>(outgoing.finalPoint());
}
-
+
+ // add the rest of the path
+ res.insert(res.end(), ++jd.outgoing.begin(), jd.outgoing.end());
+
delete arc1;
delete arc2;
}
-void join_inside(Geom::Path& res, Geom::Curve const& outgoing)
+void join_inside(join_data jd)
{
- Geom::Curve const& incoming = res.back_open();
- Geom::Crossings cross = Geom::crossings(incoming, outgoing);
-
- if (!cross.empty()) {
- // yeah if we could avoid allocing that'd be great
- Geom::Curve *d1 = incoming.portion(0., cross[0].ta);
- res.erase_last();
- res.append(*d1);
- delete d1;
+ Geom::Path &res = jd.res;
+ Geom::Path const& temp = jd.outgoing;
+ Geom::Crossings cross = Geom::crossings(res, temp);
+
+ int solution = -1; // lol, really hope there aren't more than INT_MAX crossings
+ if (cross.size() == 1) solution = 0;
+ else if (cross.size() > 1) {
+ // I am not sure how well this will work -- we pick the join node closest
+ // to the cross point of the paths
+ Geom::Point original = res.finalPoint()+Geom::rot90(jd.in_tang)*jd.width;
+ Geom::Coord trial = Geom::L2(res.pointAt(cross[0].ta)-original);
+ solution = 0;
+ for (size_t i = 1; i < cross.size(); ++i) {
+ //printf("Trying %d\n", i);
+ Geom::Coord test = Geom::L2(res.pointAt(cross[i].ta)-original);
+ if (test < trial) {
+ trial = test;
+ solution = i;
+ //printf("Found improved solution: %f\n", trial);
+ }
+ }
+ }
- Geom::Curve *d2 = outgoing.portion(cross[0].tb, 1.);
- res.setFinal(d2->initialPoint());
- res.append(*d2);
- delete d2;
+ if (solution != -1) {
+ Geom::Path d1 = res.portion(0., cross[solution].ta);
+ Geom::Path d2 = temp.portion(cross[solution].tb, temp.size());
+
+ // Watch for bugs in 2geom crossing regarding severe inflection points
+ res.clear();
+ res.append(d1);
+ res.setFinal(d2.initialPoint());
+ res.append(d2);
} else {
- res.appendNew<Geom::LineSegment>(outgoing.initialPoint());
- res.append(outgoing);
+ res.appendNew<Geom::LineSegment>(temp.initialPoint());
+ res.append(temp);
}
}
-bool decide(Geom::Curve const& incoming, Geom::Curve const& outgoing)
+void tangents(Geom::Point tang[2], Geom::Curve const& incoming, Geom::Curve const& outgoing)
{
Geom::Point tang1 = Geom::unitTangentAt(reverse(incoming.toSBasis()), 0.);
Geom::Point tang2 = outgoing.unitTangentAt(0.);
- return (Geom::cross(tang1, tang2) > 0);
+ tang[0] = tang1, tang[1] = tang2;
}
-void outline_helper(Geom::Path& res, Geom::Path const& to_add, double width, bool on_outside, double miter, Inkscape::LineJoinType join)
+void outline_helper(Geom::Path &res, Geom::Path const& temp, Geom::Point in_tang, Geom::Point out_tang, double width, double miter, Inkscape::LineJoinType join)
{
- if (res.size() == 0 || to_add.size() == 0)
+ if (res.size() == 0 || temp.size() == 0)
return;
- Geom::Curve const& outgoing = to_add[0];
+ Geom::Curve const& outgoing = temp.front();
if (Geom::are_near(res.finalPoint(), outgoing.initialPoint())) {
// if the points are /that/ close, just ignore this one
- res.setFinal(outgoing.initialPoint());
- res.append(outgoing);
+ res.setFinal(temp.initialPoint());
+ res.append(temp);
return;
}
+ join_data jd(res, temp, in_tang, out_tang, miter, width);
+
+ bool on_outside = (Geom::cross(in_tang, out_tang) > 0);
+
if (on_outside) {
join_func *jf;
switch (join) {
@@ -446,9 +491,9 @@ void outline_helper(Geom::Path& res, Geom::Path const& to_add, double width, boo
default:
jf = &miter_join;
}
- jf(res, outgoing, miter, width);
+ jf(jd);
} else {
- join_inside(res, outgoing);
+ join_inside(jd);
}
}
@@ -579,7 +624,7 @@ void offset_quadratic(Geom::Path& p, Geom::QuadraticBezier const& bez, double wi
void offset_curve(Geom::Path& res, Geom::Curve const* current, double width)
{
- double const tolerance = 0.005;
+ double const tolerance = 0.0025;
size_t levels = 8;
if (current->isDegenerate()) return; // don't do anything
@@ -705,6 +750,7 @@ Geom::Path half_outline(Geom::Path const& input, double width, double miter, Lin
Geom::Point tang1 = input[0].unitTangentAt(0);
Geom::Point start = input.initialPoint() + tang1 * width;
Geom::Path temp;
+ Geom::Point tang[2];
res.setStitching(true);
temp.setStitching(true);
@@ -723,20 +769,16 @@ Geom::Path half_outline(Geom::Path const& input, double width, double miter, Lin
if (u == 0) {
res.append(temp);
} else {
- bool on_outside = decide(input[u-1], input[u]);
- outline_helper(res, temp, width, on_outside, miter, join);
- if (temp.size() > 0)
- res.insert(res.end(), ++temp.begin(), temp.end());
+ tangents(tang, input[u-1], input[u]);
+ outline_helper(res, temp, tang[0], tang[1], width, miter, join);
}
// odd number of paths
if (u < k - 1) {
temp = Geom::Path();
offset_curve(temp, &input[u+1], width);
- bool on_outside = decide(input[u], input[u+1]);
- outline_helper(res, temp, width, on_outside, miter, join);
- if (temp.size() > 0)
- res.insert(res.end(), ++temp.begin(), temp.end());
+ tangents(tang, input[u], input[u+1]);
+ outline_helper(res, temp, tang[0], tang[1], width, miter, join);
}
}
@@ -747,8 +789,8 @@ Geom::Path half_outline(Geom::Path const& input, double width, double miter, Lin
temp.append(c1);
Geom::Path temp2;
temp2.append(c2);
- bool on_outside = decide(input.back(), input.front());
- outline_helper(temp, temp2, width, on_outside, miter, join);
+ tangents(tang, input.back(), input.front());
+ outline_helper(temp, temp2, tang[0], tang[1], width, miter, join);
res.erase(res.begin());
res.erase_last();
//
diff --git a/src/helper/geom.cpp b/src/helper/geom.cpp
index 42d1a3150..ecb330b01 100644
--- a/src/helper/geom.cpp
+++ b/src/helper/geom.cpp
@@ -265,14 +265,13 @@ geom_cubic_bbox_wind_distance (Geom::Coord x000, Geom::Coord y000,
Geom::Coord tolerance)
{
Geom::Coord x0, y0, x1, y1, len2;
- int needdist, needwind, needline;
+ int needdist, needwind;
const Geom::Coord Px = pt[X];
const Geom::Coord Py = pt[Y];
needdist = 0;
needwind = 0;
- needline = 0;
if (bbox) cubic_bbox (x000, y000, x001, y001, x011, y011, x111, y111, *bbox);
@@ -302,8 +301,6 @@ geom_cubic_bbox_wind_distance (Geom::Coord x000, Geom::Coord y000,
/* fixme: (Lauris) */
if (((y1 - y0) > 5.0) || ((x1 - x0) > 5.0)) {
needdist = 1;
- } else {
- needline = 1;
}
}
}
@@ -314,8 +311,6 @@ geom_cubic_bbox_wind_distance (Geom::Coord x000, Geom::Coord y000,
/* fixme: (Lauris) */
if (((y1 - y0) > 5.0) || ((x1 - x0) > 5.0)) {
needwind = 1;
- } else {
- needline = 1;
}
}
}
@@ -344,7 +339,7 @@ geom_cubic_bbox_wind_distance (Geom::Coord x000, Geom::Coord y000,
geom_cubic_bbox_wind_distance (x000, y000, x00t, y00t, x0tt, y0tt, xttt, yttt, pt, NULL, wind, best, tolerance);
geom_cubic_bbox_wind_distance (xttt, yttt, x1tt, y1tt, x11t, y11t, x111, y111, pt, NULL, wind, best, tolerance);
- } else if (1 || needline) {
+ } else {
geom_line_wind_distance (x000, y000, x111, y111, pt, wind, best);
}
}
diff --git a/src/helper/png-write.cpp b/src/helper/png-write.cpp
index 32e50b537..fc365c435 100644
--- a/src/helper/png-write.cpp
+++ b/src/helper/png-write.cpp
@@ -361,19 +361,19 @@ sp_export_get_rows(guchar const **rows, void **to_free, int row, int num_rows, v
/**
* Hide all items that are not listed in list, recursively, skipping groups and defs.
*/
-static void hide_other_items_recursively(SPObject *o, GSList *list, unsigned dkey)
+static void hide_other_items_recursively(SPObject *o, const std::vector<SPItem*> &list, unsigned dkey)
{
if ( SP_IS_ITEM(o)
&& !SP_IS_DEFS(o)
&& !SP_IS_ROOT(o)
&& !SP_IS_GROUP(o)
- && !g_slist_find(list, o) )
+ && list.end()==find(list.begin(),list.end(),o))
{
SP_ITEM(o)->invoke_hide(dkey);
}
// recurse
- if (!g_slist_find(list, o)) {
+ if (list.end()==find(list.begin(),list.end(),o)) {
for ( SPObject *child = o->firstChild() ; child; child = child->getNext() ) {
hide_other_items_recursively(child, list, dkey);
}
@@ -387,7 +387,7 @@ ExportResult sp_export_png_file(SPDocument *doc, gchar const *filename,
unsigned long bgcolor,
unsigned int (*status) (float, void *),
void *data, bool force_overwrite,
- GSList *items_only)
+ const std::vector<SPItem*> &items_only)
{
return sp_export_png_file(doc, filename, Geom::Rect(Geom::Point(x0,y0),Geom::Point(x1,y1)),
width, height, xdpi, ydpi, bgcolor, status, data, force_overwrite, items_only);
@@ -399,7 +399,7 @@ ExportResult sp_export_png_file(SPDocument *doc, gchar const *filename,
unsigned long bgcolor,
unsigned (*status)(float, void *),
void *data, bool force_overwrite,
- GSList *items_only)
+ const std::vector<SPItem*> &items_only)
{
g_return_val_if_fail(doc != NULL, EXPORT_ERROR);
g_return_val_if_fail(filename != NULL, EXPORT_ERROR);
@@ -457,7 +457,7 @@ ExportResult sp_export_png_file(SPDocument *doc, gchar const *filename,
// We show all and then hide all items we don't want, instead of showing only requested items,
// because that would not work if the shown item references something in defs
- if (items_only) {
+ if (!items_only.empty()) {
hide_other_items_recursively(doc->getRoot(), items_only, dkey);
}
diff --git a/src/helper/png-write.h b/src/helper/png-write.h
index 8c04b25dc..2657fb635 100644
--- a/src/helper/png-write.h
+++ b/src/helper/png-write.h
@@ -14,8 +14,9 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
#include <2geom/forward.h>
+
+
class SPDocument;
enum ExportResult {
@@ -33,12 +34,12 @@ ExportResult sp_export_png_file(SPDocument *doc, gchar const *filename,
double x0, double y0, double x1, double y1,
unsigned long int width, unsigned long int height, double xdpi, double ydpi,
unsigned long bgcolor,
- unsigned int (*status) (float, void *), void *data, bool force_overwrite = false, GSList *items_only = NULL);
+ unsigned int (*status) (float, void *), void *data, bool force_overwrite = false, const std::vector<SPItem*> &items_only = std::vector<SPItem*>());
ExportResult sp_export_png_file(SPDocument *doc, gchar const *filename,
Geom::Rect const &area,
unsigned long int width, unsigned long int height, double xdpi, double ydpi,
unsigned long bgcolor,
- unsigned int (*status) (float, void *), void *data, bool force_overwrite = false, GSList *items_only = NULL);
+ unsigned int (*status) (float, void *), void *data, bool force_overwrite = false, const std::vector<SPItem*> &items_only = std::vector<SPItem*>());
#endif // SEEN_SP_PNG_WRITE_H
diff --git a/src/inkscape.cpp b/src/inkscape.cpp
index 6a0e0f35a..888a64430 100644
--- a/src/inkscape.cpp
+++ b/src/inkscape.cpp
@@ -22,10 +22,6 @@
#include <map>
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/messagedialog.h>
#include "debug/simple-event.h"
#include "debug/event-tracker.h"
diff --git a/src/inkview.cpp b/src/inkview.cpp
index 2c667237e..8b7492798 100644
--- a/src/inkview.cpp
+++ b/src/inkview.cpp
@@ -274,7 +274,7 @@ main (int argc, const char **argv)
gchar *last_filename = jar_file_reader.get_last_filename();
if (ss.doc) {
ss.slides[ss.length++] = strdup (last_filename);
- (ss.doc)->setUri (strdup(last_filename));
+ (ss.doc)->setUri (last_filename);
}
g_byte_array_free(gba, TRUE);
g_free(last_filename);
diff --git a/src/libavoid/connector.cpp b/src/libavoid/connector.cpp
index 40ded7498..36892c668 100644
--- a/src/libavoid/connector.cpp
+++ b/src/libavoid/connector.cpp
@@ -1476,7 +1476,6 @@ CrossingsInfoPair countRealCrossings(Avoid::Polygon& poly,
int prevTurnDir = -1;
int startCornerSide = 1;
int endCornerSide = 1;
- bool reversed = false;
if (!front_same)
{
// If there is a divergence at the beginning,
@@ -1485,7 +1484,6 @@ CrossingsInfoPair countRealCrossings(Avoid::Polygon& poly,
startCornerSide = Avoid::cornerSide(*c_path[0], *c_path[1],
*c_path[2], *p_path[0])
* segDir(*c_path[1], *c_path[2]);
- reversed = (startCornerSide != -prevTurnDir);
}
if (!back_same)
{
@@ -1497,7 +1495,6 @@ CrossingsInfoPair countRealCrossings(Avoid::Polygon& poly,
*c_path[size - 2], *c_path[size - 1],
*p_path[size - 1])
* segDir(*c_path[size - 3], *c_path[size - 2]);
- reversed = (endCornerSide != -prevTurnDir);
}
else
{
@@ -1578,10 +1575,9 @@ CrossingsInfoPair countRealCrossings(Avoid::Polygon& poly,
}
}
#endif
- prevTurnDir = 0;
if (pointOrders)
{
- reversed = false;
+ bool reversed = false;
size_t startPt = (front_same) ? 0 : 1;
// Orthogonal should always have at least one segment.
diff --git a/src/libavoid/graph.cpp b/src/libavoid/graph.cpp
index 728f8c085..5b617f123 100644
--- a/src/libavoid/graph.cpp
+++ b/src/libavoid/graph.cpp
@@ -129,7 +129,9 @@ static inline int orthogTurnOrder(const Point& a, const Point& b,
// Note: This method assumes the two Edges that share a common point.
bool EdgeInf::rotationLessThan(const VertInf *lastV, const EdgeInf *rhs) const
{
- if ((_v1 == rhs->_v1) && (_v2 == rhs->_v2))
+ assert(_v1 == rhs->_v1 || _v1 == rhs->_v2 || _v2 == rhs->_v1 || _v2 == rhs->_v2 );
+
+ if ((_v1 == rhs->_v1) && (_v2 == rhs->_v2))
{
// Effectively the same visibility edge, so they are equal.
return false;
diff --git a/src/libavoid/orthogonal.cpp b/src/libavoid/orthogonal.cpp
index b5ef8d7e8..466d1dd58 100644
--- a/src/libavoid/orthogonal.cpp
+++ b/src/libavoid/orthogonal.cpp
@@ -1548,7 +1548,6 @@ extern void generateStaticOrthogonalVisGraph(Router *router)
// Process the horizontal sweep
thisPos = (totalEvents > 0) ? events[0]->pos : 0;
posStartIndex = 0;
- posFinishIndex = 0;
for (unsigned i = 0; i <= totalEvents; ++i)
{
// If we have finished the current scanline or all events, then we
diff --git a/src/libdepixelize/kopftracer2011.cpp b/src/libdepixelize/kopftracer2011.cpp
index 1e769b0c9..96784b14f 100644
--- a/src/libdepixelize/kopftracer2011.cpp
+++ b/src/libdepixelize/kopftracer2011.cpp
@@ -28,11 +28,6 @@
#include <glibmm.h>
-// Build fix under Inkscape build tree
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <algorithm>
#include "kopftracer2011.h"
#include "priv/colorspace.h"
@@ -667,4 +662,4 @@ inline bool Heuristics::islands(PixelGraph::const_iterator a,
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/libnrtype/FontFactory.h b/src/libnrtype/FontFactory.h
index bd5a4460c..4c8c2cb29 100644
--- a/src/libnrtype/FontFactory.h
+++ b/src/libnrtype/FontFactory.h
@@ -68,7 +68,7 @@ public:
};
// Map type for gathering UI family and style names
-typedef std::map<Glib::ustring, std::list<StyleNames> > FamilyToStylesMap;
+// typedef std::map<Glib::ustring, std::list<StyleNames> > FamilyToStylesMap;
class font_factory {
public:
diff --git a/src/libnrtype/Layout-TNG-OutIter.cpp b/src/libnrtype/Layout-TNG-OutIter.cpp
index c9c318960..707897f50 100644
--- a/src/libnrtype/Layout-TNG-OutIter.cpp
+++ b/src/libnrtype/Layout-TNG-OutIter.cpp
@@ -788,12 +788,12 @@ bool Layout::iterator::prevLineCursor(int n)
{
if (!_cursor_moving_vertically)
beginCursorUpDown();
- unsigned line_index;
+ int line_index;
if (_char_index == _parent_layout->_characters.size())
line_index = _parent_layout->_lines.size() - 1;
else
line_index = _parent_layout->_characters[_char_index].chunk(_parent_layout).in_line;
- if (line_index == 0)
+ if (line_index <= 0)
return false; // nowhere to go
else
n = MIN (n, static_cast<int>(line_index));
diff --git a/src/libnrtype/Layout-TNG.h b/src/libnrtype/Layout-TNG.h
index e91c32ebe..26db1fad9 100644
--- a/src/libnrtype/Layout-TNG.h
+++ b/src/libnrtype/Layout-TNG.h
@@ -701,7 +701,11 @@ private:
/** The overall block-progression of the whole flow. */
inline Direction _blockProgression() const
- {return static_cast<InputStreamTextSource*>(_input_stream.front())->styleGetBlockProgression();}
+ {
+ if(!_input_stream.empty())
+ return static_cast<InputStreamTextSource*>(_input_stream.front())->styleGetBlockProgression();
+ return TOP_TO_BOTTOM;
+ }
/** so that LEFT_TO_RIGHT == RIGHT_TO_LEFT but != TOP_TO_BOTTOM */
static bool _directions_are_orthogonal(Direction d1, Direction d2);
diff --git a/src/libuemf/CMakeLists.txt b/src/libuemf/CMakeLists.txt
index f5a97f212..922d404a6 100644
--- a/src/libuemf/CMakeLists.txt
+++ b/src/libuemf/CMakeLists.txt
@@ -4,6 +4,7 @@ set(libuemf_SRC
uemf.c
uemf_endian.c
uemf_print.c
+ uemf_safe.c
uemf_utf.c
uwmf.c
uwmf_endian.c
diff --git a/src/libuemf/Makefile_insert b/src/libuemf/Makefile_insert
index 004c56dfc..427a0e80e 100644
--- a/src/libuemf/Makefile_insert
+++ b/src/libuemf/Makefile_insert
@@ -12,6 +12,8 @@ libuemf_libuemf_a_SOURCES = \
libuemf/uemf_endian.h \
libuemf/uemf_print.c \
libuemf/uemf_print.h \
+ libuemf/uemf_safe.c \
+ libuemf/uemf_safe.h \
libuemf/uemf_utf.c \
libuemf/uemf_utf.h \
libuemf/uwmf.c \
diff --git a/src/libuemf/README b/src/libuemf/README
index cfa322178..a3dff9b4c 100644
--- a/src/libuemf/README
+++ b/src/libuemf/README
@@ -1,22 +1,25 @@
Overview:
-libUEMF is a portable C99 implementation for reading/writing Enhanced Metafile (EMF)
-and Windows Metafile (WMF) files. libUEMF avoids collisions with with Microsoft defined
-functions and values, so portable programs which use it, and have a Windows version, do
-not require any conditional logic to separate the native GDI support from the WMF/EMF support
-proviced by libUEMF. To accomplish this libUEMF does not implement GDI calls. Instead,
-for each WMR/EMR record type, and each object type incorporated into such a record, it provides
-corresponding *_set, *_print, and *_swap functions. (For WMF there are also *_get functions, see below.)
-For example, for the U_EMRBITBLT record there are corresponding functions:
-U_EMRBITBLT_set, U_EMRBITBLT_print, and U_EMRBITBLT_swap. A few additional functions are provided for
-assembling the EMF in memory, debugging, and converting the EMF file to/from Little Endian representation.
-(EMF files' internal data representation is always Little Endian.)
-
-This code has been tested on 32 bit Ubuntu (LE), 32 bit Mingw, 64 bit Manriva, and 64 bit Solaris (BE).
+libUEMF is a portable C99 implementation for reading/writing Enhanced Metafile (EMF),
+Enhanced Metafile Format Plus (PMF), and Windows Metafile (WMF) files. libUEMF
+avoids collisions with Microsoft defined functions and values, so portable programs
+which use it and have a Windows version, do not require any conditional logic to
+separate the native GDI support from the WMF/EMF/PMF support proviced by libUEMF. To
+accomplish this libUEMF does not implement GDI calls. Instead, for each WMR/EMR/PMR
+record type, and each object type incorporated into such a record, it provides
+corresponding *_set, *_print, and *_swap functions. For PMF and WMF there are also
+*_get functions, see below. For example, for the U_EMRBITBLT record there are
+corresponding functions: U_EMRBITBLT_set, U_EMRBITBLT_print, and U_EMRBITBLT_swap. A
+few additional functions are provided for assembling the EMF in memory, debugging, and
+converting the EMF file to/from Little Endian representation. (EMF files' internal
+data representation is always Little Endian.)
+
+This code has been tested on 32 bit Ubuntu (LE), 32 bit Mingw, 64 bit Mageia, and 64
+bit Solaris (BE).
libUEMF is released under the GPL 2 license, read the file 'COPYING' for more information
-Version 0.1.10, released January 15, 2014.
+Version 0.2.1, released April 23, 2015.
To report bugs or provide feedback send email to David Mathog, mathog@caltech.edu.
@@ -76,7 +79,14 @@ uemf_endian.c Contains the *_swap functions needed to rearrange bytes betwee
uemf_endian.h Prototype for U_emf_endian() and definitions for Endian type of the local machine.
-
+uemf_safe.c Contains the *_safe functions for EMF records, which verify that all
+ offsets and counts stay within the declared size of a record. Also checks that
+ core record sizes are sane. U_emf_record_safe() is the only _safe function which
+ user code should call directly, and then ONLY after a previous call to
+ U_emf_record_sizeok(), which is in the endian file.
+
+uemf_safe.h Prototype for U_emf_record_safe().
+ .
upmf.c Contains the *_set and *_get functions needed to construct or read an EMF+ file.
Also contains auxilliary functions for debugging and constructing
EMF+ files in memory.
@@ -366,9 +376,69 @@ History
(Note, version numbers in files represent the libUEMF release where it was last modified, so not
all files will show the same version numbers in each release.)
+0.2.1.2015_04_23
+ Bug in safety check on EMREXTCREATEFONTINDIRECTW because it had alternative "standard" record sizes.
+ Changed warnings on unimplemented EMF record types encounterd in swap or safe from stdout to stderr.
+ Added memory checking for WMF polyline and polygon records, for the variable part and some others.
+ Note: U_WMRCREATEREGION_get does not check that the variable part stays within the record. Current
+ implementation seems to be broken since it does not show up in XP preview.
+0.2.0 2015_03_20
+ Added UEMF _safe functions to better handle corrupt records, where variable sizes fields might
+ have been specified to read past the end of memory. These are records with offsets, arrays
+ with counts, and bitmaps. Also any record which specifies a size smaller than the minimum
+ for that record type.
+ Added similar code for EMF+.
+ These changed the API so the minor version number was bumped by 1.
+
+0.1.18 2015_01_15
+ Pierre-Francois Carpentier sent some EMF examples which used U_EMR_EXTSELECTCLIPRGN, which had
+ not previously been encountered and showed that the handling of regions was broken.
+ Added tests for U_EMRFILLRGN, U_EMRFRAMERGN, U_EMRFRAMERGN, U_EMREXTSELECTCLIPRGN to testbed_emf.
+
+0.1.18 2014_04_28
+ Fixed typo in testbed_wmf.c. "include,include" in one place should have been
+ "exclude,exclude".
+
+0.1.17 2014_04_25
+ Added text clipping tests to testbed_emf.c, testbed_wmf.c, and testbed_pmf.c.
+ Added option to omit clipping tests in testbed's.
+
+0.1.16 2014_04_14
+ Fixed bug in U_WMRRESTOREDC_set.
+ Added clipping tests to testbed_wmf.c.
+
+0.1.15 2014_04_04
+ Changed record flags for U_EMRSELECTCLIPPATH record, it consumes a path but does not ALTER (which
+ forced a premature draw.)
+ Added U_EMROFFSETCLIPRGN test to testbed_emf.c.
+ Changed location on dist drawing where clipping appears.
+
+0.1.14 2014_03_27
+ Fixed bug, in U_PMF_RECTN_set() in upmf.c. Never tested.
+ Fixed a few potential bugs in upmf.c if a null pointer was passed for
+ certain function arguments. (Previously unhandled cases.)
+ Fixed bug, operations setting variables that are never read along those
+ execution paths: upmf_print.c, uemf.c, uwmf.c, uemf_endian.cm upmf.c.
+ Fixed potential (but very unlikely) memory leaks in upmf.c and uemf_utf.c.
+ Added test of U_PMF_RECTN_set to testbed_pmf.c.
+ Changed U_wmr_names() and U_wmr_escnames() to const char* (from char*).
+ Changed method for suppressing unused parameter warnings.
+
+
+0.1.13 2014-03-21
+ Fixed bug, cutemf was messing up the object count (pens, brushes, etc.).
+ Added cutemf can now take ranges of lines.
+ Added testbed_emf generates clipping records for rect and path (but not region).
+
+0.1.12 2014-02-14
+ Documentation change, U_WMRCREATEPATTERNBRUSH is obsolete.
+ Changed wmf_finish() so that it accurately reflects the largest number of objects used,
+ previously it showed the number of appends, which was much larger.
+
0.1.11 2014-01-29
Fixed bug in uwmf.c (wrong minimum record size on U_WMRTEXTOUT)
Fixed bug in uwmf.c (U_WMRCREATEPATTERNBRUSH not right)
+ Fixed bug in uwmf_print.c (U_WMRTEXTOUT_print, x,y were reversed)
Added error handling to uemf_utf.c for cases where src is a null pointer.
Added a test of createpatternbrush to testlib_wmf
diff --git a/src/libuemf/uemf.c b/src/libuemf/uemf.c
index 1d417dece..3180c757c 100644
--- a/src/libuemf/uemf.c
+++ b/src/libuemf/uemf.c
@@ -16,11 +16,11 @@
/*
File: uemf.c
-Version: 0.0.28
-Date: 04-APR-2014
+Version: 0.0.30
+Date: 20-MAR-2015
Author: David Mathog, Biology Division, Caltech
email: mathog@caltech.edu
-Copyright: 2014 David Mathog and California Institute of Technology (Caltech)
+Copyright: 2015 David Mathog and California Institute of Technology (Caltech)
*/
#ifdef __cplusplus
@@ -199,7 +199,7 @@ definitions are not needed in end user code, so they are here rather than in uem
// this one may also be used A=Msk,B=MskBmi and F=cbMsk
#define SET_CB_FROM_PXBMI(A,B,C,D,E,F) /* A=Px, B=Bmi, C=cbImage, D=cbImage4, E=cbBmi, F=cbPx */ \
if(A){\
- if(!B)return(NULL); /* size is derived from U_BIMAPINFO, but NOT from its size field, go figure*/ \
+ if(!B)return(NULL); /* size is derived from U_BITMAPINFO, but NOT from its size field, go figure*/ \
C = F;\
D = UP4(C); /* pixel array might not be a multiples of 4 bytes*/ \
E = sizeof(U_BITMAPINFOHEADER) + 4 * get_real_color_count((const char *) &(B->bmiHeader)); /* bmiheader + colortable*/ \
@@ -851,7 +851,7 @@ int get_real_color_icount(
\brief Get the DIB parameters from the BMI of the record for use by DBI_to_RGBA()
\return BI_Compression Enumeration. For anything other than U_BI_RGB values other than px may not be valid.
- \param pEmr pointer to EMR record that has a U_BITMAPINFO and bitmap
+ \param record pointer to EMR record that has a U_BITMAPINFO and bitmap
\param offBitsSrc Offset to the bitmap
\param offBmiSrc Offset to the U_BITMAPINFO
\param px pointer to DIB pixel array in pEmr
@@ -863,7 +863,7 @@ int get_real_color_icount(
\param invert If DIB rows are in opposite order from RGBA rows
*/
int get_DIB_params(
- void *pEmr,
+ const char *record,
uint32_t offBitsSrc,
uint32_t offBmiSrc,
const char **px,
@@ -875,7 +875,7 @@ int get_DIB_params(
uint32_t *invert
){
uint32_t bic;
- PU_BITMAPINFO Bmi = (PU_BITMAPINFO)((char *)pEmr + offBmiSrc);
+ PU_BITMAPINFO Bmi = (PU_BITMAPINFO)(record + offBmiSrc);
PU_BITMAPINFOHEADER Bmih = &(Bmi->bmiHeader);
/* if biCompression is not U_BI_RGB some or all of the following might not hold real values */
bic = Bmih->biCompression;
@@ -903,7 +903,7 @@ int get_DIB_params(
*numCt = Bmih->biSizeImage;
*ct = NULL;
}
- *px = (char *)((char *)pEmr + offBitsSrc);
+ *px = record + offBitsSrc;
return(bic);
}
@@ -1611,6 +1611,26 @@ U_RECTL rectl_set(
}
/**
+ \brief Set rect and rectl objects from Upper Left and Lower Right corner points.
+ \param array array of rectangles
+ \param index array entry to fill, numbered from 0
+ \param ul upper left corner of rectangle
+ \param lr lower right corner of rectangle
+*/
+void rectli_set(
+ PU_RECTL array,
+ int index,
+ U_POINTL ul,
+ U_POINTL lr
+ ){
+ PU_RECTL rct = &(array[index]);
+ rct->left = ul.x;
+ rct->top = ul.y;
+ rct->right = lr.x;
+ rct->bottom = lr.y;
+}
+
+/**
\brief Set sizel objects with X,Y values.
\param x X coordinate
\param y Y coordinate
@@ -2192,7 +2212,7 @@ U_RGNDATAHEADER rgndataheader_set(
rdh.dwSize = U_RDH_OBJSIZE;
rdh.iType = U_RDH_RECTANGLES;
rdh.nCount = nCount;
- rdh.nRgnSize = nCount * sizeof(U_RECTL); // Size in bytes of retangle array
+ rdh.nRgnSize = nCount * sizeof(U_RECTL); // Size in bytes of rectangle array
rdh.rclBounds = rclBounds;
return(rdh);
}
@@ -2857,7 +2877,7 @@ by end user code and to further that end prototypes are NOT provided and they ar
// Functions with the same form starting with U_EMRPOLYBEZIER_set
-char *U_EMR_CORE1(uint32_t iType, U_RECTL rclBounds, const uint32_t cptl, const U_POINTL *points){
+char *U_EMR_CORE1_set(uint32_t iType, U_RECTL rclBounds, const uint32_t cptl, const U_POINTL *points){
char *record;
int cbPoints;
int irecsize;
@@ -2876,7 +2896,7 @@ char *U_EMR_CORE1(uint32_t iType, U_RECTL rclBounds, const uint32_t cptl, const
}
// Functions with the same form starting with U_EMR_POLYPOLYLINE
-char *U_EMR_CORE2(uint32_t iType, U_RECTL rclBounds, const uint32_t nPolys, const uint32_t *aPolyCounts,const uint32_t cptl, const U_POINTL *points){
+char *U_EMR_CORE2_set(uint32_t iType, U_RECTL rclBounds, const uint32_t nPolys, const uint32_t *aPolyCounts,const uint32_t cptl, const U_POINTL *points){
char *record;
int cbPolys,cbPoints,off;
int irecsize;
@@ -2899,7 +2919,7 @@ char *U_EMR_CORE2(uint32_t iType, U_RECTL rclBounds, const uint32_t nPolys, cons
}
// Functions with the same form starting with U_EMR_SETMAPMODE_set
-char *U_EMR_CORE3(uint32_t iType, uint32_t iMode){
+char *U_EMR_CORE3_set(uint32_t iType, uint32_t iMode){
char *record;
int irecsize;
@@ -2914,7 +2934,7 @@ char *U_EMR_CORE3(uint32_t iType, uint32_t iMode){
}
// Functions taking a single U_RECT or U_RECTL, starting with U_EMRELLIPSE_set, also U_EMRFILLPATH,
-char *U_EMR_CORE4(uint32_t iType, U_RECTL rclBox){
+char *U_EMR_CORE4_set(uint32_t iType, U_RECTL rclBox){
char *record;
int irecsize;
@@ -2930,7 +2950,7 @@ char *U_EMR_CORE4(uint32_t iType, U_RECTL rclBox){
}
// Functions with the same form starting with U_EMRSETMETARGN_set
-char *U_EMR_CORE5(uint32_t iType){
+char *U_EMR_CORE5_set(uint32_t iType){
char *record;
int irecsize = 8;
@@ -2943,7 +2963,7 @@ char *U_EMR_CORE5(uint32_t iType){
}
// Functions with the same form starting with U_EMRPOLYBEZIER16_set
-char *U_EMR_CORE6(uint32_t iType, U_RECTL rclBounds, const uint32_t cpts, const U_POINT16 *points){
+char *U_EMR_CORE6_set(uint32_t iType, U_RECTL rclBounds, const uint32_t cpts, const U_POINT16 *points){
char *record;
int cbPoints,cbPoints4,off;
int irecsize;
@@ -2970,7 +2990,7 @@ char *U_EMR_CORE6(uint32_t iType, U_RECTL rclBounds, const uint32_t cpts, const
// Functions that take a single struct argument which contains two uint32_t, starting with U_EMRSETWINDOWEXTEX_set
// these all pass two 32 bit ints and are cast by the caller to U_PAIR
-char *U_EMR_CORE7(uint32_t iType, U_PAIR pair){
+char *U_EMR_CORE7_set(uint32_t iType, U_PAIR pair){
char *record;
int irecsize = sizeof(U_EMRGENERICPAIR);
@@ -2984,7 +3004,7 @@ char *U_EMR_CORE7(uint32_t iType, U_PAIR pair){
}
// For U_EMREXTTEXTOUTA and U_EMREXTTEXTOUTW
-char *U_EMR_CORE8(
+char *U_EMR_CORE8_set(
uint32_t iType,
U_RECTL rclBounds, // Bounding rectangle in device units
uint32_t iGraphicsMode, // Graphics mode Enumeration
@@ -3033,7 +3053,7 @@ char *U_EMR_CORE8(
}
// Functions that take a rect and a pair of points, starting with U_EMRARC_set
-char *U_EMR_CORE9(uint32_t iType, U_RECTL rclBox, U_POINTL ptlStart, U_POINTL ptlEnd){
+char *U_EMR_CORE9_set(uint32_t iType, U_RECTL rclBox, U_POINTL ptlStart, U_POINTL ptlEnd){
char *record;
int irecsize = sizeof(U_EMRARC);
@@ -3049,7 +3069,7 @@ char *U_EMR_CORE9(uint32_t iType, U_RECTL rclBox, U_POINTL ptlStart, U_POINTL pt
}
// Functions with the same form starting with U_EMR_POLYPOLYLINE16
-char *U_EMR_CORE10(uint32_t iType, U_RECTL rclBounds, const uint32_t nPolys, const uint32_t *aPolyCounts,const uint32_t cpts, const U_POINT16 *points){
+char *U_EMR_CORE10_set(uint32_t iType, U_RECTL rclBounds, const uint32_t nPolys, const uint32_t *aPolyCounts,const uint32_t cpts, const U_POINT16 *points){
char *record;
int cbPoints,cbPolys,off;
int irecsize;
@@ -3072,25 +3092,27 @@ char *U_EMR_CORE10(uint32_t iType, U_RECTL rclBounds, const uint32_t nPolys, con
}
// common code for U_EMRINVERTRGN and U_EMRPAINTRGN,
-char *U_EMR_CORE11(uint32_t iType, PU_RGNDATA RgnData){
+char *U_EMR_CORE11_set(uint32_t iType, PU_RGNDATA RgnData){
char *record;
int irecsize;
- int cbRgns,cbRgns4,off;
+ int cbRgns,cbRgns4,rds,rds4,off;
if(!RgnData)return(NULL);
cbRgns = ((PU_RGNDATAHEADER) RgnData)->nRgnSize;
cbRgns4 = UP4(cbRgns);
- irecsize = sizeof(U_EMRINVERTRGN) + cbRgns4 - sizeof(U_RGNDATAHEADER); // core + array - overlap
- record = malloc(irecsize);
+ rds = sizeof(U_RGNDATAHEADER) + cbRgns;
+ rds4 = UP4(rds);
+ irecsize = sizeof(U_EMRINVERTRGN) - sizeof(U_RECTL) + cbRgns4; // core + array - overlap of one rectL
+ record = malloc(irecsize);
if(record){
((PU_EMR) record)->iType = iType;
((PU_EMR) record)->nSize = irecsize;
((PU_EMRINVERTRGN) record)->rclBounds = ((PU_RGNDATAHEADER) RgnData)->rclBounds;
- ((PU_EMRINVERTRGN) record)->cbRgnData = cbRgns;
- off = irecsize - cbRgns4;
- memcpy(record + off, RgnData, cbRgns);
- off += cbRgns;
- if(cbRgns < cbRgns4){ memset(record + off,0, cbRgns4 - cbRgns); } // clear any unused bytes
+ ((PU_EMRINVERTRGN) record)->cbRgnData = rds;
+ off = sizeof(U_EMRINVERTRGN) - sizeof(U_RGNDATA);
+ memcpy(record + off, RgnData, rds);
+ off += rds;
+ if(rds < rds4){ memset(record + off,0, rds4 - rds); } // clear any unused bytes
}
return(record);
}
@@ -3274,7 +3296,7 @@ char *U_EMRPOLYBEZIER_set(
const uint32_t cptl,
const U_POINTL *points
){
- return(U_EMR_CORE1(U_EMR_POLYBEZIER, rclBounds, cptl, points));
+ return(U_EMR_CORE1_set(U_EMR_POLYBEZIER, rclBounds, cptl, points));
}
// U_EMRPOLYGON_set 3
@@ -3290,7 +3312,7 @@ char *U_EMRPOLYGON_set(
const uint32_t cptl,
const U_POINTL *points
){
- return(U_EMR_CORE1(U_EMR_POLYGON, rclBounds, cptl, points));
+ return(U_EMR_CORE1_set(U_EMR_POLYGON, rclBounds, cptl, points));
}
// U_EMRPOLYLINE_set 4
@@ -3306,7 +3328,7 @@ char *U_EMRPOLYLINE_set(
const uint32_t cptl,
const U_POINTL *points
){
- return(U_EMR_CORE1(U_EMR_POLYLINE, rclBounds, cptl, points));
+ return(U_EMR_CORE1_set(U_EMR_POLYLINE, rclBounds, cptl, points));
}
// U_EMRPOLYBEZIERTO_set 5
@@ -3322,7 +3344,7 @@ char *U_EMRPOLYBEZIERTO_set(
const uint32_t cptl,
const U_POINTL *points
){
- return(U_EMR_CORE1(U_EMR_POLYBEZIERTO, rclBounds, cptl, points));
+ return(U_EMR_CORE1_set(U_EMR_POLYBEZIERTO, rclBounds, cptl, points));
}
// U_EMRPOLYLINETO_set 6
@@ -3338,7 +3360,7 @@ char *U_EMRPOLYLINETO_set(
const uint32_t cptl,
const U_POINTL *points
){
- return(U_EMR_CORE1(U_EMR_POLYLINETO, rclBounds, cptl, points));
+ return(U_EMR_CORE1_set(U_EMR_POLYLINETO, rclBounds, cptl, points));
}
// U_EMRPOLYPOLYLINE_set 7
@@ -3358,7 +3380,7 @@ char *U_EMRPOLYPOLYLINE_set(
const uint32_t cptl,
const U_POINTL *points
){
- return(U_EMR_CORE2(U_EMR_POLYPOLYLINE, rclBounds, nPolys, aPolyCounts,cptl, points));
+ return(U_EMR_CORE2_set(U_EMR_POLYPOLYLINE, rclBounds, nPolys, aPolyCounts,cptl, points));
}
// U_EMRPOLYPOLYGON_set 8
@@ -3378,7 +3400,7 @@ char *U_EMRPOLYPOLYGON_set(
const uint32_t cptl,
const U_POINTL *points
){
- return(U_EMR_CORE2(U_EMR_POLYPOLYGON, rclBounds, nPolys, aPolyCounts,cptl, points));
+ return(U_EMR_CORE2_set(U_EMR_POLYPOLYGON, rclBounds, nPolys, aPolyCounts,cptl, points));
}
// U_EMRSETWINDOWEXTEX_set 9
@@ -3393,7 +3415,7 @@ char *U_EMRSETWINDOWEXTEX_set(
U_PAIR temp;
temp.x = szlExtent.cx;
temp.y = szlExtent.cy;
- return(U_EMR_CORE7(U_EMR_SETWINDOWEXTEX, temp));
+ return(U_EMR_CORE7_set(U_EMR_SETWINDOWEXTEX, temp));
}
// U_EMRSETWINDOWORGEX_set 10
@@ -3405,7 +3427,7 @@ char *U_EMRSETWINDOWEXTEX_set(
char *U_EMRSETWINDOWORGEX_set(
const U_POINTL ptlOrigin
){
- return(U_EMR_CORE7(U_EMR_SETWINDOWORGEX, ptlOrigin)); // U_PAIR and U_POINTL are the same thing
+ return(U_EMR_CORE7_set(U_EMR_SETWINDOWORGEX, ptlOrigin)); // U_PAIR and U_POINTL are the same thing
}
// U_EMRSETVIEWPORTEXTEX_set 11
@@ -3420,7 +3442,7 @@ char *U_EMRSETVIEWPORTEXTEX_set(
U_PAIR temp;
temp.x = szlExtent.cx;
temp.y = szlExtent.cy;
- return(U_EMR_CORE7(U_EMR_SETVIEWPORTEXTEX, temp));
+ return(U_EMR_CORE7_set(U_EMR_SETVIEWPORTEXTEX, temp));
}
// U_EMRSETVIEWPORTORGEX_set 12
@@ -3432,7 +3454,7 @@ char *U_EMRSETVIEWPORTEXTEX_set(
char *U_EMRSETVIEWPORTORGEX_set(
const U_POINTL ptlOrigin
){
- return(U_EMR_CORE7(U_EMR_SETVIEWPORTORGEX, ptlOrigin)); // U_PAIR and U_POINTL are the same thing
+ return(U_EMR_CORE7_set(U_EMR_SETVIEWPORTORGEX, ptlOrigin)); // U_PAIR and U_POINTL are the same thing
}
// U_EMRSETBRUSHORGEX_set 13
@@ -3444,7 +3466,7 @@ char *U_EMRSETVIEWPORTORGEX_set(
char *U_EMRSETBRUSHORGEX_set(
const U_POINTL ptlOrigin
){
- return(U_EMR_CORE7(U_EMR_SETBRUSHORGEX, *((PU_PAIR) & ptlOrigin)));
+ return(U_EMR_CORE7_set(U_EMR_SETBRUSHORGEX, *((PU_PAIR) & ptlOrigin)));
}
// U_EMREOF_set 14
@@ -3544,7 +3566,7 @@ char *U_EMRSETMAPPERFLAGS_set(void){
char *U_EMRSETMAPMODE_set(
const uint32_t iMode
){
- return(U_EMR_CORE3(U_EMR_SETMAPMODE, iMode));
+ return(U_EMR_CORE3_set(U_EMR_SETMAPMODE, iMode));
}
// U_EMRSETBKMODE_set 18
@@ -3556,7 +3578,7 @@ char *U_EMRSETMAPMODE_set(
char *U_EMRSETBKMODE_set(
const uint32_t iMode
){
- return(U_EMR_CORE3(U_EMR_SETBKMODE, iMode));
+ return(U_EMR_CORE3_set(U_EMR_SETBKMODE, iMode));
}
// U_EMRSETPOLYFILLMODE_set 19
@@ -3568,7 +3590,7 @@ char *U_EMRSETBKMODE_set(
char *U_EMRSETPOLYFILLMODE_set(
const uint32_t iMode
){
- return(U_EMR_CORE3(U_EMR_SETPOLYFILLMODE, iMode));
+ return(U_EMR_CORE3_set(U_EMR_SETPOLYFILLMODE, iMode));
}
// U_EMRSETROP2_set 20
@@ -3580,7 +3602,7 @@ char *U_EMRSETPOLYFILLMODE_set(
char *U_EMRSETROP2_set(
const uint32_t iMode
){
- return(U_EMR_CORE3(U_EMR_SETROP2, iMode));
+ return(U_EMR_CORE3_set(U_EMR_SETROP2, iMode));
}
// U_EMRSETSTRETCHBLTMODE_set 21
@@ -3592,7 +3614,7 @@ char *U_EMRSETROP2_set(
char *U_EMRSETSTRETCHBLTMODE_set(
const uint32_t iMode
){
- return(U_EMR_CORE3(U_EMR_SETSTRETCHBLTMODE, iMode));
+ return(U_EMR_CORE3_set(U_EMR_SETSTRETCHBLTMODE, iMode));
}
// U_EMRSETTEXTALIGN_set 22
@@ -3604,7 +3626,7 @@ char *U_EMRSETSTRETCHBLTMODE_set(
char *U_EMRSETTEXTALIGN_set(
const uint32_t iMode
){
- return(U_EMR_CORE3(U_EMR_SETTEXTALIGN, iMode));
+ return(U_EMR_CORE3_set(U_EMR_SETTEXTALIGN, iMode));
}
// U_EMRSETCOLORADJUSTMENT_set 23
@@ -3638,7 +3660,7 @@ char *U_EMRSETCOLORADJUSTMENT_set(
char *U_EMRSETTEXTCOLOR_set(
const U_COLORREF crColor
){
- return(U_EMR_CORE3(U_EMR_SETTEXTCOLOR, *(uint32_t *) &crColor));
+ return(U_EMR_CORE3_set(U_EMR_SETTEXTCOLOR, *(uint32_t *) &crColor));
}
// U_EMRSETBKCOLOR_set 25
@@ -3650,7 +3672,7 @@ char *U_EMRSETTEXTCOLOR_set(
char *U_EMRSETBKCOLOR_set(
const U_COLORREF crColor
){
- return(U_EMR_CORE3(U_EMR_SETBKCOLOR, *(uint32_t *) &crColor));
+ return(U_EMR_CORE3_set(U_EMR_SETBKCOLOR, *(uint32_t *) &crColor));
}
// U_EMROFFSETCLIPRGN_set 26
@@ -3662,7 +3684,7 @@ char *U_EMRSETBKCOLOR_set(
char *U_EMROFFSETCLIPRGN_set(
const U_POINTL ptl
){
- return(U_EMR_CORE7(U_EMR_OFFSETCLIPRGN, ptl));
+ return(U_EMR_CORE7_set(U_EMR_OFFSETCLIPRGN, ptl));
}
// U_EMRMOVETOEX_set 27
@@ -3674,7 +3696,7 @@ char *U_EMROFFSETCLIPRGN_set(
char *U_EMRMOVETOEX_set(
const U_POINTL ptl
){
- return(U_EMR_CORE7(U_EMR_MOVETOEX, ptl));
+ return(U_EMR_CORE7_set(U_EMR_MOVETOEX, ptl));
}
// U_EMRSETMETARGN_set 28
@@ -3683,7 +3705,7 @@ char *U_EMRMOVETOEX_set(
\return pointer to U_EMR_SETMETARGN record, or NULL on error.
*/
char *U_EMRSETMETARGN_set(void){
- return(U_EMR_CORE5(U_EMR_SETMETARGN));
+ return(U_EMR_CORE5_set(U_EMR_SETMETARGN));
}
// U_EMREXCLUDECLIPRECT_set 29
@@ -3695,7 +3717,7 @@ char *U_EMRSETMETARGN_set(void){
char *U_EMREXCLUDECLIPRECT_set(
const U_RECTL rclClip
){
- return(U_EMR_CORE4(U_EMR_EXCLUDECLIPRECT,rclClip));
+ return(U_EMR_CORE4_set(U_EMR_EXCLUDECLIPRECT,rclClip));
}
// U_EMRINTERSECTCLIPRECT_set 30
@@ -3707,7 +3729,7 @@ char *U_EMREXCLUDECLIPRECT_set(
char *U_EMRINTERSECTCLIPRECT_set(
const U_RECTL rclClip
){
- return(U_EMR_CORE4(U_EMR_INTERSECTCLIPRECT,rclClip));
+ return(U_EMR_CORE4_set(U_EMR_INTERSECTCLIPRECT,rclClip));
}
// U_EMRSCALEVIEWPORTEXTEX_set 31
@@ -3725,7 +3747,7 @@ char *U_EMRSCALEVIEWPORTEXTEX_set(
const int32_t yNum,
const int32_t yDenom
){
- return(U_EMR_CORE4(U_EMR_SCALEVIEWPORTEXTEX,(U_RECTL){xNum,xDenom,yNum,yDenom}));
+ return(U_EMR_CORE4_set(U_EMR_SCALEVIEWPORTEXTEX,(U_RECTL){xNum,xDenom,yNum,yDenom}));
}
@@ -3744,7 +3766,7 @@ char *U_EMRSCALEWINDOWEXTEX_set(
const int32_t yNum,
const int32_t yDenom
){
- return(U_EMR_CORE4(U_EMR_SCALEWINDOWEXTEX,(U_RECTL){xNum,xDenom,yNum,yDenom}));
+ return(U_EMR_CORE4_set(U_EMR_SCALEWINDOWEXTEX,(U_RECTL){xNum,xDenom,yNum,yDenom}));
}
// U_EMRSAVEDC_set 33
@@ -3753,7 +3775,7 @@ char *U_EMRSCALEWINDOWEXTEX_set(
\return pointer to U_EMR_SAVEDC record, or NULL on error.
*/
char *U_EMRSAVEDC_set(void){
- return(U_EMR_CORE5(U_EMR_SAVEDC));
+ return(U_EMR_CORE5_set(U_EMR_SAVEDC));
}
// U_EMRRESTOREDC_set 34
@@ -3765,7 +3787,7 @@ char *U_EMRSAVEDC_set(void){
char *U_EMRRESTOREDC_set(
const int32_t iRelative
){
- return(U_EMR_CORE3(U_EMR_RESTOREDC, (uint32_t) iRelative));
+ return(U_EMR_CORE3_set(U_EMR_RESTOREDC, (uint32_t) iRelative));
}
// U_EMRSETWORLDTRANSFORM_set 35
@@ -3952,7 +3974,7 @@ char *U_EMRANGLEARC_set(
char *U_EMRELLIPSE_set(
const U_RECTL rclBox
){
- return(U_EMR_CORE4(U_EMR_ELLIPSE,rclBox));
+ return(U_EMR_CORE4_set(U_EMR_ELLIPSE,rclBox));
}
// U_EMRRECTANGLE_set 43
@@ -3964,7 +3986,7 @@ char *U_EMRELLIPSE_set(
char *U_EMRRECTANGLE_set(
const U_RECTL rclBox
){
- return(U_EMR_CORE4(U_EMR_RECTANGLE,rclBox));
+ return(U_EMR_CORE4_set(U_EMR_RECTANGLE,rclBox));
}
// U_EMRROUNDRECT_set 44
@@ -4005,7 +4027,7 @@ char *U_EMRARC_set(
const U_POINTL ptlStart,
const U_POINTL ptlEnd
){
- return(U_EMR_CORE9(U_EMR_ARC,rclBox, ptlStart, ptlEnd));
+ return(U_EMR_CORE9_set(U_EMR_ARC,rclBox, ptlStart, ptlEnd));
}
// U_EMRCHORD_set 46
@@ -4021,7 +4043,7 @@ char *U_EMRCHORD_set(
const U_POINTL ptlStart,
const U_POINTL ptlEnd
){
- return(U_EMR_CORE9(U_EMR_CHORD,rclBox, ptlStart, ptlEnd));
+ return(U_EMR_CORE9_set(U_EMR_CHORD,rclBox, ptlStart, ptlEnd));
}
// U_EMRPIE_set 47
@@ -4037,7 +4059,7 @@ char *U_EMRPIE_set(
const U_POINTL ptlStart,
const U_POINTL ptlEnd
){
- return(U_EMR_CORE9(U_EMR_PIE,rclBox, ptlStart, ptlEnd));
+ return(U_EMR_CORE9_set(U_EMR_PIE,rclBox, ptlStart, ptlEnd));
}
// U_EMRSELECTPALETTE_set 48
@@ -4049,7 +4071,7 @@ char *U_EMRPIE_set(
char *U_EMRSELECTPALETTE_set(
const uint32_t ihPal
){
- return(U_EMR_CORE3(U_EMR_SELECTPALETTE, ihPal));
+ return(U_EMR_CORE3_set(U_EMR_SELECTPALETTE, ihPal));
}
// U_EMRCREATEPALETTE_set 49
@@ -4124,7 +4146,7 @@ char *U_EMRRESIZEPALETTE_set(
const uint32_t ihPal,
const uint32_t cEntries
){
- return(U_EMR_CORE7(U_EMR_RESIZEPALETTE, (U_PAIR){ihPal,cEntries}));
+ return(U_EMR_CORE7_set(U_EMR_RESIZEPALETTE, (U_PAIR){ihPal,cEntries}));
}
// U_EMRREALIZEPALETTE_set 52
@@ -4133,7 +4155,7 @@ char *U_EMRRESIZEPALETTE_set(
\return pointer to U_EMR_REALIZEPALETTE record, or NULL on error.
*/
char *U_EMRREALIZEPALETTE_set(void){
- return(U_EMR_CORE5(U_EMR_REALIZEPALETTE));
+ return(U_EMR_CORE5_set(U_EMR_REALIZEPALETTE));
}
// U_EMREXTFLOODFILL_set 53
@@ -4173,7 +4195,7 @@ char *U_EMREXTFLOODFILL_set(
char *U_EMRLINETO_set(
const U_POINTL ptl
){
- return(U_EMR_CORE7(U_EMR_LINETO, ptl));
+ return(U_EMR_CORE7_set(U_EMR_LINETO, ptl));
}
// U_EMRARCTO_set 55
@@ -4192,7 +4214,7 @@ char *U_EMRARCTO_set(
U_POINTL ptlStart,
U_POINTL ptlEnd
){
- return(U_EMR_CORE9(U_EMR_ARCTO,rclBox, ptlStart, ptlEnd));
+ return(U_EMR_CORE9_set(U_EMR_ARCTO,rclBox, ptlStart, ptlEnd));
}
// U_EMRPOLYDRAW_set 56
@@ -4216,7 +4238,7 @@ char *U_EMRPOLYDRAW_set(
if(!cptl || !aptl || !abTypes)return(NULL);
cbPoints = cptl * sizeof(U_POINTL); // space for aptl
- cbAbTypes = cptl; // number of abTypes (also size, 1 byte each)
+ cbAbTypes = cptl; // number of abTypes (same array size, 1 byte each)
cbAbTypes4 = UP4(cbAbTypes); // space for abTypes
irecsize = sizeof(U_EMRPOLYDRAW) + cbPoints + cbAbTypes4 - sizeof(U_POINTL) - 1;
record = malloc(irecsize);
@@ -4244,7 +4266,7 @@ char *U_EMRPOLYDRAW_set(
char *U_EMRSETARCDIRECTION_set(
const uint32_t iArcDirection
){
- return(U_EMR_CORE3(U_EMR_SETARCDIRECTION, iArcDirection));
+ return(U_EMR_CORE3_set(U_EMR_SETARCDIRECTION, iArcDirection));
}
// U_EMRSETMITERLIMIT_set 58
@@ -4256,7 +4278,7 @@ char *U_EMRSETARCDIRECTION_set(
char *U_EMRSETMITERLIMIT_set(
const uint32_t eMiterLimit
){
- return(U_EMR_CORE3(U_EMR_SETMITERLIMIT, eMiterLimit));
+ return(U_EMR_CORE3_set(U_EMR_SETMITERLIMIT, eMiterLimit));
}
@@ -4266,7 +4288,7 @@ char *U_EMRSETMITERLIMIT_set(
\return pointer to U_EMR_BEGINPATH record, or NULL on error.
*/
char *U_EMRBEGINPATH_set(void){
- return(U_EMR_CORE5(U_EMR_BEGINPATH));
+ return(U_EMR_CORE5_set(U_EMR_BEGINPATH));
}
// U_EMRENDPATH_set 60
@@ -4275,7 +4297,7 @@ char *U_EMRBEGINPATH_set(void){
\return pointer to U_EMR_ENDPATH record, or NULL on error.
*/
char *U_EMRENDPATH_set(void){
- return(U_EMR_CORE5(U_EMR_ENDPATH));
+ return(U_EMR_CORE5_set(U_EMR_ENDPATH));
}
// U_EMRCLOSEFIGURE_set 61
@@ -4284,7 +4306,7 @@ char *U_EMRENDPATH_set(void){
\return pointer to U_EMR_CLOSEFIGURE record, or NULL on error.
*/
char *U_EMRCLOSEFIGURE_set(void){
- return(U_EMR_CORE5(U_EMR_CLOSEFIGURE));
+ return(U_EMR_CORE5_set(U_EMR_CLOSEFIGURE));
}
// U_EMRFILLPATH_set 62
@@ -4298,7 +4320,7 @@ char *U_EMRCLOSEFIGURE_set(void){
char *U_EMRFILLPATH_set(
const U_RECTL rclBox
){
- return(U_EMR_CORE4(U_EMR_FILLPATH,rclBox));
+ return(U_EMR_CORE4_set(U_EMR_FILLPATH,rclBox));
}
// U_EMRSTROKEANDFILLPATH_set 63
@@ -4314,7 +4336,7 @@ char *U_EMRFILLPATH_set(
char *U_EMRSTROKEANDFILLPATH_set(
const U_RECTL rclBox
){
- return(U_EMR_CORE4(U_EMR_STROKEANDFILLPATH,rclBox));
+ return(U_EMR_CORE4_set(U_EMR_STROKEANDFILLPATH,rclBox));
}
// U_EMRSTROKEPATH_set 64
@@ -4328,7 +4350,7 @@ char *U_EMRSTROKEANDFILLPATH_set(
char *U_EMRSTROKEPATH_set(
const U_RECTL rclBox
){
- return(U_EMR_CORE4(U_EMR_STROKEPATH,rclBox));
+ return(U_EMR_CORE4_set(U_EMR_STROKEPATH,rclBox));
}
// U_EMRFLATTENPATH_set 65
@@ -4337,7 +4359,7 @@ char *U_EMRSTROKEPATH_set(
\return pointer to U_EMR_FLATTENPATH record, or NULL on error.
*/
char *U_EMRFLATTENPATH_set(void){
- return(U_EMR_CORE5(U_EMR_FLATTENPATH));
+ return(U_EMR_CORE5_set(U_EMR_FLATTENPATH));
}
// U_EMRWIDENPATH_set 66
@@ -4346,7 +4368,7 @@ char *U_EMRFLATTENPATH_set(void){
\return pointer to U_EMR_WIDENPATH record, or NULL on error.
*/
char *U_EMRWIDENPATH_set(void){
- return(U_EMR_CORE5(U_EMR_WIDENPATH));
+ return(U_EMR_CORE5_set(U_EMR_WIDENPATH));
}
// U_EMRSELECTCLIPPATH_set 67
@@ -4358,7 +4380,7 @@ char *U_EMRWIDENPATH_set(void){
char *U_EMRSELECTCLIPPATH_set(
const uint32_t iMode
){
- return(U_EMR_CORE3(U_EMR_SELECTCLIPPATH, iMode));
+ return(U_EMR_CORE3_set(U_EMR_SELECTCLIPPATH, iMode));
}
// U_EMRABORTPATH_set 68
@@ -4367,7 +4389,7 @@ char *U_EMRSELECTCLIPPATH_set(
\return pointer to U_EMR_ABORTPATH record, or NULL on error.
*/
char *U_EMRABORTPATH_set(void){
- return(U_EMR_CORE5(U_EMR_ABORTPATH));
+ return(U_EMR_CORE5_set(U_EMR_ABORTPATH));
}
// U_EMRUNDEF69 69
@@ -4416,23 +4438,25 @@ char *U_EMRFILLRGN_set(
){
char *record;
int irecsize;
- int cbRgns,cbRgns4,off;
+ int cbRgns,cbRgns4,rds,rds4,off;
if(!RgnData)return(NULL);
cbRgns = ((PU_RGNDATAHEADER) RgnData)->nRgnSize;
- cbRgns4 = UP4(cbRgns);
- irecsize = sizeof(U_EMRFILLRGN) + cbRgns4 - sizeof(U_RGNDATAHEADER); // core + array - overlap
+ cbRgns4 = UP4(cbRgns);
+ rds = sizeof(U_RGNDATAHEADER) + cbRgns;
+ rds4 = UP4(rds);
+ irecsize = sizeof(U_EMRFILLRGN) - sizeof(U_RECTL) + cbRgns4; // core + array - overlap of one rectL
record = malloc(irecsize);
if(record){
((PU_EMR) record)->iType = U_EMR_FILLRGN;
((PU_EMR) record)->nSize = irecsize;
- ((PU_EMRFILLRGN) record)->rclBounds = rclBounds; // or ??? ((PU_RGNDATAHEADER) RgnData)->rclBounds;
- ((PU_EMRFILLRGN) record)->cbRgnData = cbRgns;
+ ((PU_EMRFILLRGN) record)->rclBounds = rclBounds;
+ ((PU_EMRFILLRGN) record)->cbRgnData = rds;
((PU_EMRFILLRGN) record)->ihBrush = ihBrush;
- off = irecsize - cbRgns4;
- memcpy(record + off, RgnData, cbRgns);
- off += cbRgns;
- if(cbRgns4 > cbRgns){ memset(record + off,0,cbRgns4-cbRgns); } // clear any unused bytes
+ off = sizeof(U_EMRFILLRGN) - sizeof(U_RGNDATA);
+ memcpy(record + off, RgnData, rds);
+ off += rds;
+ if(rds < rds4){ memset(record + off,0, rds4 - rds); } // clear any unused bytes
}
return(record);
}
@@ -4455,24 +4479,26 @@ char *U_EMRFRAMERGN_set(
){
char *record;
int irecsize;
- int cbRgns,cbRgns4,off;
+ int cbRgns,cbRgns4,rds,rds4,off;
if(!RgnData)return(NULL);
cbRgns = ((PU_RGNDATAHEADER) RgnData)->nRgnSize;
- cbRgns4 = UP4(cbRgns);
- irecsize = sizeof(U_EMRFRAMERGN) + cbRgns4 - sizeof(U_RGNDATAHEADER); // core + array - overlap
+ cbRgns4 = UP4(cbRgns);
+ rds = sizeof(U_RGNDATAHEADER) + cbRgns;
+ rds4 = UP4(rds);
+ irecsize = sizeof(U_EMRFRAMERGN) - sizeof(U_RECTL) + cbRgns4; // core + array - overlap of one rectL
record = malloc(irecsize);
if(record){
((PU_EMR) record)->iType = U_EMR_FRAMERGN;
((PU_EMR) record)->nSize = irecsize;
- ((PU_EMRFRAMERGN) record)->rclBounds = rclBounds; // or ??? ((PU_RGNDATAHEADER) RgnData)->rclBounds;
- ((PU_EMRFRAMERGN) record)->cbRgnData = cbRgns;
+ ((PU_EMRFRAMERGN) record)->rclBounds = rclBounds;
+ ((PU_EMRFRAMERGN) record)->cbRgnData = rds;
((PU_EMRFRAMERGN) record)->ihBrush = ihBrush;
((PU_EMRFRAMERGN) record)->szlStroke = szlStroke;
- off = irecsize - cbRgns4;
- memcpy(record + off, RgnData, cbRgns);
- off += cbRgns;
- if(cbRgns4 > cbRgns){ memset(record + off,0,cbRgns4-cbRgns); } // clear any unused bytes
+ off = sizeof(U_EMRFRAMERGN) - sizeof(U_RGNDATA);
+ memcpy(record + off, RgnData, rds);
+ off += rds;
+ if(rds < rds4){ memset(record + off,0, rds4 - rds); } // clear any unused bytes
}
return(record);
}
@@ -4486,7 +4512,7 @@ char *U_EMRFRAMERGN_set(
char *U_EMRINVERTRGN_set(
const PU_RGNDATA RgnData
){
- return(U_EMR_CORE11(U_EMR_INVERTRGN, RgnData));
+ return(U_EMR_CORE11_set(U_EMR_INVERTRGN, RgnData));
}
// U_EMRPAINTRGN_set 74
@@ -4498,7 +4524,7 @@ char *U_EMRINVERTRGN_set(
char *U_EMRPAINTRGN_set(
const PU_RGNDATA RgnData
){
- return(U_EMR_CORE11(U_EMR_PAINTRGN, RgnData));
+ return(U_EMR_CORE11_set(U_EMR_PAINTRGN, RgnData));
}
// U_EMREXTSELECTCLIPRGN_set 75
@@ -4514,22 +4540,24 @@ char *U_EMREXTSELECTCLIPRGN_set(
){
char *record;
int irecsize;
- int cbRgns,cbRgns4,off;
+ int cbRgns,cbRgns4,rds,rds4,off;
if(!RgnData)return(NULL);
cbRgns = ((PU_RGNDATAHEADER) RgnData)->nRgnSize;
- cbRgns4 = UP4(cbRgns);
- irecsize = sizeof(U_EMREXTSELECTCLIPRGN) + cbRgns4 - sizeof(U_RGNDATAHEADER); // core + array - overlap
+ cbRgns4 = UP4(cbRgns);
+ rds = sizeof(U_RGNDATAHEADER) + cbRgns;
+ rds4 = UP4(rds);
+ irecsize = sizeof(U_EMREXTSELECTCLIPRGN) - sizeof(U_RECTL) + cbRgns4; // core + array - overlap of one rectL
record = malloc(irecsize);
if(record){
((PU_EMR) record)->iType = U_EMR_EXTSELECTCLIPRGN;
((PU_EMR) record)->nSize = irecsize;
- ((PU_EMREXTSELECTCLIPRGN) record)->cbRgnData = cbRgns;
+ ((PU_EMREXTSELECTCLIPRGN) record)->cbRgnData = rds;
((PU_EMREXTSELECTCLIPRGN) record)->iMode = iMode;
- off = irecsize - cbRgns4;
- memcpy(record + off, RgnData, cbRgns);
- off += cbRgns;
- if(cbRgns4 > cbRgns){ memset(record + off,0,cbRgns4-cbRgns); } // clear any unused bytes
+ off = sizeof(U_EMREXTSELECTCLIPRGN) - sizeof(U_RGNDATA);
+ memcpy(record + off, RgnData, rds);
+ off += rds;
+ if(rds < rds4){ memset(record + off,0, rds4 - rds); } // clear any unused bytes
}
return(record);
}
@@ -4568,7 +4596,6 @@ char *U_EMRBITBLT_set(
int cbImage,cbImage4,cbBmi,off;
SET_CB_FROM_PXBMI(Px,Bmi,cbImage,cbImage4,cbBmi,cbPx);
-
irecsize = sizeof(U_EMRBITBLT) + cbBmi + cbImage4;
record = malloc(irecsize);
if(record){
@@ -4933,7 +4960,7 @@ char *U_EMREXTTEXTOUTA_set(
const U_FLOAT eyScale,
const PU_EMRTEXT emrtext
){
- return(U_EMR_CORE8(U_EMR_EXTTEXTOUTA,rclBounds, iGraphicsMode, exScale, eyScale,emrtext));
+ return(U_EMR_CORE8_set(U_EMR_EXTTEXTOUTA,rclBounds, iGraphicsMode, exScale, eyScale,emrtext));
}
// U_EMREXTTEXTOUTW_set 84
@@ -4953,7 +4980,7 @@ char *U_EMREXTTEXTOUTW_set(
const U_FLOAT eyScale,
const PU_EMRTEXT emrtext
){
- return(U_EMR_CORE8(U_EMR_EXTTEXTOUTW,rclBounds, iGraphicsMode, exScale, eyScale,emrtext));
+ return(U_EMR_CORE8_set(U_EMR_EXTTEXTOUTW,rclBounds, iGraphicsMode, exScale, eyScale,emrtext));
}
// U_EMRPOLYBEZIER16_set 85
@@ -4969,7 +4996,7 @@ char *U_EMRPOLYBEZIER16_set(
const uint32_t cpts,
const U_POINT16 *points
){
- return(U_EMR_CORE6(U_EMR_POLYBEZIER16, rclBounds, cpts, points));
+ return(U_EMR_CORE6_set(U_EMR_POLYBEZIER16, rclBounds, cpts, points));
}
// U_EMRPOLYGON16_set 86
@@ -4985,7 +5012,7 @@ char *U_EMRPOLYGON16_set(
const uint32_t cpts,
const U_POINT16 *points
){
- return(U_EMR_CORE6(U_EMR_POLYGON16, rclBounds, cpts, points));
+ return(U_EMR_CORE6_set(U_EMR_POLYGON16, rclBounds, cpts, points));
}
// U_EMRPOLYLINE16_set 87
@@ -5001,7 +5028,7 @@ char *U_EMRPOLYLINE16_set(
const uint32_t cpts,
const U_POINT16 *points
){
- return(U_EMR_CORE6(U_EMR_POLYLINE16, rclBounds, cpts, points));
+ return(U_EMR_CORE6_set(U_EMR_POLYLINE16, rclBounds, cpts, points));
}
// U_EMRPOLYBEZIERTO16_set 88
@@ -5017,7 +5044,7 @@ char *U_EMRPOLYBEZIERTO16_set(
const uint32_t cpts,
const U_POINT16 *points
){
- return(U_EMR_CORE6(U_EMR_POLYBEZIERTO16, rclBounds, cpts, points));
+ return(U_EMR_CORE6_set(U_EMR_POLYBEZIERTO16, rclBounds, cpts, points));
}
// U_EMRPOLYLINETO16_set 89
@@ -5033,7 +5060,7 @@ char *U_EMRPOLYLINETO16_set(
const uint32_t cpts,
const U_POINT16 *points
){
- return(U_EMR_CORE6(U_EMR_POLYLINETO16, rclBounds, cpts, points));
+ return(U_EMR_CORE6_set(U_EMR_POLYLINETO16, rclBounds, cpts, points));
}
// U_EMRPOLYPOLYLINE16_set 90
@@ -5053,7 +5080,7 @@ char *U_EMRPOLYPOLYLINE16_set(
const uint32_t cpts,
const U_POINT16 *points
){
- return(U_EMR_CORE10(U_EMR_POLYPOLYLINE16, rclBounds, nPolys, aPolyCounts,cpts, points));
+ return(U_EMR_CORE10_set(U_EMR_POLYPOLYLINE16, rclBounds, nPolys, aPolyCounts,cpts, points));
}
// U_EMRPOLYPOLYGON16_set 91
@@ -5073,7 +5100,7 @@ char *U_EMRPOLYPOLYGON16_set(
const uint32_t cpts,
const U_POINT16 *points
){
- return(U_EMR_CORE10(U_EMR_POLYPOLYGON16, rclBounds, nPolys, aPolyCounts,cpts, points));
+ return(U_EMR_CORE10_set(U_EMR_POLYPOLYGON16, rclBounds, nPolys, aPolyCounts,cpts, points));
}
@@ -5098,7 +5125,7 @@ char *U_EMRPOLYDRAW16_set(
if(!cpts || !aptl || !abTypes)return(NULL);
cbPoints = cpts * sizeof(U_POINT16); // space for aptl
- cbAbTypes = cpts; // number of abTypes (also size, 1 byte each)
+ cbAbTypes = cpts; // number of abTypes (same array size, 1 byte each)
cbAbTypes4 = UP4(cbAbTypes); // space for abTypes
irecsize = sizeof(U_EMRPOLYDRAW16) + cbPoints + cbAbTypes4 - sizeof(U_POINT16) - 1;
record = malloc(irecsize);
@@ -5242,7 +5269,7 @@ char *U_EMREXTCREATEPEN_set(
char *U_EMRSETICMMODE_set(
const uint32_t iMode
){
- return(U_EMR_CORE3(U_EMR_SETICMMODE, iMode));
+ return(U_EMR_CORE3_set(U_EMR_SETICMMODE, iMode));
}
// U_EMRCREATECOLORSPACE_set 99
@@ -5280,7 +5307,7 @@ char *U_EMRCREATECOLORSPACE_set(
char *U_EMRSETCOLORSPACE_set(
const uint32_t ihCS
){
- return(U_EMR_CORE3(U_EMR_SETCOLORSPACE, ihCS));
+ return(U_EMR_CORE3_set(U_EMR_SETCOLORSPACE, ihCS));
}
// U_EMRDELETECOLORSPACE_set 101
@@ -5292,7 +5319,7 @@ char *U_EMRSETCOLORSPACE_set(
char *U_EMRDELETECOLORSPACE_set(
const uint32_t ihCS
){
- return(U_EMR_CORE3(U_EMR_DELETECOLORSPACE, ihCS));
+ return(U_EMR_CORE3_set(U_EMR_DELETECOLORSPACE, ihCS));
}
// U_EMRGLSRECORD_set 102 Not implemented
@@ -5428,7 +5455,7 @@ char *U_EMRALPHABLEND_set(
\param iMode Mirroring Enumeration
*/
char *U_EMRSETLAYOUT_set(uint32_t iMode){
- return(U_EMR_CORE3(U_EMR_SETLAYOUT, iMode));
+ return(U_EMR_CORE3_set(U_EMR_SETLAYOUT, iMode));
}
// U_EMRTRANSPARENTBLT_set 116
diff --git a/src/libuemf/uemf.h b/src/libuemf/uemf.h
index a792a65de..53426cb55 100644
--- a/src/libuemf/uemf.h
+++ b/src/libuemf/uemf.h
@@ -95,11 +95,11 @@ these WMF enumerations is by referencing the following table:
/*
File: uemf.h
-Version: 0.0.27
-Date: 28-MAR-2014
+Version: 0.0.31
+Date: 23-APR-2015
Author: David Mathog, Biology Division, Caltech
email: mathog@caltech.edu
-Copyright: 2014 David Mathog and California Institute of Technology (Caltech)
+Copyright: 2015 David Mathog and California Institute of Technology (Caltech)
*/
#ifndef _UEMF_
@@ -167,6 +167,9 @@ extern "C" {
/** Solaris 8 has problems with round/roundf, just use this everywhere */
#define U_ROUND(A) ( (A) > 0 ? floor((A)+0.5) : ( (A) < 0 ? -floor(-(A)+0.5) : (A) ) )
+#define MAKE_MIN_PTR(A,B) ( A < B ? A : B)
+#define IS_MEM_UNSAFE(A,B,C) ( (int8_t *)(A) > (int8_t *)(C) ? 1 : ((int8_t *)(C) - (int8_t *)(A) >= (int)(B) ? 0 : 1 )) //!< Return 1 when a region of memory starting at A of B bytes extends beyond pointer C
+
/** @} */
@@ -1799,7 +1802,7 @@ typedef struct { //!< In MS documentation this is Log
*PU_PATTERN; //!< EMF manual 2.2.12
/**
- \brief For U_LOGFONT_PANOSE elfLogFont field
+ \brief For U_LOGFONT elfLogFont field
EMF manual 2.2.13, Microsoft name: LogFont Object
*/
@@ -2075,6 +2078,9 @@ typedef struct {
// ***********************************************************************************
// The following have U_EMR_# records. They are ordered by their record index, not by EMF manual position.
+// records which are documented but not implemented
+#define U_SIZE_EMRNOTIMPLEMENTED 2048
+
/* Index 1 */
/**
\brief The first U_ENHMETARECORD record in the metafile.
@@ -2117,6 +2123,8 @@ typedef struct {
U_SIZEL szlMicrometers; //!< Size of the display device in micrometer
} U_EMRHEADER,
*PU_EMRHEADER; //!< EMF manual 2.2.9
+#define U_SIZE_EMRHEADER sizeof(U_EMRHEADER) // modern EMF files, for _really_ old ones the _MIN size applies
+#define U_SIZE_EMRHEADER_MIN (U_SIZE_EMRHEADER - sizeof(U_CBPXLFMT) - sizeof(U_OFFPXLFMT) - sizeof(uint32_t) - sizeof(U_SIZEL))
/* Index 2,3,4,5,6 */
/** EMF manual 2.3.5.16
@@ -2137,6 +2145,11 @@ typedef struct {
*PU_EMRPOLYBEZIERTO, //!< EMF manual 2.3.5.18
*PU_EMRPOLYLINETO; //!< EMF manual 2.3.5.26
+#define U_SIZE_EMRPOLYBEZIER (sizeof(U_EMR) + sizeof(U_RECTL) + sizeof(U_NUM_POINTL) )
+#define U_SIZE_EMRPOLYGON U_SIZE_EMRPOLYBEZIER
+#define U_SIZE_EMRPOLYLINE U_SIZE_EMRPOLYBEZIER
+#define U_SIZE_EMRPOLYBEZIERTO U_SIZE_EMRPOLYBEZIER
+#define U_SIZE_EMRPOLYLINETO U_SIZE_EMRPOLYBEZIER
/* Index 7,8 */
/** EMF manual 2.3.5.30
@@ -2153,6 +2166,8 @@ typedef struct {
U_EMRPOLYPOLYGON, //!< EMF manual 2.3.5.28
*PU_EMRPOLYPOLYLINE, //!< EMF manual 2.3.5.30
*PU_EMRPOLYPOLYGON; //!< EMF manual 2.3.5.28
+#define U_SIZE_EMRPOLYPOLYLINE (sizeof(U_EMR) + sizeof(U_RECTL) + sizeof(U_NUM_POLYCOUNTS) + sizeof(U_POLYCOUNTS))
+#define U_SIZE_EMRPOLYPOLYGON U_SIZE_EMRPOLYPOLYLINE
/* Index 9,11 (numbers interleave with next one) */
/** EMF manual 2.3.11.30
@@ -2164,6 +2179,8 @@ typedef struct {
U_EMRSETVIEWPORTEXTEX, //!< EMF manual manual 2.3.11.28
*PU_EMRSETWINDOWEXTEX, //!< EMF manual manual 2.3.11.30
*PU_EMRSETVIEWPORTEXTEX; //!< EMF manual manual 2.3.11.28
+#define U_SIZE_EMRSETWINDOWEXTEX (sizeof(U_EMRSETWINDOWEXTEX ))
+#define U_SIZE_EMRSETVIEWPORTEXTEX (sizeof(U_EMRSETVIEWPORTEXTEX))
/* Index 10,12,13 */
/** EMF manual 2.3.11.31
@@ -2177,7 +2194,9 @@ typedef struct {
*PU_EMRSETWINDOWORGEX, //!< EMF manual 2.3.11.31
*PU_EMRSETVIEWPORTORGEX, //!< EMF manual 2.3.11.29
*PU_EMRSETBRUSHORGEX; //!< EMF manual 2.3.11.12
-
+#define U_SIZE_EMRSETWINDOWORGEX (sizeof(U_EMRSETWINDOWORGEX ))
+#define U_SIZE_EMRSETVIEWPORTORGEX (sizeof(U_EMRSETVIEWPORTORGEX))
+#define U_SIZE_EMRSETBRUSHORGEX (sizeof(U_EMRSETBRUSHORGEX ))
/* Index 14 */
/** EMF manual 3.2.4.1
@@ -2197,6 +2216,7 @@ typedef struct {
U_OFFPLENTRIES offPalEntries; //!< Offset in bytes to array of palette entries
} U_EMREOF,
*PU_EMREOF; //!< EMF manual 3.2.4.1
+#define U_SIZE_EMREOF (sizeof(U_EMREOF))
/* Index 15 */
/** EMF manual 2.3.5.36
@@ -2207,6 +2227,7 @@ typedef struct {
U_COLORREF crColor; //!< Pixel color
} U_EMRSETPIXELV,
*PU_EMRSETPIXELV; //!< EMF manual 2.3.5.36
+#define U_SIZE_EMRSETPIXELV (sizeof(U_EMRSETPIXELV))
/* Index 16 */
/** EMF manual 2.3.11.20
@@ -2216,6 +2237,7 @@ typedef struct {
uint32_t dwFlags; //!< must be 1
} U_EMRSETMAPPERFLAGS,
*PU_EMRSETMAPPERFLAGS; //!< EMF manual 2.3.11.20
+#define U_SIZE_EMRSETMAPPERFLAGS (sizeof(U_EMRSETMAPPERFLAGS))
/* Index 17,18,19,20,21,22,67,98,115
*/
@@ -2243,6 +2265,16 @@ typedef struct {
*PU_EMRSETICMMODE, //!< EMF manual 2.3.11.14 ICMMode Enumeration
*PU_EMRSETLAYOUT; //!< EMF manual 2.3.11.17 Mirroring Enumeration
+#define U_SIZE_EMRSETMAPMODE (sizeof(U_EMRSETMAPMODE ))
+#define U_SIZE_EMRSETBKMODE (sizeof(U_EMRSETBKMODE ))
+#define U_SIZE_EMRSETPOLYFILLMODE (sizeof(U_EMRSETPOLYFILLMODE ))
+#define U_SIZE_EMRSETROP2 (sizeof(U_EMRSETROP2 ))
+#define U_SIZE_EMRSETSTRETCHBLTMODE (sizeof(U_EMRSETSTRETCHBLTMODE))
+#define U_SIZE_EMRSETTEXTALIGN (sizeof(U_EMRSETTEXTALIGN ))
+#define U_SIZE_EMRSELECTCLIPPATH (sizeof(U_EMRSELECTCLIPPATH ))
+#define U_SIZE_EMRSETICMMODE (sizeof(U_EMRSETICMMODE ))
+#define U_SIZE_EMRSETLAYOUT (sizeof(U_EMRSETLAYOUT ))
+
/* Index 23 */
/** EMF manual 2.3.11.13
*/
@@ -2251,6 +2283,7 @@ typedef struct {
U_COLORADJUSTMENT ColorAdjustment; //!< Color Adjustment
} U_EMRSETCOLORADJUSTMENT,
*PU_EMRSETCOLORADJUSTMENT; //!< EMF manual 2.3.11.13
+#define U_SIZE_EMRSETCOLORADJUSTMENT (sizeof(U_EMRSETCOLORADJUSTMENT))
/* Index 24, 25 */
/** EMF manual 2.3.11.26
@@ -2262,6 +2295,8 @@ typedef struct {
U_EMRSETBKCOLOR, //!< EMF manual 2.3.11.10
*PU_EMRSETTEXTCOLOR, //!< EMF manual 2.3.11.26
*PU_EMRSETBKCOLOR; //!< EMF manual 2.3.11.10
+#define U_SIZE_EMRSETTEXTCOLOR (sizeof(U_EMRSETTEXTCOLOR))
+#define U_SIZE_EMRSETBKCOLOR (sizeof(U_EMRSETBKCOLOR ))
/* Index 26 */
/** EMF manual 2.3.2.4
@@ -2271,6 +2306,7 @@ typedef struct {
U_POINTL ptlOffset; //!< Clipping region
} U_EMROFFSETCLIPRGN,
*PU_EMROFFSETCLIPRGN; //!< EMF manual 2.3.2.4
+#define U_SIZE_EMROFFSETCLIPRGN (sizeof(U_EMROFFSETCLIPRGN))
/* Index 27, 54 */
/**
@@ -2284,6 +2320,8 @@ typedef struct {
U_EMRLINETO, //!< EMF manual 2.3.5.13
*PU_EMRMOVETOEX, //!< EMF manual 2.3.11.4
*PU_EMRLINETO; //!< EMF manual 2.3.5.13
+#define U_SIZE_EMRMOVETOEX (sizeof(U_EMRMOVETOEX))
+#define U_SIZE_EMRLINETO (sizeof(U_EMRLINETO ))
/* Index 28,33,52,59,60,61,65,66,68 */
/** EMF manual 2.3.2
@@ -2309,6 +2347,15 @@ typedef struct {
*PU_EMRFLATTENPATH, //!< EMF manual 2.3.10
*PU_EMRWIDENPATH, //!< EMF manual 2.3.10
*PU_EMRABORTPATH; //!< EMF manual 2.3.10
+#define U_SIZE_EMRSETMETARGN (sizeof(U_EMRSETMETARGN ))
+#define U_SIZE_EMRSAVEDC (sizeof(U_EMRSAVEDC ))
+#define U_SIZE_EMRREALIZEPALETTE (sizeof(U_EMRREALIZEPALETTE))
+#define U_SIZE_EMRBEGINPATH (sizeof(U_EMRBEGINPATH ))
+#define U_SIZE_EMRENDPATH (sizeof(U_EMRENDPATH ))
+#define U_SIZE_EMRCLOSEFIGURE (sizeof(U_EMRCLOSEFIGURE ))
+#define U_SIZE_EMRFLATTENPATH (sizeof(U_EMRFLATTENPATH ))
+#define U_SIZE_EMRWIDENPATH (sizeof(U_EMRWIDENPATH ))
+#define U_SIZE_EMRABORTPATH (sizeof(U_EMRABORTPATH ))
/* Index 29,30 */
/** EMF manual 2.3.2.1
@@ -2320,6 +2367,8 @@ typedef struct {
U_EMRINTERSECTCLIPRECT, //!< EMF manual 2.3.2.3
*PU_EMREXCLUDECLIPRECT, //!< EMF manual 2.3.2.1
*PU_EMRINTERSECTCLIPRECT; //!< EMF manual 2.3.2.3
+#define U_SIZE_EMREXCLUDECLIPRECT (sizeof(U_EMREXCLUDECLIPRECT ))
+#define U_SIZE_EMRINTERSECTCLIPRECT (sizeof(U_EMRINTERSECTCLIPRECT ))
/* Index 31,32 */
/** EMF manual 2.3.11.7
@@ -2334,6 +2383,8 @@ typedef struct {
U_EMRSCALEWINDOWEXTEX, //!< EMF manual 2.3.11.8
*PU_EMRSCALEVIEWPORTEXTEX, //!< EMF manual 2.3.11.7
*PU_EMRSCALEWINDOWEXTEX; //!< EMF manual 2.3.11.8
+#define U_SIZE_EMRSCALEVIEWPORTEXTEX (sizeof(U_EMRSCALEVIEWPORTEXTEX))
+#define U_SIZE_EMRSCALEWINDOWEXTEX (sizeof(U_EMRSCALEWINDOWEXTEX ))
/* Index 33 (see 28) */
@@ -2345,6 +2396,7 @@ typedef struct {
int32_t iRelative; //!< DC to restore. -1 is preceding
} U_EMRRESTOREDC,
*PU_EMRRESTOREDC; //!< EMF manual 2.3.11.6
+#define U_SIZE_EMRRESTOREDC (sizeof(U_EMRRESTOREDC))
/* Index 35 */
/** EMF manual 2.3.12.2
@@ -2354,6 +2406,7 @@ typedef struct {
U_XFORM xform; //!< Transform
} U_EMRSETWORLDTRANSFORM,
*PU_EMRSETWORLDTRANSFORM; //!< EMF manual 2.3.12.2
+#define U_SIZE_EMRSETWORLDTRANSFORM (sizeof(U_EMRSETWORLDTRANSFORM))
/* Index 36 */
/** EMF manual 2.3.12.1
@@ -2364,6 +2417,7 @@ typedef struct {
uint32_t iMode; //!< ModifyWorldTransformMode Enumeration
} U_EMRMODIFYWORLDTRANSFORM,
*PU_EMRMODIFYWORLDTRANSFORM; //!< EMF manual 2.3.12.1
+#define U_SIZE_EMRMODIFYWORLDTRANSFORM (sizeof(U_EMRMODIFYWORLDTRANSFORM))
/* Index 37,40 */
/** EMF manual 2.3.8.3
@@ -2375,6 +2429,8 @@ typedef struct {
U_EMRSELECTOBJECT, //!< EMF manual 2.3.8.5
*PU_EMRDELETEOBJECT, //!< EMF manual 2.3.8.3
*PU_EMRSELECTOBJECT; //!< EMF manual 2.3.8.5
+#define U_SIZE_EMRDELETEOBJECT (sizeof(U_EMRDELETEOBJECT))
+#define U_SIZE_EMRSELECTOBJECT (sizeof(U_EMRSELECTOBJECT))
/* Index 38 */
/** EMF manual 2.3.7.7
@@ -2385,6 +2441,7 @@ typedef struct {
U_LOGPEN lopn; //!< Pen properties
} U_EMRCREATEPEN,
*PU_EMRCREATEPEN; //!< EMF manual 2.3.7.7
+#define U_SIZE_EMRCREATEPEN (sizeof(U_EMRCREATEPEN))
/* Index 39 */
/** EMF manual 2.3.7.1
@@ -2395,6 +2452,7 @@ typedef struct {
U_LOGBRUSH lb; //!< Brush properties
} U_EMRCREATEBRUSHINDIRECT,
*PU_EMRCREATEBRUSHINDIRECT; //!< EMF manual 2.3.7.1
+#define U_SIZE_EMRCREATEBRUSHINDIRECT (sizeof(U_EMRCREATEBRUSHINDIRECT))
/* Index 40 see 37 */
@@ -2409,6 +2467,7 @@ typedef struct {
U_FLOAT eSweepAngle; //!< Sweep angle in degrees
} U_EMRANGLEARC,
*PU_EMRANGLEARC; //!< EMF manual 2.3.5.1
+#define U_SIZE_EMRANGLEARC (sizeof(U_EMRANGLEARC))
/* Index 42,43 */
/** EMF manual 2.3.5.5
@@ -2420,6 +2479,8 @@ typedef struct {
U_EMRRECTANGLE, //!< EMF manual 2.3.5.5
*PU_EMRELLIPSE, //!< EMF manual 2.3.5.5
*PU_EMRRECTANGLE; //!< EMF manual 2.3.5.34
+#define U_SIZE_EMRELLIPSE (sizeof(U_EMRELLIPSE ))
+#define U_SIZE_EMRRECTANGLE (sizeof(U_EMRRECTANGLE))
/* Index 44 */
/** EMF manual 2.3.5.35
@@ -2430,6 +2491,7 @@ typedef struct {
U_SIZEL szlCorner; //!< W & H in logical units of ellipse used to round corner
} U_EMRROUNDRECT,
*PU_EMRROUNDRECT; //!< EMF manual 2.3.5.35
+#define U_SIZE_EMRROUNDRECT (sizeof(U_EMRROUNDRECT))
/* Index 45, 46 ,47, 55 */
/** EMF manual 2.3.5.2
@@ -2447,6 +2509,10 @@ typedef struct {
*PU_EMRCHORD, //!< EMF manual 2.3.5.4
*PU_EMRPIE, //!< EMF manual 2.3.5.15
*PU_EMRARCTO; //!< EMF manual 2.3.5.3
+#define U_SIZE_EMRARC (sizeof(U_EMRARC ))
+#define U_SIZE_EMRCHORD (sizeof(U_EMRCHORD))
+#define U_SIZE_EMRPIE (sizeof(U_EMRPIE ))
+#define U_SIZE_EMRARCTO (sizeof(U_EMRARCTO))
/* Index 48 */
/** EMF manual 2.3.8.6
@@ -2456,6 +2522,7 @@ typedef struct {
uint32_t ihPal; //!< Index of a Palette object in the EMF object table
} U_EMRSELECTPALETTE,
*PU_EMRSELECTPALETTE; //!< EMF manual 2.3.8.6
+#define U_SIZE_EMRSELECTPALETTE (sizeof(U_EMRSELECTPALETTE))
/* Index 49 */
/** EMF manual 2.3.7.6
@@ -2466,6 +2533,7 @@ typedef struct {
U_LOGPALETTE lgpl; //!< Palette properties
} U_EMRCREATEPALETTE,
*PU_EMRCREATEPALETTE; //!< EMF manual 2.3.7.6
+#define U_SIZE_EMRCREATEPALETTE (sizeof(U_EMRCREATEPALETTE))
/* Index 50 */
/** EMF manual 2.3.8.8
@@ -2478,6 +2546,7 @@ typedef struct {
U_LOGPLTNTRY aPalEntries[1]; //!< Values to set with
} U_EMRSETPALETTEENTRIES,
*PU_EMRSETPALETTEENTRIES; //!< EMF manual 2.3.8.8
+#define U_SIZE_EMRSETPALETTEENTRIES (sizeof(U_EMR) + 2*sizeof(uint32_t) + sizeof(U_NUM_LOGPLTNTRY))
/* Index 51 */
/** EMF manual 2.3.8.4
@@ -2488,6 +2557,7 @@ typedef struct {
uint32_t cEntries; //!< Number to expand or truncate the Palette entry list to.
} U_EMRRESIZEPALETTE,
*PU_EMRRESIZEPALETTE; //!< EMF manual 2.3.8.4
+#define U_SIZE_EMRRESIZEPALETTE (sizeof(U_EMRRESIZEPALETTE))
/* Index 52 (see 28) */
@@ -2501,22 +2571,26 @@ typedef struct {
uint32_t iMode; //!< FloodFill Enumeration
} U_EMREXTFLOODFILL,
*PU_EMREXTFLOODFILL; //!< EMF manual 2.3.5.6
+#define U_SIZE_EMREXTFLOODFILL (sizeof(U_EMREXTFLOODFILL))
/* Index 54 (see 27) */
/* Index 55 (see 45) */
/* Index 56 */
-/** EMF manual 2.3.5.20
+/** EMF manual 2.3.5.20
+
+ followed by
+ uint8_t abTypes[1]; //!< Array of Point Enumeration
*/
typedef struct {
U_EMR emr; //!< U_EMR
U_RECTL rclBounds; //!< Bounding rectangle in device units
U_NUM_POINTL cptl; //!< Number of U_POINTL objects
U_POINTL aptl[1]; //!< Array of U_POINTL objects
- uint8_t abTypes[1]; //!< Array of Point Enumeration
} U_EMRPOLYDRAW,
*PU_EMRPOLYDRAW; //!< EMF manual 2.3.5.20
+#define U_SIZE_EMRPOLYDRAW (sizeof(U_EMR) + sizeof(U_RECTL) + sizeof(U_NUM_POINTL))
/* Index 57 */
/** EMF manual 2.3.11.9
@@ -2526,6 +2600,7 @@ typedef struct {
uint32_t iArcDirection; //!< ArcDirection Enumeration
} U_EMRSETARCDIRECTION,
*PU_EMRSETARCDIRECTION; //!< EMF manual 2.3.11.9
+#define U_SIZE_EMRSETARCDIRECTION (sizeof(U_EMRSETARCDIRECTION))
/* Index 58 */
/** EMF manual 2.3.11.21
@@ -2538,6 +2613,7 @@ typedef struct {
uint32_t eMiterLimit; //!< Miter limit (max value of mitered length / line width)
} U_EMRSETMITERLIMIT,
*PU_EMRSETMITERLIMIT; //!< EMF manual 2.3.11.21
+#define U_SIZE_EMRSETMITERLIMIT (sizeof(U_EMRSETMITERLIMIT))
/* Index 59,60,61 (see 28) */
@@ -2553,6 +2629,9 @@ typedef struct {
*PU_EMRFILLPATH, //!< EMF manual 2.3.5.9
*PU_EMRSTROKEANDFILLPATH, //!< EMF manual 2.3.5.38
*PU_EMRSTROKEPATH; //!< EMF manual 2.3.5.39
+#define U_SIZE_EMRFILLPATH (sizeof(U_EMRFILLPATH ))
+#define U_SIZE_EMRSTROKEANDFILLPATH (sizeof(U_EMRSTROKEANDFILLPATH))
+#define U_SIZE_EMRSTROKEPATH (sizeof(U_EMRSTROKEPATH ))
/* Index 65,66 (see 28) */
/* Index 67 (see 17) */
@@ -2569,6 +2648,7 @@ typedef struct {
uint8_t Data[1]; //!< Comment (any binary data, interpretation is program specific)
} U_EMRCOMMENT,
*PU_EMRCOMMENT; //!< EMF manual 2.3.3.1, AKA GDICOMMENT
+#define U_SIZE_EMRCOMMENT (sizeof(U_EMR) + sizeof(U_CBDATA))
/* variant comment types */
/** EMF manual 2.3.3.2
@@ -2580,6 +2660,7 @@ typedef struct {
uint8_t Data[1]; //!< EMF Plus record
} U_EMRCOMMENT_EMFPLUS,
*PU_EMRCOMMENT_EMFPLUS; //!< EMF manual 2.3.3.2, EMF Plus comment
+#define U_SIZE_EMRCOMMENT_EMFPLUS (sizeof(U_EMR) + sizeof(U_CBDATA) + sizeof(uint32_t))
/** EMF manual 2.3.3.3
*/
@@ -2591,6 +2672,7 @@ typedef struct {
uint8_t Data[1]; //!< EMF Spool records
} U_EMRCOMMENT_SPOOL,
*PU_EMRCOMMENT_SPOOL; //!< EMF manual 2.3.3.3, EMF Spool comment
+#define U_SIZE_EMRCOMMENT_SPOOL (sizeof(U_EMR) + sizeof(U_CBDATA) + 2*sizeof(uint32_t))
/** EMF manual 2.3.3.4
*/
@@ -2602,9 +2684,11 @@ typedef struct {
uint8_t Data[1]; //!< Public comment data
} U_EMRCOMMENT_PUBLIC,
*PU_EMRCOMMENT_PUBLIC; //!< EMF manual 2.3.3.4, EMF Public comment
+#define U_SIZE_EMRCOMMENT_PUBLIC (sizeof(U_EMR) + sizeof(U_CBDATA) + 2*sizeof(uint32_t))
/* Index 71 */
-/** EMF manual 2.3.5.10
+/** EMF manual 2.3.5.10
+ followed by a variable number of U_RECTLs
*/
typedef struct {
U_EMR emr; //!< U_EMR
@@ -2614,6 +2698,7 @@ typedef struct {
U_RGNDATA RgnData[1]; //!< Variable size U_RGNDATA structure
} U_EMRFILLRGN,
*PU_EMRFILLRGN; //!< EMF manual 2.3.5.10
+#define U_SIZE_EMRFILLRGN (sizeof(U_EMR) + sizeof(U_RECTL) + sizeof(U_CBRGNDATA) + sizeof(uint32_t))
/* Index 72 */
/** EMF manual 2.3.5.11
@@ -2627,6 +2712,7 @@ typedef struct {
U_RGNDATA RgnData[1]; //!< Variable size U_RGNDATA structure
} U_EMRFRAMERGN,
*PU_EMRFRAMERGN; //!< EMF manual 2.3.5.11
+#define U_SIZE_EMRFRAMERGN (sizeof(U_EMR) + sizeof(U_RECTL) + sizeof(U_CBRGNDATA) + sizeof(uint32_t) + sizeof(U_SIZEL))
/* Index 73,74 */
/** EMF manual 2.3.11.3
@@ -2640,6 +2726,8 @@ typedef struct {
U_EMRPAINTRGN, //!< EMF manual 2.3.5.14
*PU_EMRINVERTRGN, //!< EMF manual 2.3.11.3
*PU_EMRPAINTRGN; //!< EMF manual 2.3.5.14
+#define U_SIZE_EMRINVERTRGN (sizeof(U_EMR) + sizeof(U_RECTL) + sizeof(U_CBRGNDATA))
+#define U_SIZE_EMRPAINTRGN U_SIZE_EMRINVERTRGN
/* Index 75 */
/** EMF manual 2.3.2.2
@@ -2651,6 +2739,7 @@ typedef struct {
U_RGNDATA RgnData[1]; //!< Variable size U_RGNDATA structure
} U_EMREXTSELECTCLIPRGN,
*PU_EMREXTSELECTCLIPRGN; //!< EMF manual 2.3.2.2
+#define U_SIZE_EMREXTSELECTCLIPRGN (sizeof(U_EMR) + sizeof(U_CBRGNDATA) + sizeof(uint32_t))
/* Index 76 */
/** EMF manual 2.3.1.2
@@ -2672,6 +2761,7 @@ typedef struct {
//!< Record may include optional bitmapbuffer
} U_EMRBITBLT,
*PU_EMRBITBLT; //!< EMF manual 2.3.1.2
+#define U_SIZE_EMRBITBLT (sizeof(U_EMRBITBLT))
/* Index 77 */
/** EMF manual 2.3.1.6
@@ -2694,6 +2784,7 @@ typedef struct {
//!< Record may include optional bitmapbuffer
} U_EMRSTRETCHBLT,
*PU_EMRSTRETCHBLT; //!< EMF manual 2.3.1.6
+#define U_SIZE_EMRSTRETCHBLT (sizeof(U_EMRSTRETCHBLT))
/* Index 78 */
/** EMF manual 2.3.1.3
@@ -2721,6 +2812,7 @@ typedef struct {
//!< Record may include optional Source and mask bitmapbuffers
} U_EMRMASKBLT,
*PU_EMRMASKBLT; //!< EMF manual 2.3.1.3
+#define U_SIZE_EMRMASKBLT (sizeof(U_EMRMASKBLT))
/* Index 79 */
/** EMF manual 2.3.1.4
@@ -2747,6 +2839,7 @@ typedef struct {
//!< Record may include optional Source and mask bitmapbuffers
} U_EMRPLGBLT,
*PU_EMRPLGBLT; //!< EMF manual 2.3.1.4
+#define U_SIZE_EMRPLGBLT (sizeof(U_EMRPLGBLT))
/* Index 80 */
/** EMF manual 2.3.1.5
@@ -2767,6 +2860,7 @@ typedef struct {
//!< Record may includes optional bitmapbuffer
} U_EMRSETDIBITSTODEVICE,
*PU_EMRSETDIBITSTODEVICE; //!< EMF manual 2.3.1.5
+#define U_SIZE_EMRSETDIBITSTODEVICE (sizeof(U_EMRSETDIBITSTODEVICE))
/* Index 81 */
/** EMF manual 2.3.1.7
@@ -2787,6 +2881,7 @@ typedef struct {
//!< Record may includes optional bitmapbuffer
} U_EMRSTRETCHDIBITS,
*PU_EMRSTRETCHDIBITS; //!< EMF manual 2.3.1.7
+#define U_SIZE_EMRSTRETCHDIBITS (sizeof(U_EMRSTRETCHDIBITS))
/* Index 82 */
/** EMF manual 2.3.7.8
@@ -2797,6 +2892,8 @@ typedef struct {
U_LOGFONT_PANOSE elfw; //!< Font parameters, either U_LOGFONT or U_LOGFONT_PANOSE, the latter is bigger so use that type here
} U_EMREXTCREATEFONTINDIRECTW,
*PU_EMREXTCREATEFONTINDIRECTW; //!< EMF manual 2.3.7.8
+#define U_SIZE_EMREXTCREATEFONTINDIRECTW_LOGFONT_PANOSE (sizeof(U_EMR) + 4 + sizeof(U_LOGFONT_PANOSE))
+#define U_SIZE_EMREXTCREATEFONTINDIRECTW_LOGFONT (sizeof(U_EMR) + 4 + sizeof(U_LOGFONT))
/* Index 83,84 */
/** EMF manual 2.3.5.7
@@ -2820,6 +2917,8 @@ typedef struct {
U_EMREXTTEXTOUTW, //!< EMF manual 2.3.5.8
*PU_EMREXTTEXTOUTA, //!< EMF manual 2.3.5.7
*PU_EMREXTTEXTOUTW; //!< EMF manual 2.3.5.8
+#define U_SIZE_EMREXTTEXTOUTA (sizeof(U_EMREXTTEXTOUTA))
+#define U_SIZE_EMREXTTEXTOUTW (sizeof(U_EMREXTTEXTOUTW))
/* Index 85,86,87,88,89 */
/** EMF manual 2.3.5.17
@@ -2839,9 +2938,16 @@ typedef struct {
*PU_EMRPOLYLINE16, //!< EMF manual 2.3.5.25
*PU_EMRPOLYBEZIERTO16, //!< EMF manual 2.3.5.19
*PU_EMRPOLYLINETO16; //!< EMF manual 2.3.5.27
-
+#define U_SIZE_EMRPOLYBEZIER16 (sizeof(U_EMR) + sizeof(U_RECTL) + sizeof(U_NUM_POINT16))
+#define U_SIZE_EMRPOLYGON16 U_SIZE_EMRPOLYBEZIER16
+#define U_SIZE_EMRPOLYLINE16 U_SIZE_EMRPOLYBEZIER16
+#define U_SIZE_EMRPOLYBEZIERTO16 U_SIZE_EMRPOLYBEZIER16
+#define U_SIZE_EMRPOLYLINETO16 U_SIZE_EMRPOLYBEZIER16
/* Index 90,91 */
-/** EMF manual 2.3.5.31
+/** EMF manual 2.3.5.31
+
+ followed by
+ U_POINT16 apts[1]; //!< array of point16
*/
typedef struct {
U_EMR emr; //!< U_EMR
@@ -2849,24 +2955,28 @@ typedef struct {
U_NUM_POLYCOUNTS nPolys; //!< Number of elements in aPolyCounts
U_NUM_POINT16 cpts; //!< Total number of points (over all poly)
U_POLYCOUNTS aPolyCounts[1]; //!< Number of points in each poly (sequential)
-// This will appear somewhere but is not really part of the core structure.
-// U_POINT16 apts[1]; //!< array of point16
} U_EMRPOLYPOLYLINE16,
U_EMRPOLYPOLYGON16, //!< EMF manual 2.3.5.29
*PU_EMRPOLYPOLYLINE16, //!< EMF manual 2.3.5.31
*PU_EMRPOLYPOLYGON16; //!< EMF manual 2.3.5.29
+#define U_SIZE_EMRPOLYPOLYLINE16 (sizeof(U_EMR) + sizeof(U_RECTL) + sizeof(U_NUM_POLYCOUNTS) + sizeof(U_NUM_POINT16))
+#define U_SIZE_EMRPOLYPOLYGON16 U_SIZE_EMRPOLYPOLYLINE16
/* Index 92 */
-/** EMF manual 2.3.5.21
+/** EMF manual 2.3.5.21
+
+ followed by
+ uint8_t abTypes[1]; //!< Array of Point Enumeration
+
*/
typedef struct {
U_EMR emr; //!< U_EMR
U_RECTL rclBounds; //!< Bounding rectangle in device units
U_NUM_POINT16 cpts; //!< Total number of points (over all poly)
U_POINT16 apts[1]; //!< array of points
- uint8_t abTypes[1]; //!< Array of Point Enumeration
} U_EMRPOLYDRAW16,
*PU_EMRPOLYDRAW16; //!< EMF manual 2.3.5.21
+#define U_SIZE_EMRPOLYDRAW16 (sizeof(U_EMR) + sizeof(U_RECTL) + sizeof(U_NUM_POINT16))
/* Index 93 */
/** EMF manual 2.3.7.5
@@ -2882,6 +2992,7 @@ typedef struct {
//!< Record may include optional DIB bitmapbuffer
} U_EMRCREATEMONOBRUSH,
*PU_EMRCREATEMONOBRUSH; //!< EMF manual 2.3.7.5
+#define U_SIZE_EMRCREATEMONOBRUSH (sizeof(U_EMRCREATEMONOBRUSH))
/* Index 94 */
/** EMF manual 2.3.7.4
@@ -2897,6 +3008,7 @@ typedef struct {
//!< Record may include optional DIB bitmapbuffer
} U_EMRCREATEDIBPATTERNBRUSHPT,
*PU_EMRCREATEDIBPATTERNBRUSHPT; //!< EMF manual 2.3.7.4
+#define U_SIZE_EMRCREATEDIBPATTERNBRUSHPT (sizeof(U_EMRCREATEDIBPATTERNBRUSHPT))
/* Index 95 */
/** EMF manual 2.3.7.9
@@ -2912,6 +3024,7 @@ typedef struct {
//!< Record may include optional DIB bitmap
} U_EMREXTCREATEPEN,
*PU_EMREXTCREATEPEN; //!< EMF manual 2.3.7.9
+#define U_SIZE_EMREXTCREATEPEN (sizeof(U_EMREXTCREATEPEN))
/* Index 96.97 */
/** EMF manual 2.3.5.32
@@ -2928,6 +3041,8 @@ typedef struct {
U_EMRPOLYTEXTOUTW, //!< EMF manual 2.3.5.33
*PU_EMRPOLYTEXTOUTA, //!< EMF manual 2.3.5.32
*PU_EMRPOLYTEXTOUTW; //!< EMF manual 2.3.5.33
+#define U_SIZE_EMRPOLYTEXTOUTA (sizeof(U_EMR) + sizeof(U_RECTL) + sizeof(uint32_t) + 2*sizeof(U_FLOAT) + sizeof(U_NUM_EMRTEXT))
+#define U_SIZE_EMRPOLYTEXTOUTW U_SIZE_EMRPOLYTEXTOUTA
/* Index 98 (see 17) */
@@ -2940,6 +3055,7 @@ typedef struct {
U_LOGCOLORSPACEA lcs; //!< ColorSpace parameters
} U_EMRCREATECOLORSPACE,
*PU_EMRCREATECOLORSPACE; //!< EMF manual 2.3.7.2
+#define U_SIZE_EMRCREATECOLORSPACE (sizeof(U_EMRCREATECOLORSPACE))
/* Index 100,101 */
/** EMF manual 2.3.8.2
@@ -2951,6 +3067,8 @@ typedef struct {
U_EMRSETCOLORSPACE, //!< EMF manual 2.3.8.7
*PU_EMRDELETECOLORSPACE, //!< EMF manual 2.3.8.2
*PU_EMRSETCOLORSPACE; //!< EMF manual 2.3.8.7
+#define U_SIZE_EMRDELETECOLORSPACE (sizeof(U_EMRDELETECOLORSPACE))
+#define U_SIZE_EMRSETCOLORSPACE (sizeof(U_EMRSETCOLORSPACE ))
/* Index 102 */
/** EMF manual 2.3.9.2
@@ -2961,6 +3079,7 @@ typedef struct {
U_DATA Data[1]; //!< OpenGL data
} U_EMRGLSRECORD,
*PU_EMRGLSRECORD; //!< EMF manual 2.3.9.2
+#define U_SIZE_EMRGLSRECORD (sizeof(U_EMRGLSRECORD))
/* Index 103 */
/** EMF manual 2.3.9.1
@@ -2972,6 +3091,7 @@ typedef struct {
U_DATA Data[1]; //!< OpenGL data
} U_EMRGLSBOUNDEDRECORD,
*PU_EMRGLSBOUNDEDRECORD; //!< EMF manual 2.3.9.1
+#define U_SIZE_EMRGLSBOUNDEDRECORD (sizeof(U_EMR) + sizeof(U_RECTL) + sizeof(U_CBDATA))
/* Index 104 */
/** EMF manual 2.3.11.5
@@ -2981,6 +3101,7 @@ typedef struct {
U_PIXELFORMATDESCRIPTOR pfd; //!< PixelFormatDescriptor
} U_EMRPIXELFORMAT,
*PU_EMRPIXELFORMAT; //!< EMF manual 2.3.11.5
+#define U_SIZE_EMRPIXELFORMAT (sizeof(U_EMRPIXELFORMAT))
/* Index 105 */
/** EMF manual 2.3.6.1
@@ -2991,6 +3112,7 @@ typedef struct {
U_DATA Data[1]; //!< Data to send
} U_EMRDRAWESCAPE,
*PU_EMRDRAWESCAPE; //!< EMF manual 2.3.6.1
+#define U_SIZE_EMRDRAWESCAPE (sizeof(U_EMR) + sizeof(U_CBDATA))
/* Index 106 */
/** EMF manual 2.3.6.2
@@ -3001,6 +3123,7 @@ typedef struct {
U_DATA Data[1]; //!< Data to send
} U_EMREXTESCAPE,
*PU_EMREXTESCAPE; //!< EMF manual 2.3.6.2
+#define U_SIZE_EMREXTESCAPE (sizeof(U_EMR) + sizeof(U_CBDATA))
/* Index 107 (not implemented ) */
@@ -3020,22 +3143,26 @@ typedef struct {
//!< uint32_t TextString; text to output (fuOptions & ETO_SMALL_CHARS ? 8 bit : 16 bit)
} U_EMRSMALLTEXTOUT,
*PU_EMRSMALLTEXTOUT; //!< EMF manual 2.3.5.37
+#define U_SIZE_EMRSMALLTEXTOUT (sizeof(U_EMRSMALLTEXTOUT))
/* Index 109 (not implemented )
EMF manual 2.3.11.2
*/
/* Index 110 */
-/** EMF manual 2.3.6.3
+/** EMF manual 2.3.6.3
+
+ followed by
+ uint8_t Data[1]; //!< Data for printer driver
*/
typedef struct {
U_EMR emr; //!< U_EMR
U_CBDATA cbDriver; //!< Number of bytes in driver name (note, BYTES, not CHARACTERS)
U_CBDATA cbData; //!< Number of bytes in data
uint16_t Driver[1]; //!< Driver name in uint16_t characters, null terminated
- uint8_t Data[1]; //!< Data for printer driver
} U_EMRNAMEDESCAPE,
*PU_EMRNAMEDESCAPE; //!< EMF manual 2.3.6.3
+#define U_SIZE_EMRNAMEDESCAPE (sizeof(U_EMRNAMEDESCAPE))
/* Index 111-113 (not implemented )
EMF manual 2.3.8.1
@@ -3064,6 +3191,7 @@ typedef struct {
//!< Record may include optional DIB bitmap
} U_EMRALPHABLEND,
*PU_EMRALPHABLEND; //!< EMF manual 2.3.1.1
+#define U_SIZE_EMRALPHABLEND (sizeof(U_EMRALPHABLEND))
/* Index 115 (see 17) */
@@ -3088,11 +3216,16 @@ typedef struct {
//!< Record may includes optional bitmapbuffer
} U_EMRTRANSPARENTBLT,
*PU_EMRTRANSPARENTBLT; //!< EMF manual 2.3.1.8
+#define U_SIZE_EMRTRANSPARENTBLT (sizeof(U_EMRTRANSPARENTBLT))
/* Index 117 (not a defined U_EMR record type ) */
/* Index 118 */
-/** EMF manual 2.3.5.12
+/** EMF manual 2.3.5.12
+
+ followed by
+ U_TRIVERTEX TriVert[1]; Array of TriVertex objects
+ uint32_t GradObj[1]; Array of gradient objects (each has 2 or 3 indices into TriVert array)
*/
typedef struct {
U_EMR emr; //!< U_EMR
@@ -3100,11 +3233,9 @@ typedef struct {
U_NUM_TRIVERTEX nTriVert; //!< Number of TriVertex objects
U_NUM_GRADOBJ nGradObj; //!< Number of gradient triangle/rectangle objects
uint32_t ulMode; //!< Gradientfill Enumeration (determines Triangle/Rectangle)
-//parts that are required but which are not included in the core structure
-// U_TRIVERTEX TriVert[1]; Array of TriVertex objects
-// uint32_t GradObj[1]; Array of gradient objects (each has 2 or 3 indices into TriVert array)
} U_EMRGRADIENTFILL,
*PU_EMRGRADIENTFILL; //!< EMF manual 2.3.5.12
+#define U_SIZE_EMRGRADIENTFILL (sizeof(U_EMRGRADIENTFILL))
/* Index 119,120 (not implemented )
EMF manual 2.3.11.18
@@ -3123,6 +3254,7 @@ typedef struct {
uint8_t Data[1]; //!< Data of size cbName+cbData: Name in UTF16 then color profile data
} U_EMRCOLORMATCHTOTARGETW,
*PU_EMRCOLORMATCHTOTARGETW; //!< EMF manual 2.3.11.1
+#define U_SIZE_EMRCOLORMATCHTOTARGETW (sizeof(U_EMR) + 2*sizeof(uint32_t) + sizeof(U_CBNAME) + sizeof(U_CBDATA))
/* Index 122 */
/** EMF manual 2.3.7.3
@@ -3136,6 +3268,10 @@ typedef struct {
uint8_t Data[1]; //!< (Optional, dwFlags & 1) color profile data
} U_EMRCREATECOLORSPACEW,
*PU_EMRCREATECOLORSPACEW; //!< EMF manual 2.3.7.3
+#define U_SIZE_EMRCREATECOLORSPACEW (sizeof(U_EMR) + 2*sizeof(uint32_t) + sizeof(U_LOGCOLORSPACEW) + sizeof(U_CBDATA))
+
+// records which are not documented, so we have no idea what to do with them
+#define U_SIZE_EMRUNDEFINED 2048
// ************************************************************************************************
// Utility function structures
@@ -3207,7 +3343,7 @@ int get_real_color_count(const char *Bmih);
int get_real_color_icount(int Colors, int BitCount, int Width, int Height);
int RGBA_to_DIB(char **px, uint32_t *cbPx, PU_RGBQUAD *ct, int *numCt,
const char *rgba_px, int w, int h, int stride, uint32_t colortype, int use_ct, int invert);
-int get_DIB_params( void *pEmr, uint32_t offBitsSrc, uint32_t offBmiSrc,
+int get_DIB_params( const char *record, uint32_t offBitsSrc, uint32_t offBmiSrc,
const char **px, const U_RGBQUAD **ct, uint32_t *numCt,
uint32_t *width, uint32_t *height, uint32_t *colortype, uint32_t *invert );
int DIB_to_RGBA(const char *px, const U_RGBQUAD *ct, int numCt,
@@ -3237,6 +3373,7 @@ int emf_htable_free(EMFHANDLES **eht);
#define htable_free emf_htable_free
U_RECTL rectl_set(U_POINTL ul, U_POINTL lr);
+void rectli_set(PU_RECTL array, int index, U_POINTL ul, U_POINTL lr);
U_SIZEL sizel_set(int32_t x, int32_t y);
U_POINTL point32_set(int32_t x, int32_t y);
#define point_set point32_set
@@ -3463,6 +3600,7 @@ char *U_EMRSMALLTEXTOUT_set(const U_POINTL Dest, const U_NUM_STR cChars, const u
// U_EMRSETICMPROFILEA_set 112 Not implemented
// U_EMRSETICMPROFILEW_set 113 Not implemented
+
char *U_EMRALPHABLEND_set(const U_RECTL rclBounds, const U_POINTL Dest, const U_POINTL cDest,
const U_POINTL Src, const U_POINTL cSrc, const U_XFORM xformSrc,
const U_COLORREF crBkColorSrc, const uint32_t iUsageSrc,
diff --git a/src/libuemf/uemf_endian.c b/src/libuemf/uemf_endian.c
index 2d19361e1..f746553f1 100644
--- a/src/libuemf/uemf_endian.c
+++ b/src/libuemf/uemf_endian.c
@@ -19,11 +19,11 @@
/*
File: uemf_endian.c
-Version: 0.0.16
-Date: 27-MAR-2014
+Version: 0.0.21
+Date: 23-APR-2015
Author: David Mathog, Biology Division, Caltech
email: mathog@caltech.edu
-Copyright: 2014 David Mathog and California Institute of Technology (Caltech)
+Copyright: 2015 David Mathog and California Institute of Technology (Caltech)
*/
#ifdef __cplusplus
@@ -266,18 +266,91 @@ void bitmapinfoheader_swap(
\param Bmi Pointer to a U_BITMAPINFO object
*/
void bitmapinfo_swap(
- PU_BITMAPINFO Bmi
+ const char *Bmi
){
- bitmapinfoheader_swap(&(Bmi->bmiHeader)); // bmIHeader
+ PU_BITMAPINFO pBmi = (PU_BITMAPINFO)Bmi;
+ bitmapinfoheader_swap(&(pBmi->bmiHeader)); // bmIHeader
// ordered bytes: bmiColors
}
/**
+ \brief Swap the ordered bytes in a DIB and verify that the sizes are OK
+
+ \return 1 on success, 0 on failure
+ \param record EMF record that contains a DIB pixel array
+ \param iUsage DIBcolors Enumeration
+ \param offBmi offset from the start of the record to the start of the bitmapinfo structure
+ \param cbBmi declared space for the bitmapinfo structure in the record
+ \param offBits offset from the start of the record to the start of the bitmap
+ \param cbBits declared space for the bitmap in the record (amount used may be less than this)
+ \param blimit one byte past the end of the record.
+ \param torev 1 for native to reversed, 0 for reversed to native
+
+ This method can only test DIBs that hold Microsoft's various bitmap types. PNG or JPG is just a bag
+ of bytes, and there is no possible way to derive from the known width and height how big it should be.
+*/
+int DIB_swap(
+ const char *record,
+ uint32_t iUsage,
+ uint32_t offBmi,
+ uint32_t cbBmi,
+ uint32_t offBits,
+ uint32_t cbBits,
+ const char *blimit,
+ int torev
+ ){
+ int dibparams = U_BI_UNKNOWN; // type of image not yet determined
+ const char *px = NULL; // DIB pixels
+ const U_RGBQUAD *ct = NULL; // DIB color table
+ int bs;
+ int usedbytes;
+
+ if(!cbBmi)return(1); // No DIB in a record where it is optional
+ if(IS_MEM_UNSAFE(record, offBmi + cbBmi, blimit))return(0);
+ if(cbBits && IS_MEM_UNSAFE(record, offBits + cbBits, blimit))return(0);
+ if(iUsage == U_DIB_RGB_COLORS){
+ uint32_t width, height, colortype, numCt, invert; // these values will be set in get_DIB_params
+ // next call returns pointers and values, but allocates no memory
+ if(torev){
+ dibparams = get_DIB_params(record, offBits, offBmi, &px, (const U_RGBQUAD **) &ct,
+ &numCt, &width, &height, &colortype, &invert);
+ }
+ bitmapinfo_swap(record + offBmi); // byte ordered fields in bitmapinfo
+ if(!torev){
+ dibparams = get_DIB_params(record, offBits, offBmi, &px, (const U_RGBQUAD **) &ct,
+ &numCt, &width, &height, &colortype, &invert);
+ }
+
+ // sanity checking
+ if(numCt && colortype >= U_BCBM_COLOR16)return(0); //color tables not used above 16 bit pixels
+ if(!numCt && colortype < U_BCBM_COLOR16)return(0); //color tables mandatory for < 16 bit
+
+ if(dibparams ==U_BI_RGB){
+ // this is the only DIB type where we can calculate how big it should be when stored in the EMF file
+ bs = colortype/8;
+ if(bs<1){
+ usedbytes = (width*colortype + 7)/8; // width of line in fully and partially occupied bytes
+ }
+ else {
+ usedbytes = width*bs;
+ }
+ if(IS_MEM_UNSAFE(record+offBits, usedbytes, blimit))return(0);
+ }
+ }
+ else {
+ bitmapinfo_swap(record + offBmi);
+ }
+ return(1);
+}
+
+/**
\brief Convert a pointer to a U_EXTLOGPEN object.
- \param elp PU_EXTLOGPEN object
+ \param elp PU_EXTLOGPEN object
+ \param blimit one byte past the end of the record
*/
-void extlogpen_swap(
+int extlogpen_swap(
PU_EXTLOGPEN elp,
+ const char *blimit,
int torev
){
int count=0;
@@ -290,7 +363,9 @@ void extlogpen_swap(
if(!torev){
count = elp->elpNumEntries;
}
+ if(IS_MEM_UNSAFE(&(elp->elpStyleEntry), count*4, blimit))return(0);
U_swap4(&(elp->elpStyleEntry),count); // elpStyleEntry[]
+ return(1);
}
/**
@@ -330,15 +405,27 @@ void rgndataheader_swap(
}
/**
+ \return 1 on success, 0 on failure
\brief Convert a pointer to a U_RGNDATA object.
- \param rgd pointer to a U_RGNDATA object.
+ \param rd pointer to a U_RGNDATA object.
+ \param cbRgnData size of the U_RGNDATA object.
*/
-void rgndata_swap(
- PU_RGNDATA rd
+int rgndata_swap(
+ PU_RGNDATA rd,
+ int cbRgnData,
+ int torev
){
- int count = rd->rdh.nCount;
+ int count = 0;
+ if(torev){
+ count = rd->rdh.nCount;
+ }
rgndataheader_swap(&(rd->rdh));
+ if(!torev){
+ count = rd->rdh.nCount;
+ }
+ if(4*count + (int)sizeof(U_RGNDATAHEADER) > cbRgnData)return(0);
U_swap4(rd->Buffer,4*count);
+ return(1);
}
/**
@@ -368,12 +455,14 @@ void pixelformatdescriptor_swap(
\brief Convert a Pointer to a U_EMRTEXT record
\param pemt Pointer to a U_EMRTEXT record
\param record Pointer to the start of the record which contains this U_EMRTEXT
+ \param blimit one byte past the end of the record.
\param torev 1 for native to reversed, 0 for reversed to native
*/
-void emrtext_swap(
- PU_EMRTEXT pemt,
- char *record,
- int torev
+int emrtext_swap(
+ PU_EMRTEXT pemt,
+ char *record,
+ const char *blimit,
+ int torev
){
int off;
uint32_t count=0;
@@ -391,6 +480,7 @@ void emrtext_swap(
}
off = sizeof(U_EMRTEXT);
if(!(fOptions & U_ETO_NO_RECT)){
+ if(IS_MEM_UNSAFE(pemt, sizeof(U_RECTL), blimit))return(0);
rectl_swap((PU_RECTL)((char *)pemt + off),1); // optional rectangle
off+=sizeof(U_RECTL);
}
@@ -398,11 +488,14 @@ void emrtext_swap(
offDx = *(uint32_t *)((char *)pemt +off);
}
// ordered bytes OR UTF16-LE: the string at offString
+ if(IS_MEM_UNSAFE(pemt, off + 4, blimit))return(0);
U_swap4(((char *)pemt+off),1); // offDx
if(!torev){
offDx = *(uint32_t *)((char *)pemt +off);
}
- U_swap4((record+offDx),count); // Dx[], offset with respect to the Record, NOT the object
+ if(IS_MEM_UNSAFE(record, count*4, blimit))return(0);
+ U_swap4((record + offDx),count); // Dx[], offset with respect to the Record, NOT the object
+ return(1);
}
@@ -424,182 +517,236 @@ by end user code and to further that end prototypes are NOT provided and they ar
// all core*_swap call this, U_EMRSETMARGN_swap and some others all it directly
// numbered as core5 to be consistent with uemf.c, but must appear before the others as there is no prototype
-void core5_swap(char *record, int torev){
+int core5_swap(char *record, int torev){
UNUSED_PARAMETER(torev);
- PU_ENHMETARECORD pEMR = (PU_ENHMETARECORD)(record);
- U_swap4(pEMR,2); // iType nSize
+ if(!record)return(0);
+ PU_EMR pEmr = (PU_EMR)(record);
+ U_swap4(pEmr,2); // iType nSize
+ return(1);
}
// Functions with the same form starting with U_EMRPOLYBEZIER_swap
-void core1_swap(char *record, int torev){
+int core1_swap(char *record, int torev){
int count=0;
+ const char *blimit = NULL;
PU_EMRPOLYLINETO pEmr = (PU_EMRPOLYLINETO) (record);
if(torev){
count = pEmr->cptl;
+ blimit = record + pEmr->emr.nSize;
}
- core5_swap(record, torev);
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1 ); // rclBounds
U_swap4(&(pEmr->cptl),1); // cptl
if(!torev){
count = pEmr->cptl;
+ blimit = record + pEmr->emr.nSize;
}
+ if(IS_MEM_UNSAFE((pEmr->aptl), count*sizeof(U_POINTL), blimit))return(0);
pointl_swap((pEmr->aptl),count); // aptl[]
+ return(1);
}
// Functions with the same form starting with U_EMRPOLYPOLYLINE_swap
-void core2_swap(char *record, int torev){
+int core2_swap(char *record, int torev){
int count=0;
int nPolys=0;
+ const char *blimit = NULL;
PU_EMRPOLYPOLYLINE pEmr = (PU_EMRPOLYPOLYLINE) (record);
if(torev){
count = pEmr->cptl;
nPolys = pEmr->nPolys;
+ blimit = record + pEmr->emr.nSize;
}
- core5_swap(record, torev);
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
U_swap4(&(pEmr->nPolys),2); // nPolys cptl
if(!torev){
count = pEmr->cptl;
nPolys = pEmr->nPolys;
+ blimit = record + pEmr->emr.nSize;
}
+ if(IS_MEM_UNSAFE((pEmr->aPolyCounts), nPolys*4, blimit))return(0);
U_swap4(pEmr->aPolyCounts,nPolys); // aPolyCounts[]
- pointl_swap((PU_POINT)(record + sizeof(U_EMRPOLYPOLYLINE) - 4 + sizeof(uint32_t)* nPolys), count); // paptl[]
+ record += sizeof(U_EMRPOLYPOLYLINE) - 4 + sizeof(uint32_t)* nPolys;
+ if(IS_MEM_UNSAFE(record, count*sizeof(U_POINTL), blimit))return(0);
+ pointl_swap((PU_POINT)(record), count); // paptl[]
+ return(1);
}
// Functions with the same form starting with U_EMRSETMAPMODE_swap
-void core3_swap(char *record, int torev){
+int core3_swap(char *record, int torev){
PU_EMRSETMAPMODE pEmr = (PU_EMRSETMAPMODE)(record);
- core5_swap(record, torev);
+ if(!core5_swap(record, torev))return(0);
U_swap4(&(pEmr->iMode),1); // iMode
+ return(1);
}
// Functions taking a single U_RECT or U_RECTL, starting with U_EMRELLIPSE_swap, also U_EMRFILLPATH_swap,
-void core4_swap(char *record, int torev){
+int core4_swap(char *record, int torev){
PU_EMRELLIPSE pEmr = (PU_EMRELLIPSE)( record);
- core5_swap(record, torev);
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBox),1); // rclBox
+ return(1);
}
// Functions with the same form starting with U_EMRPOLYBEZIER16_swap
-void core6_swap(char *record, int torev){
+int core6_swap(char *record, int torev){
int count=0;
+ const char *blimit = NULL;
PU_EMRPOLYBEZIER16 pEmr = (PU_EMRPOLYBEZIER16) (record);
if(torev){
count = pEmr->cpts;
+ blimit = record + pEmr->emr.nSize;
}
- core5_swap(record, torev);
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
U_swap4(&(pEmr->cpts),1); // cpts
if(!torev){
count = pEmr->cpts;
+ blimit = record + pEmr->emr.nSize;
}
+ if(IS_MEM_UNSAFE((pEmr->apts), count*sizeof(U_POINT16), blimit))return(0);
point16_swap((pEmr->apts),count); // apts[]
+ return(1);
}
// Records with the same form starting with U_EMRSETWINDOWEXTEX_swap, that is, all with two uint32_t values after the emr
-void core7_swap(char *record, int torev){
+int core7_swap(char *record, int torev){
PU_EMRGENERICPAIR pEmr = (PU_EMRGENERICPAIR) (record);
- core5_swap(record, torev);
+ if(!core5_swap(record, torev))return(0);
U_swap4(&(pEmr->pair),2);
+ return(1);
}
// For U_EMREXTTEXTOUTA and U_EMREXTTEXTOUTW, type=0 for the first one
-void core8_swap(char *record, int torev){
+int core8_swap(char *record, int torev){
+ const char *blimit = NULL;
PU_EMREXTTEXTOUTA pEmr = (PU_EMREXTTEXTOUTA) (record);
- emrtext_swap(&(pEmr->emrtext),record,torev);
- core5_swap(record, torev);
+ if(torev){
+ blimit = record + pEmr->emr.nSize;
+ }
+ if(!core5_swap(record, torev))return(0);
U_swap4(&(pEmr->iGraphicsMode),1); // iGraphicsMode
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
U_swap4(&(pEmr->exScale),2); // exScale eyScale
+ if(!torev){
+ blimit = record + pEmr->emr.nSize;
+ }
+ if(!emrtext_swap(&(pEmr->emrtext),record,blimit,torev))return(0);
+ return(1);
}
// Functions that take a rect and a pair of points, starting with U_EMRARC_swap
-void core9_swap(char *record, int torev){
+int core9_swap(char *record, int torev){
PU_EMRARC pEmr = (PU_EMRARC) (record);
- core5_swap(record, torev);
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBox),1); // rclBox
U_swap4(&(pEmr->ptlStart),4); // ptlStart ptlEnd
+ return(1);
}
// Functions with the same form starting with U_EMRPOLYPOLYLINE16_swap
-void core10_swap(char *record, int torev){
+int core10_swap(char *record, int torev){
int count=0;
int nPolys=0;
+ const char *blimit = NULL;
PU_EMRPOLYPOLYLINE16 pEmr = (PU_EMRPOLYPOLYLINE16) (record);
if(torev){
count = pEmr->cpts;
nPolys = pEmr->nPolys;
+ blimit = record + pEmr->emr.nSize;
}
- core5_swap(record, torev);
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
U_swap4(&(pEmr->nPolys),2); // nPolys cpts
if(!torev){
count = pEmr->cpts;
nPolys = pEmr->nPolys;
+ blimit = record + pEmr->emr.nSize;
}
+ if(IS_MEM_UNSAFE((pEmr->aPolyCounts), nPolys*4, blimit))return(0);
U_swap4(pEmr->aPolyCounts,nPolys); // aPolyCounts[]
- point16_swap((PU_POINT16)(record + sizeof(U_EMRPOLYPOLYLINE16) - 4 + sizeof(uint32_t)* nPolys), count); // apts[]
+ record += sizeof(U_EMRPOLYPOLYLINE16) - 4 + sizeof(uint32_t)* nPolys;
+ if(IS_MEM_UNSAFE(record, count*sizeof(U_POINT16), blimit))return(0);
+ point16_swap((PU_POINT16)(record), count); // apts[]
+ return(1);
}
// Functions with the same form starting with U_EMRINVERTRGN_swap and U_EMRPAINTRGN_swap,
-void core11_swap(char *record, int torev){
- int roff=0;
- int nextroff=0;
- int limit=0;
- PU_EMRINVERTRGN pEmr = (PU_EMRINVERTRGN) (record);
- roff = 0;
+int core11_swap(char *record, int torev){
+ int cbRgnData=0;
+ const char *blimit = NULL;
+ PU_EMRINVERTRGN pEmr = (PU_EMRINVERTRGN)(record);
if(torev){
- limit = pEmr->emr.nSize;
- nextroff = 0;
- }
- core5_swap(record, torev);
- if(!torev){
- limit = pEmr->emr.nSize;
+ cbRgnData= pEmr->cbRgnData;
+ blimit = record + pEmr->emr.nSize;
}
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
U_swap4(&(pEmr->cbRgnData),1); // cbRgnData
if(!torev){
- limit = pEmr->emr.nSize;
- }
- // This one is a pain since each RGNDATA may be a different size, so it isn't possible to index through them.
- char *prd = (char *) &(pEmr->RgnData);
- while(roff + 28 < limit){ // up to the end of the record
- if(torev){
- nextroff += (((PU_RGNDATA)prd)->rdh.dwSize + ((PU_RGNDATA)prd)->rdh.nRgnSize - 16);
- rgndata_swap((PU_RGNDATA) (prd + roff));
- roff = nextroff;
- }
- else {
- rgndata_swap((PU_RGNDATA) (prd + roff));
- roff += (((PU_RGNDATA)prd)->rdh.dwSize + ((PU_RGNDATA)prd)->rdh.nRgnSize - 16);
- }
+ cbRgnData= pEmr->cbRgnData;
+ blimit = record + pEmr->emr.nSize;
}
+ if(IS_MEM_UNSAFE(pEmr->RgnData, cbRgnData, blimit))return(0);
+ return(rgndata_swap(pEmr->RgnData, cbRgnData, torev));
}
// common code for U_EMRCREATEMONOBRUSH_swap and U_EMRCREATEDIBPATTERNBRUSHPT_swap,
-void core12_swap(char *record, int torev){
+int core12_swap(char *record, int torev){
+ const char *blimit = NULL;
+ U_OFFBMI offBmi = 0;
+ U_CBBMI cbBmi = 0;
+ U_OFFBITS offBits = 0;
+ U_CBBITS cbBits = 0;
+ uint32_t iUsage = 0;
PU_EMRCREATEMONOBRUSH pEmr = (PU_EMRCREATEMONOBRUSH) (record);
- if(torev && pEmr->cbBmi){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmi)); // Bmi
- }
- core5_swap(record, torev);
+ if(torev){
+ offBmi = pEmr->offBmi;
+ cbBmi = pEmr->cbBmi;
+ offBits = pEmr->offBits;
+ cbBits = pEmr->cbBits;
+ iUsage = pEmr->iUsage;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsage, offBmi, cbBmi, offBits, cbBits, blimit, torev))return(0);
+ }
+ if(!core5_swap(record, torev))return(0);
U_swap4(&(pEmr->ihBrush),6); // ihBrush iUsage offBmi cbBmi offBits cbBits
- // ordered bytes: bitmap (including 16 bit 5bit/channel color mode, which is done bytewise).
- if(!torev && pEmr->cbBmi){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmi)); // Bmi
+ if(!torev){
+ offBmi = pEmr->offBmi;
+ cbBmi = pEmr->cbBmi;
+ offBits = pEmr->offBits;
+ cbBits = pEmr->cbBits;
+ iUsage = pEmr->iUsage;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsage, offBmi, cbBmi, offBits, cbBits, blimit, torev))return(0);
}
+ // ordered bytes: bitmap (including 16 bit 5bit/channel color mode, which is done bytewise).
+ return(1);
}
// common code for U_EMRALPHABLEND_swap and U_EMRTRANSPARENTBLT_swap,
-void core13_swap(char *record, int torev){
+int core13_swap(char *record, int torev){
+ const char *blimit = NULL;
+ U_OFFBMISRC offBmiSrc = 0;
+ U_CBBMISRC cbBmiSrc = 0;
+ U_OFFBITSSRC offBitsSrc = 0;
+ U_CBBITSSRC cbBitsSrc = 0;
+ uint32_t iUsageSrc = 0;
PU_EMRALPHABLEND pEmr = (PU_EMRALPHABLEND) (record);
- if(torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
- }
- core5_swap(record, torev);
+ if(torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
+ }
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
pointl_swap(&(pEmr->Dest),2); // Dest cDest
pointl_swap(&(pEmr->Dest),2); // Dest cDest
@@ -608,15 +755,25 @@ void core13_swap(char *record, int torev){
xform_swap( &(pEmr->xformSrc)); // xformSrc
// ordered bytes: crBkColorSrc
U_swap4(&(pEmr->iUsageSrc),5); // iUsageSrc offBmiSrc cbBmiSrc offBitsSrc cbBitsSrc
- // ordered bytes: bitmap (including 16 bit 5bit/channel color mode, which is done bytewise).
- if(!torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
+ if(!torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
}
+ // ordered bytes: bitmap (including 16 bit 5bit/channel color mode, which is done bytewise).
+ return(1);
}
/* **********************************************************************************************
-These are the core EMR functions, each creates a particular type of record.
-All return these records via a char* pointer, which is NULL if the call failed.
+These are the core EMR_swap functions, each converts a particular type of record.
+All operate in place on the chunk of memory holding that record.
+Some of these have offsets or counts which, if corrupt or evil would result in access outside
+ the record. These cases return a status value of 0 if that happens, 1 on success. Other
+ records which do not have these issues do not return a status value.
They are listed in order by the corresponding U_EMR_* index number.
*********************************************************************************************** */
@@ -626,37 +783,31 @@ They are listed in order by the corresponding U_EMR_* index number.
\param record pointer to a buffer holding the EMR record
\param torev 1 for native to reversed, 0 for reversed to native
*/
-void U_EMRNOTIMPLEMENTED_swap(char *record, int torev){
- core5_swap(record, torev);
- printf("WARNING: could not convert data in record type that has not been implemented!\n");
+int U_EMRNOTIMPLEMENTED_swap(char *record, int torev){
+ fprintf(stderr,"EMF WARNING: could not swap data bytes on record because that type has not been implemented!\n");
+ return(core5_swap(record, torev));
}
// U_EMRHEADER 1
-void U_EMRHEADER_swap(char *record, int torev){
+int U_EMRHEADER_swap(char *record, int torev){
int nDesc,offDesc,nSize,cbPix,offPix;
+ nDesc = offDesc = nSize = cbPix = offPix = 0;
PU_EMRHEADER pEmr = (PU_EMRHEADER)(record);
if(torev){
nSize = pEmr->emr.nSize;
- core5_swap(record, torev);
- }
- else {
- core5_swap(record, torev);
- nSize = pEmr->emr.nSize;
+ nDesc = pEmr->nDescription;
+ offDesc = pEmr->offDescription;
}
-
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),2); // rclBounds rclFrame
U_swap4(&(pEmr->dSignature), 4); // dSignature nVersion nBytes nRecords
U_swap2(&(pEmr->nHandles), 2); // nHandlessReserved
- if(torev){
- nDesc = pEmr->nDescription;
- offDesc = pEmr->offDescription;
- U_swap4(&(pEmr->nDescription), 3); // nDescription offDescription nPalEntries
- }
- else {
- U_swap4(&(pEmr->nDescription), 3); // nDescription offDescription nPalEntries
- nDesc = pEmr->nDescription;
- offDesc = pEmr->offDescription;
- }
+ U_swap4(&(pEmr->nDescription), 3); // nDescription offDescription nPalEntries
+ if(!torev){
+ nSize = pEmr->emr.nSize;
+ nDesc = pEmr->nDescription;
+ offDesc = pEmr->offDescription;
+ }
// UTF16-LE Description
sizel_swap(&(pEmr->szlDevice), 2); // szlDevice szlMillimeters
if((nDesc && (offDesc >= 100)) ||
@@ -665,16 +816,14 @@ void U_EMRHEADER_swap(char *record, int torev){
if(torev){
cbPix = pEmr->cbPixelFormat;
offPix = pEmr->offPixelFormat;
- if(cbPix)pixelformatdescriptor_swap( (PU_PIXELFORMATDESCRIPTOR) (record + pEmr->offPixelFormat));
- U_swap4(&(pEmr->cbPixelFormat), 2); // cbPixelFormat offPixelFormat
}
- else {
- U_swap4(&(pEmr->cbPixelFormat), 2); // cbPixelFormat offPixelFormat
+ U_swap4(&(pEmr->cbPixelFormat), 2); // cbPixelFormat offPixelFormat
+ U_swap4(&(pEmr->bOpenGL), 1); // bOpenGL
+ if(!torev){
cbPix = pEmr->cbPixelFormat;
offPix = pEmr->offPixelFormat;
- if(cbPix)pixelformatdescriptor_swap( (PU_PIXELFORMATDESCRIPTOR) (record + pEmr->offPixelFormat));
}
- U_swap4(&(pEmr->bOpenGL), 1); // bOpenGL
+ if(cbPix)pixelformatdescriptor_swap( (PU_PIXELFORMATDESCRIPTOR) (record + pEmr->offPixelFormat));
if((nDesc && (offDesc >= 108)) ||
(cbPix && (offPix >=108)) ||
(!offDesc && !cbPix && nSize >= 108)
@@ -682,543 +831,557 @@ void U_EMRHEADER_swap(char *record, int torev){
sizel_swap(&(pEmr->szlMicrometers), 1); // szlMicrometers
}
}
+ return(1);
}
// U_EMRPOLYBEZIER 2
-void U_EMRPOLYBEZIER_swap(char *record, int torev){
- core1_swap(record, torev);
+int U_EMRPOLYBEZIER_swap(char *record, int torev){
+ return(core1_swap(record, torev));
}
// U_EMRPOLYGON 3
-void U_EMRPOLYGON_swap(char *record, int torev){
- core1_swap(record, torev);
+int U_EMRPOLYGON_swap(char *record, int torev){
+ return(core1_swap(record, torev));
}
// U_EMRPOLYLINE 4
-void U_EMRPOLYLINE_swap(char *record, int torev){
- core1_swap(record, torev);
+int U_EMRPOLYLINE_swap(char *record, int torev){
+ return(core1_swap(record, torev));
}
// U_EMRPOLYBEZIERTO 5
-void U_EMRPOLYBEZIERTO_swap(char *record, int torev){
- core1_swap(record, torev);
+int U_EMRPOLYBEZIERTO_swap(char *record, int torev){
+ return(core1_swap(record, torev));
}
// U_EMRPOLYLINETO 6
-void U_EMRPOLYLINETO_swap(char *record, int torev){
- core1_swap(record, torev);
+int U_EMRPOLYLINETO_swap(char *record, int torev){
+ return(core1_swap(record, torev));
}
// U_EMRPOLYPOLYLINE 7
-void U_EMRPOLYPOLYLINE_swap(char *record, int torev){
- core2_swap(record, torev);
+int U_EMRPOLYPOLYLINE_swap(char *record, int torev){
+ return(core2_swap(record, torev));
}
// U_EMRPOLYPOLYGON 8
-void U_EMRPOLYPOLYGON_swap(char *record, int torev){
- core2_swap(record, torev);
+int U_EMRPOLYPOLYGON_swap(char *record, int torev){
+ return(core2_swap(record, torev));
}
// U_EMRSETWINDOWEXTEX 9
-void U_EMRSETWINDOWEXTEX_swap(char *record, int torev){
- core7_swap(record, torev);
+int U_EMRSETWINDOWEXTEX_swap(char *record, int torev){
+ return(core7_swap(record, torev));
}
// U_EMRSETWINDOWORGEX 10
-void U_EMRSETWINDOWORGEX_swap(char *record, int torev){
- core7_swap(record, torev);
+int U_EMRSETWINDOWORGEX_swap(char *record, int torev){
+ return(core7_swap(record, torev));
}
// U_EMRSETVIEWPORTEXTEX 11
-void U_EMRSETVIEWPORTEXTEX_swap(char *record, int torev){
- core7_swap(record, torev);
+int U_EMRSETVIEWPORTEXTEX_swap(char *record, int torev){
+ return(core7_swap(record, torev));
}
// U_EMRSETVIEWPORTORGEX 12
-void U_EMRSETVIEWPORTORGEX_swap(char *record, int torev){
- core7_swap(record, torev);
+int U_EMRSETVIEWPORTORGEX_swap(char *record, int torev){
+ return(core7_swap(record, torev));
}
// U_EMRSETBRUSHORGEX 13
-void U_EMRSETBRUSHORGEX_swap(char *record, int torev){
- core7_swap(record, torev);
+int U_EMRSETBRUSHORGEX_swap(char *record, int torev){
+ return(core7_swap(record, torev));
}
// U_EMREOF 14
-void U_EMREOF_swap(char *record, int torev){
+int U_EMREOF_swap(char *record, int torev){
int off=0;
int cbPalEntries=0;
- core5_swap(record, torev);
+ const char *blimit = NULL;
PU_EMREOF pEmr = (PU_EMREOF)(record);
if(torev){
+ blimit = record + pEmr->emr.nSize;
cbPalEntries = pEmr->cbPalEntries;
- if(cbPalEntries){
- logpalette_swap( (PU_LOGPALETTE)(record + pEmr->offPalEntries));
- }
}
+ if(!core5_swap(record, torev))return(0);
U_swap4(&(pEmr->cbPalEntries),2); // cbPalEntries offPalEntries
if(!torev){
+ blimit = record + pEmr->emr.nSize;
cbPalEntries = pEmr->cbPalEntries;
- if(cbPalEntries){
- logpalette_swap( (PU_LOGPALETTE)(record + pEmr->offPalEntries));
- }
+ }
+ if(cbPalEntries){
+ if(IS_MEM_UNSAFE(record, pEmr->offPalEntries + 2*2, blimit))return(0); // 2 16 bit values in U_LOGPALLETE
+ logpalette_swap( (PU_LOGPALETTE)(record + pEmr->offPalEntries));
+ // U_LOGPLTNTRY values in pallette are ordered data
}
off = sizeof(U_EMREOF) + 4 * cbPalEntries;
+ if(IS_MEM_UNSAFE(record, off + 4, blimit))return(0);
U_swap4(record + off,1); // nSizeLast
+ return(1);
}
// U_EMRSETPIXELV 15
-void U_EMRSETPIXELV_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRSETPIXELV_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRSETPIXELV pEmr = (PU_EMRSETPIXELV)(record);
pointl_swap(&(pEmr->ptlPixel),1); // ptlPixel
// ordered bytes: crColor
+ return(1);
}
// U_EMRSETMAPPERFLAGS 16
-void U_EMRSETMAPPERFLAGS_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRSETMAPPERFLAGS_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRSETMAPPERFLAGS pEmr = (PU_EMRSETMAPPERFLAGS)(record);
U_swap4(&(pEmr->dwFlags),1); // dwFlags
+ return(1);
}
// U_EMRSETMAPMODE 17
-void U_EMRSETMAPMODE_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRSETMAPMODE_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRSETBKMODE 18
-void U_EMRSETBKMODE_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRSETBKMODE_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRSETPOLYFILLMODE 19
-void U_EMRSETPOLYFILLMODE_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRSETPOLYFILLMODE_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRSETROP2 20
-void U_EMRSETROP2_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRSETROP2_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRSETSTRETCHBLTMODE 21
-void U_EMRSETSTRETCHBLTMODE_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRSETSTRETCHBLTMODE_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRSETTEXTALIGN 22
-void U_EMRSETTEXTALIGN_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRSETTEXTALIGN_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRSETCOLORADJUSTMENT 23
-void U_EMRSETCOLORADJUSTMENT_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRSETCOLORADJUSTMENT_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRSETCOLORADJUSTMENT pEmr = (PU_EMRSETCOLORADJUSTMENT)(record);
coloradjustment_swap(&(pEmr->ColorAdjustment));
+ return(1);
}
// U_EMRSETTEXTCOLOR 24
-void U_EMRSETTEXTCOLOR_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRSETTEXTCOLOR_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
// ordered bytes: crColor
+ return(1);
}
// U_EMRSETBKCOLOR 25
-void U_EMRSETBKCOLOR_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRSETBKCOLOR_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
// ordered bytes: crColor
+ return(1);
}
// U_EMROFFSETCLIPRGN 26
-void U_EMROFFSETCLIPRGN_swap(char *record, int torev){
- core7_swap(record, torev);
+int U_EMROFFSETCLIPRGN_swap(char *record, int torev){
+ return(core7_swap(record, torev));
}
// U_EMRMOVETOEX 27
-void U_EMRMOVETOEX_swap(char *record, int torev){
- core7_swap(record, torev);
+int U_EMRMOVETOEX_swap(char *record, int torev){
+ return(core7_swap(record, torev));
}
// U_EMRSETMETARGN 28
-void U_EMRSETMETARGN_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRSETMETARGN_swap(char *record, int torev){
+ return(core5_swap(record, torev));
}
// U_EMREXCLUDECLIPRECT 29
-void U_EMREXCLUDECLIPRECT_swap(char *record, int torev){
- core4_swap(record, torev);
+int U_EMREXCLUDECLIPRECT_swap(char *record, int torev){
+ return(core4_swap(record, torev));
}
// U_EMRINTERSECTCLIPRECT 30
-void U_EMRINTERSECTCLIPRECT_swap(char *record, int torev){
- core4_swap(record, torev);
+int U_EMRINTERSECTCLIPRECT_swap(char *record, int torev){
+ return(core4_swap(record, torev));
}
// U_EMRSCALEVIEWPORTEXTEX 31
-void U_EMRSCALEVIEWPORTEXTEX_swap(char *record, int torev){
- core4_swap(record, torev);
+int U_EMRSCALEVIEWPORTEXTEX_swap(char *record, int torev){
+ return(core4_swap(record, torev));
}
-
// U_EMRSCALEWINDOWEXTEX 32
-void U_EMRSCALEWINDOWEXTEX_swap(char *record, int torev){
- core4_swap(record, torev);
+int U_EMRSCALEWINDOWEXTEX_swap(char *record, int torev){
+ return(core4_swap(record, torev));
}
// U_EMRSAVEDC 33
-void U_EMRSAVEDC_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRSAVEDC_swap(char *record, int torev){
+ return(core5_swap(record, torev));
}
// U_EMRRESTOREDC 34
-void U_EMRRESTOREDC_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRRESTOREDC_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRSETWORLDTRANSFORM 35
-void U_EMRSETWORLDTRANSFORM_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRSETWORLDTRANSFORM_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRSETWORLDTRANSFORM pEmr = (PU_EMRSETWORLDTRANSFORM)(record);
xform_swap(&(pEmr->xform));
+ return(1);
}
// U_EMRMODIFYWORLDTRANSFORM 36
-void U_EMRMODIFYWORLDTRANSFORM_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRMODIFYWORLDTRANSFORM_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRMODIFYWORLDTRANSFORM pEmr = (PU_EMRMODIFYWORLDTRANSFORM)(record);
xform_swap(&(pEmr->xform)); // xform
U_swap4(&(pEmr->iMode),1); // iMode
+ return(1);
}
// U_EMRSELECTOBJECT 37
-void U_EMRSELECTOBJECT_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRSELECTOBJECT_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRSELECTOBJECT pEmr = (PU_EMRSELECTOBJECT)(record);
U_swap4(&(pEmr->ihObject),1); // ihObject
+ return(1);
}
// U_EMRCREATEPEN 38
-void U_EMRCREATEPEN_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRCREATEPEN_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRCREATEPEN pEmr = (PU_EMRCREATEPEN)(record);
U_swap4(&(pEmr->ihPen),1); // ihPen
logpen_swap(&(pEmr->lopn)); // lopn
+ return(1);
}
// U_EMRCREATEBRUSHINDIRECT 39
-void U_EMRCREATEBRUSHINDIRECT_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRCREATEBRUSHINDIRECT_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRCREATEBRUSHINDIRECT pEmr = (PU_EMRCREATEBRUSHINDIRECT)(record);
U_swap4(&(pEmr->ihBrush),1); // ihBrush
logbrush_swap(&(pEmr->lb)); // lb
+ return(1);
}
// U_EMRDELETEOBJECT 40
-void U_EMRDELETEOBJECT_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRDELETEOBJECT_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRDELETEOBJECT pEmr = (PU_EMRDELETEOBJECT)(record);
U_swap4(&(pEmr->ihObject),1); // ihObject
+ return(1);
}
// U_EMRANGLEARC 41
-void U_EMRANGLEARC_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRANGLEARC_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRANGLEARC pEmr = (PU_EMRANGLEARC)(record);
pointl_swap(&(pEmr->ptlCenter),1); // ptlCenter
U_swap4(&(pEmr->nRadius),3); // nRadius eStartAngle eSweepAngle
+ return(1);
}
// U_EMRELLIPSE 42
-void U_EMRELLIPSE_swap(char *record, int torev){
- core4_swap(record, torev);
+int U_EMRELLIPSE_swap(char *record, int torev){
+ return(core4_swap(record, torev));
}
// U_EMRRECTANGLE 43
-void U_EMRRECTANGLE_swap(char *record, int torev){
- core4_swap(record, torev);
+int U_EMRRECTANGLE_swap(char *record, int torev){
+ return(core4_swap(record, torev));
}
// U_EMRROUNDRECT 44
-void U_EMRROUNDRECT_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRROUNDRECT_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRROUNDRECT pEmr = (PU_EMRROUNDRECT)(record);
rectl_swap(&(pEmr->rclBox),1); // rclBox
sizel_swap(&(pEmr->szlCorner), 1); // szlCorner
+ return(1);
}
// U_EMRARC 45
-void U_EMRARC_swap(char *record, int torev){
- core9_swap(record, torev);
+int U_EMRARC_swap(char *record, int torev){
+ return(core9_swap(record, torev));
}
// U_EMRCHORD 46
-void U_EMRCHORD_swap(char *record, int torev){
- core9_swap(record, torev);
+int U_EMRCHORD_swap(char *record, int torev){
+ return(core9_swap(record, torev));
}
// U_EMRPIE 47
-void U_EMRPIE_swap(char *record, int torev){
- core9_swap(record, torev);
+int U_EMRPIE_swap(char *record, int torev){
+ return(core9_swap(record, torev));
}
// U_EMRSELECTPALETTE 48
-void U_EMRSELECTPALETTE_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRSELECTPALETTE_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRCREATEPALETTE 49
-void U_EMRCREATEPALETTE_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRCREATEPALETTE_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRCREATEPALETTE pEmr = (PU_EMRCREATEPALETTE)(record);
U_swap4(&(pEmr->ihPal),1); // ihPal
logpalette_swap( (PU_LOGPALETTE)&(pEmr->lgpl) ); // lgpl
+ return(1);
}
// U_EMRSETPALETTEENTRIES 50
-void U_EMRSETPALETTEENTRIES_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRSETPALETTEENTRIES_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRSETPALETTEENTRIES pEmr = (PU_EMRSETPALETTEENTRIES)(record);
U_swap4(&(pEmr->ihPal),3); // ihPal iStart cEntries
// ordered bytes: aPalEntries[]
+ return(1);
}
// U_EMRRESIZEPALETTE 51
-void U_EMRRESIZEPALETTE_swap(char *record, int torev){
- core7_swap(record, torev);
+int U_EMRRESIZEPALETTE_swap(char *record, int torev){
+ return(core7_swap(record, torev));
}
// U_EMRREALIZEPALETTE 52
-void U_EMRREALIZEPALETTE_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRREALIZEPALETTE_swap(char *record, int torev){
+ return(core5_swap(record, torev));
}
// U_EMREXTFLOODFILL 53
-void U_EMREXTFLOODFILL_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMREXTFLOODFILL_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMREXTFLOODFILL pEmr = (PU_EMREXTFLOODFILL)(record);
pointl_swap(&(pEmr->ptlStart),1); // ptlStart
// ordered bytes: crColor
U_swap4(&(pEmr->iMode),1); // iMode
+ return(1);
}
// U_EMRLINETO 54
-void U_EMRLINETO_swap(char *record, int torev){
- core7_swap(record, torev);
+int U_EMRLINETO_swap(char *record, int torev){
+ return(core7_swap(record, torev));
}
// U_EMRARCTO 55
-void U_EMRARCTO_swap(char *record, int torev){
- core9_swap(record, torev);
+int U_EMRARCTO_swap(char *record, int torev){
+ return(core9_swap(record, torev));
}
// U_EMRPOLYDRAW 56
-void U_EMRPOLYDRAW_swap(char *record, int torev){
+int U_EMRPOLYDRAW_swap(char *record, int torev){
int count=0;
- core5_swap(record, torev);
+ const char *blimit = NULL;
PU_EMRPOLYDRAW pEmr = (PU_EMRPOLYDRAW)(record);
if(torev){
count = pEmr->cptl;
+ blimit = record + pEmr->emr.nSize;
}
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
U_swap4(&(pEmr->cptl),1); // cptl
if(!torev){
count = pEmr->cptl;
+ blimit = record + pEmr->emr.nSize;
}
+ if(IS_MEM_UNSAFE((pEmr->aptl), count*sizeof(U_POINTL), blimit))return(0);
pointl_swap(pEmr->aptl,count); // aptl[]
- U_swap4(pEmr->abTypes,count); // abTypes[]
+ // single byte data abTypes
+ return(1);
}
// U_EMRSETARCDIRECTION 57
-void U_EMRSETARCDIRECTION_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRSETARCDIRECTION_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRSETMITERLIMIT 58
-void U_EMRSETMITERLIMIT_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRSETMITERLIMIT_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRBEGINPATH 59
-void U_EMRBEGINPATH_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRBEGINPATH_swap(char *record, int torev){
+ return(core5_swap(record, torev));
}
// U_EMRENDPATH 60
-void U_EMRENDPATH_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRENDPATH_swap(char *record, int torev){
+ return(core5_swap(record, torev));
}
// U_EMRCLOSEFIGURE 61
-void U_EMRCLOSEFIGURE_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRCLOSEFIGURE_swap(char *record, int torev){
+ return(core5_swap(record, torev));
}
// U_EMRFILLPATH 62
-void U_EMRFILLPATH_swap(char *record, int torev){
- core4_swap(record, torev);
+int U_EMRFILLPATH_swap(char *record, int torev){
+ return(core4_swap(record, torev));
}
// U_EMRSTROKEANDFILLPATH 63
-void U_EMRSTROKEANDFILLPATH_swap(char *record, int torev){
- core4_swap(record, torev);
+int U_EMRSTROKEANDFILLPATH_swap(char *record, int torev){
+ return(core4_swap(record, torev));
}
// U_EMRSTROKEPATH 64
-void U_EMRSTROKEPATH_swap(char *record, int torev){
- core4_swap(record, torev);
+int U_EMRSTROKEPATH_swap(char *record, int torev){
+ return(core4_swap(record, torev));
}
// U_EMRFLATTENPATH 65
-void U_EMRFLATTENPATH_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRFLATTENPATH_swap(char *record, int torev){
+ return(core5_swap(record, torev));
}
// U_EMRWIDENPATH 66
-void U_EMRWIDENPATH_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRWIDENPATH_swap(char *record, int torev){
+ return(core5_swap(record, torev));
}
// U_EMRSELECTCLIPPATH 67
-void U_EMRSELECTCLIPPATH_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRSELECTCLIPPATH_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRABORTPATH 68
-void U_EMRABORTPATH_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRABORTPATH_swap(char *record, int torev){
+ return(core5_swap(record, torev));
}
// U_EMRUNDEF69 69
#define U_EMRUNDEF69_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented.
// U_EMRCOMMENT 70 Comment (any binary data, interpretation is program specific)
-void U_EMRCOMMENT_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRCOMMENT_swap(char *record, int torev){
+ int cbData = 0;
+ const char *blimit = NULL;
PU_EMRCOMMENT pEmr = (PU_EMRCOMMENT)(record);
+ if(torev){
+ cbData = pEmr->cbData;
+ blimit = record + pEmr->emr.nSize;
+ }
+ if(!core5_swap(record, torev))return(0);
U_swap4(&(pEmr->cbData),1); // cbData
+ if(!torev){
+ cbData = pEmr->cbData;
+ blimit = record + pEmr->emr.nSize;
+ }
+ if(IS_MEM_UNSAFE(record, cbData + sizeof(U_SIZE_EMRCOMMENT), blimit))return(0);
// program specific data, presumably byte ordered, otherwise, not portable
+ return(1);
}
// U_EMRFILLRGN 71
-void U_EMRFILLRGN_swap(char *record, int torev){
- int roff=0;
- int nextroff=0;
- int limit=0;
- roff=0;
+int U_EMRFILLRGN_swap(char *record, int torev){
+ int cbRgnData=0;
+ const char *blimit = NULL;
PU_EMRFILLRGN pEmr = (PU_EMRFILLRGN)(record);
if(torev){
- limit = pEmr->emr.nSize;
- nextroff = 0;
- }
- core5_swap(record, torev);
- if(!torev){
- limit = pEmr->emr.nSize;
+ cbRgnData= pEmr->cbRgnData;
+ blimit = record + pEmr->emr.nSize;
}
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
U_swap4(&(pEmr->cbRgnData),2); // cbRgnData ihBrush
- // This one is a pain since each RGNDATA may be a different size, so it isn't possible to index through them.
- char *prd = (char *) &(pEmr->RgnData);
- while(roff + 28 < limit){ // up to the end of the record
- if(torev){
- nextroff += (((PU_RGNDATA)prd)->rdh.dwSize + ((PU_RGNDATA)prd)->rdh.nRgnSize - 16);
- rgndata_swap((PU_RGNDATA) (prd + roff));
- roff = nextroff;
- }
- else {
- rgndata_swap((PU_RGNDATA) (prd + roff));
- roff += (((PU_RGNDATA)prd)->rdh.dwSize + ((PU_RGNDATA)prd)->rdh.nRgnSize - 16);
- }
+ if(!torev){
+ cbRgnData= pEmr->cbRgnData;
+ blimit = record + pEmr->emr.nSize;
}
+ if(IS_MEM_UNSAFE(pEmr->RgnData, cbRgnData, blimit))return(0);
+ return(rgndata_swap(pEmr->RgnData, cbRgnData, torev));
}
// U_EMRFRAMERGN 72
-void U_EMRFRAMERGN_swap(char *record, int torev){
- int roff=0;
- int nextroff=0;
- int limit=0;
+int U_EMRFRAMERGN_swap(char *record, int torev){
+ int cbRgnData=0;
+ const char *blimit = NULL;
PU_EMRFRAMERGN pEmr = (PU_EMRFRAMERGN)(record);
- roff = 0;
if(torev){
- limit = pEmr->emr.nSize;
- nextroff = 0;
- }
- core5_swap(record, torev);
- if(!torev){
- limit = pEmr->emr.nSize;
+ cbRgnData= pEmr->cbRgnData;
+ blimit = record + pEmr->emr.nSize;
}
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
U_swap4(&(pEmr->cbRgnData),2); // cbRgnData ihBrush
- sizel_swap(&(pEmr->szlStroke), 2); // szlStroke
- // This one is a pain since each RGNDATA may be a different size, so it isn't possible to index through them.
- char *prd = (char *) &(pEmr->RgnData);
- while(roff + 28 < limit){ // up to the end of the record
- if(torev){
- nextroff += (((PU_RGNDATA)prd)->rdh.dwSize + ((PU_RGNDATA)prd)->rdh.nRgnSize - 16);
- rgndata_swap((PU_RGNDATA) (prd + roff));
- roff = nextroff;
- }
- else {
- rgndata_swap((PU_RGNDATA) (prd + roff));
- roff += (((PU_RGNDATA)prd)->rdh.dwSize + ((PU_RGNDATA)prd)->rdh.nRgnSize - 16);
- }
+ sizel_swap(&(pEmr->szlStroke), 1); // szlStroke
+ if(!torev){
+ cbRgnData= pEmr->cbRgnData;
+ blimit = record + pEmr->emr.nSize;
}
+ if(IS_MEM_UNSAFE(pEmr->RgnData, cbRgnData, blimit))return(0);
+ return(rgndata_swap(pEmr->RgnData, cbRgnData, torev));
}
// U_EMRINVERTRGN 73
-void U_EMRINVERTRGN_swap(char *record, int torev){
- core11_swap(record, torev);
+int U_EMRINVERTRGN_swap(char *record, int torev){
+ return(core11_swap(record, torev));
}
// U_EMRPAINTRGN 74
-void U_EMRPAINTRGN_swap(char *record, int torev){
- core11_swap(record, torev);
+int U_EMRPAINTRGN_swap(char *record, int torev){
+ return(core11_swap(record, torev));
}
// U_EMREXTSELECTCLIPRGN 75
-void U_EMREXTSELECTCLIPRGN_swap(char *record, int torev){
- int roff=0;
- int nextroff=0;
- int limit=0;
- PU_EMREXTSELECTCLIPRGN pEmr = (PU_EMREXTSELECTCLIPRGN) (record);
+int U_EMREXTSELECTCLIPRGN_swap(char *record, int torev){
+ int cbRgnData=0;
+ const char *blimit = NULL;
+ PU_EMREXTSELECTCLIPRGN pEmr = (PU_EMREXTSELECTCLIPRGN)(record);
if(torev){
- limit = pEmr->emr.nSize;
- }
- core5_swap(record, torev);
- if(!torev){
- limit = pEmr->emr.nSize;
+ cbRgnData= pEmr->cbRgnData;
+ blimit = record + pEmr->emr.nSize;
}
+ if(!core5_swap(record, torev))return(0);
U_swap4(&(pEmr->cbRgnData),2); // cbRgnData iMode
- // This one is a pain since each RGNDATA may be a different size, so it isn't possible to index through them.
- char *prd = (char *) &(pEmr->RgnData);
- nextroff = roff = 0;
- while(roff + 16 < limit){ // up to the end of the record
- if(torev){
- nextroff += (((PU_RGNDATA)prd)->rdh.dwSize + ((PU_RGNDATA)prd)->rdh.nRgnSize - 16);
- rgndata_swap((PU_RGNDATA) (prd + roff));
- roff = nextroff;
- }
- else {
- rgndata_swap((PU_RGNDATA) (prd + roff));
- roff += (((PU_RGNDATA)prd)->rdh.dwSize + ((PU_RGNDATA)prd)->rdh.nRgnSize - 16);
- }
+ if(!torev){
+ cbRgnData= pEmr->cbRgnData;
+ blimit = record + pEmr->emr.nSize;
}
+ if(IS_MEM_UNSAFE(pEmr->RgnData, cbRgnData, blimit))return(0);
+ return(rgndata_swap(pEmr->RgnData, cbRgnData, torev));
}
// U_EMRBITBLT 76
-void U_EMRBITBLT_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRBITBLT_swap(char *record, int torev){
+ const char *blimit = NULL;
+ U_OFFBMISRC offBmiSrc = 0;
+ U_CBBMISRC cbBmiSrc = 0;
+ U_OFFBITSSRC offBitsSrc = 0;
+ U_CBBITSSRC cbBitsSrc = 0;
+ uint32_t iUsageSrc = 0;
PU_EMRBITBLT pEmr = (PU_EMRBITBLT) (record);
- if(torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
- }
+ if(torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
+ }
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
pointl_swap(&(pEmr->Dest),2); // Dest cDest
U_swap4(&(pEmr->dwRop),1); // dwRop
@@ -1226,42 +1389,89 @@ void U_EMRBITBLT_swap(char *record, int torev){
xform_swap(&(pEmr->xformSrc)); // xformSrc
// ordered bytes: crBkColorSrc
U_swap4(&(pEmr->iUsageSrc),5); // iUsageSrc offBmiSrc cbBmiSrc offBitsSrc cbBitsSrc
- // ordered bytes: bitmap (including 16 bit 5bit/channel color mode, which is done bytewise).
- if(!torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
+ if(!torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
}
+ // ordered bytes: bitmap (including 16 bit 5bit/channel color mode, which is done bytewise).
+ return(1);
}
// U_EMRSTRETCHBLT 77
-void U_EMRSTRETCHBLT_swap(char *record, int torev){
+int U_EMRSTRETCHBLT_swap(char *record, int torev){
+ const char *blimit = NULL;
+ U_OFFBMISRC offBmiSrc = 0;
+ U_CBBMISRC cbBmiSrc = 0;
+ U_OFFBITSSRC offBitsSrc = 0;
+ U_CBBITSSRC cbBitsSrc = 0;
+ uint32_t iUsageSrc = 0;
PU_EMRSTRETCHBLT pEmr = (PU_EMRSTRETCHBLT) (record);
- core5_swap(record, torev);
+ if(torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
+ }
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
pointl_swap(&(pEmr->Dest),2); // Dest cDest
U_swap4(&(pEmr->dwRop),1); // dwRop
pointl_swap(&(pEmr->Src),1); // Src
xform_swap(&(pEmr->xformSrc)); // xformSrc
// ordered bytes: crBkColorSrc
- if(torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
- }
U_swap4(&(pEmr->iUsageSrc),5); // iUsageSrc offBmiSrc cbBmiSrc offBitsSrc cbBitsSrc
pointl_swap(&(pEmr->cSrc),1); // cSrc
- if(!torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
+ if(!torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
}
+ // ordered bytes: bitmap (including 16 bit 5bit/channel color mode, which is done bytewise).
+ return(1);
}
// U_EMRMASKBLT 78
-void U_EMRMASKBLT_swap(char *record, int torev){
+int U_EMRMASKBLT_swap(char *record, int torev){
+ const char *blimit = NULL;
+ U_OFFBMISRC offBmiSrc = 0;
+ U_CBBMISRC cbBmiSrc = 0;
+ U_OFFBITSSRC offBitsSrc = 0;
+ U_CBBITSSRC cbBitsSrc = 0;
+ uint32_t iUsageSrc = 0;
+ U_OFFBMIMSK offBmiMask = 0;
+ U_CBBMIMSK cbBmiMask = 0;
+ U_OFFBITSMSK offBitsMask = 0;
+ U_CBBITSMSK cbBitsMask = 0;
+ uint32_t iUsageMask = 0;
PU_EMRMASKBLT pEmr = (PU_EMRMASKBLT) (record);
- core5_swap(record, torev);
- if(torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
- }
- if(torev && pEmr->cbBmiMask){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiMask));
- }
+ if(torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ offBmiMask = pEmr->offBmiMask;
+ cbBmiMask = pEmr->cbBmiMask;
+ offBitsMask = pEmr->offBitsMask;
+ cbBitsMask = pEmr->cbBitsMask;
+ iUsageMask = pEmr->iUsageMask;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
+ if(!DIB_swap(record, iUsageMask, offBmiMask, cbBmiMask, offBitsMask, cbBitsMask, blimit, torev))return(0);
+ }
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
pointl_swap(&(pEmr->Dest),2); // Dest cDest
U_swap4(&(pEmr->dwRop),1); // dwRop
@@ -1271,24 +1481,54 @@ void U_EMRMASKBLT_swap(char *record, int torev){
U_swap4(&(pEmr->iUsageSrc),5); // iUsageSrc offBmiSrc cbBmiSrc offBitsSrc cbBitsSrc
pointl_swap(&(pEmr->Mask),1); // Mask
U_swap4(&(pEmr->iUsageMask),5); // iUsageMask offBmiMask cbBmiMask offBitsMask cbBitsMask
- if(!torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
- }
- if(!torev && pEmr->cbBmiMask){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiMask));
- }
+ if(!torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ offBmiMask = pEmr->offBmiMask;
+ cbBmiMask = pEmr->cbBmiMask;
+ offBitsMask = pEmr->offBitsMask;
+ cbBitsMask = pEmr->cbBitsMask;
+ iUsageMask = pEmr->iUsageMask;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
+ if(!DIB_swap(record, iUsageMask, offBmiMask, cbBmiMask, offBitsMask, cbBitsMask, blimit, torev))return(0);
+ }
+ return(1);
}
// U_EMRPLGBLT 79
-void U_EMRPLGBLT_swap(char *record, int torev){
+int U_EMRPLGBLT_swap(char *record, int torev){
+ const char *blimit = NULL;
+ U_OFFBMISRC offBmiSrc = 0;
+ U_CBBMISRC cbBmiSrc = 0;
+ U_OFFBITSSRC offBitsSrc = 0;
+ U_CBBITSSRC cbBitsSrc = 0;
+ uint32_t iUsageSrc = 0;
+ U_OFFBMIMSK offBmiMask = 0;
+ U_CBBMIMSK cbBmiMask = 0;
+ U_OFFBITSMSK offBitsMask = 0;
+ U_CBBITSMSK cbBitsMask = 0;
+ uint32_t iUsageMask = 0;
PU_EMRPLGBLT pEmr = (PU_EMRPLGBLT) (record);
- core5_swap(record, torev);
- if(torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
- }
- if(torev && pEmr->cbBmiMask){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiMask));
- }
+ if(torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ offBmiMask = pEmr->offBmiMask;
+ cbBmiMask = pEmr->cbBmiMask;
+ offBitsMask = pEmr->offBitsMask;
+ cbBitsMask = pEmr->cbBitsMask;
+ iUsageMask = pEmr->iUsageMask;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
+ if(!DIB_swap(record, iUsageMask, offBmiMask, cbBmiMask, offBitsMask, cbBitsMask, blimit, torev))return(0);
+ }
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
pointl_swap(pEmr->aptlDst,3); // aptlDst[]
pointl_swap(&(pEmr->Src),2); // Src cSrc
@@ -1297,78 +1537,124 @@ void U_EMRPLGBLT_swap(char *record, int torev){
U_swap4(&(pEmr->iUsageSrc),5); // iUsageSrc offBmiSrc cbBmiSrc offBitsSrc cbBitsSrc
pointl_swap(&(pEmr->Mask),1); // Mask
U_swap4(&(pEmr->iUsageMask),5); // iUsageMask offBmiMask cbBmiMask offBitsMask cbBitsMask
- if(!torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
- }
- if(!torev && pEmr->cbBmiMask){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiMask));
- }
+ if(!torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ offBmiMask = pEmr->offBmiMask;
+ cbBmiMask = pEmr->cbBmiMask;
+ offBitsMask = pEmr->offBitsMask;
+ cbBitsMask = pEmr->cbBitsMask;
+ iUsageMask = pEmr->iUsageMask;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
+ if(!DIB_swap(record, iUsageMask, offBmiMask, cbBmiMask, offBitsMask, cbBitsMask, blimit, torev))return(0);
+ }
+ return(1);
}
// U_EMRSETDIBITSTODEVICE 80
-void U_EMRSETDIBITSTODEVICE_swap(char *record, int torev){
+int U_EMRSETDIBITSTODEVICE_swap(char *record, int torev){
+ const char *blimit = NULL;
+ U_OFFBMISRC offBmiSrc = 0;
+ U_CBBMISRC cbBmiSrc = 0;
+ U_OFFBITSSRC offBitsSrc = 0;
+ U_CBBITSSRC cbBitsSrc = 0;
+ uint32_t iUsageSrc = 0;
PU_EMRSETDIBITSTODEVICE pEmr = (PU_EMRSETDIBITSTODEVICE) (record);
- core5_swap(record, torev);
- if(torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
- }
+ if(torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
+ }
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
pointl_swap(&(pEmr->Dest),1); // Dest
pointl_swap(&(pEmr->Src),2); // Src cSrc
U_swap4(&(pEmr->offBmiSrc),7); // offBmiSrc cbBmiSrc offBitsSrc cbBitsSrc iUsageSrc iStartScan cScans
- if(!torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
+ if(!torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
}
+ return(1);
}
// U_EMRSTRETCHDIBITS 81
-void U_EMRSTRETCHDIBITS_swap(char *record, int torev){
+int U_EMRSTRETCHDIBITS_swap(char *record, int torev){
+ const char *blimit = NULL;
+ U_OFFBMISRC offBmiSrc = 0;
+ U_CBBMISRC cbBmiSrc = 0;
+ U_OFFBITSSRC offBitsSrc = 0;
+ U_CBBITSSRC cbBitsSrc = 0;
+ uint32_t iUsageSrc = 0;
PU_EMRSTRETCHDIBITS pEmr = (PU_EMRSTRETCHDIBITS) (record);
- core5_swap(record, torev);
- if(torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
- }
+ if(torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
+ }
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
pointl_swap(&(pEmr->Dest),1); // Dest
pointl_swap(&(pEmr->Src),2); // Src cSrc
U_swap4(&(pEmr->offBmiSrc),6); // offBmiSrc cbBmiSrc offBitsSrc cbBitsSrc iUsageSrc dwRop
pointl_swap(&(pEmr->cDest),1); // cDest
- if(!torev && pEmr->cbBmiSrc){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmiSrc));
+ if(!torev){
+ offBmiSrc = pEmr->offBmiSrc;
+ cbBmiSrc = pEmr->cbBmiSrc;
+ offBitsSrc = pEmr->offBitsSrc;
+ cbBitsSrc = pEmr->cbBitsSrc;
+ iUsageSrc = pEmr->iUsageSrc;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit, torev))return(0);
}
+ return(1);
}
-// U_EMREXTCREATEFONTINDIRECTW_swap 82
-void U_EMREXTCREATEFONTINDIRECTW_swap(char *record, int torev){
+// U_EMREXTCREATEFONTINDIRECTW 82
+int U_EMREXTCREATEFONTINDIRECTW_swap(char *record, int torev){
+ int nSize = 0;
PU_EMREXTCREATEFONTINDIRECTW pEmr = (PU_EMREXTCREATEFONTINDIRECTW) (record);
if(torev){
- if(pEmr->emr.nSize == sizeof(U_EMREXTCREATEFONTINDIRECTW)){
- logfont_panose_swap(&(pEmr->elfw));
- }
- else {
- logfont_swap( (PU_LOGFONT) &(pEmr->elfw));
- }
+ nSize = pEmr->emr.nSize;
}
- core5_swap(record, torev);
+ if(!core5_swap(record, torev))return(0);
+ U_swap4(&(pEmr->ihFont),1); // ihFont
if(!torev){
- if(pEmr->emr.nSize == sizeof(U_EMREXTCREATEFONTINDIRECTW)){
- logfont_panose_swap(&(pEmr->elfw));
- }
- else {
- logfont_swap( (PU_LOGFONT) &(pEmr->elfw));
- }
+ nSize = pEmr->emr.nSize;
}
- U_swap4(&(pEmr->ihFont),1); // ihFont
+ if(nSize == U_SIZE_EMREXTCREATEFONTINDIRECTW_LOGFONT_PANOSE){
+ logfont_panose_swap(&(pEmr->elfw));
+ }
+ else { // logfont or logfontExDv (which starts with logfont, which can be swapped, and the rest is already in byte order
+ logfont_swap( (PU_LOGFONT) &(pEmr->elfw));
+ }
+ return(1);
}
// U_EMREXTTEXTOUTA 83
-void U_EMREXTTEXTOUTA_swap(char *record, int torev){
- core8_swap(record, torev);
+int U_EMREXTTEXTOUTA_swap(char *record, int torev){
+ return(core8_swap(record, torev));
}
// U_EMREXTTEXTOUTW 84
-void U_EMREXTTEXTOUTW_swap(char *record, int torev){
- core8_swap(record, torev);
+int U_EMREXTTEXTOUTW_swap(char *record, int torev){
+ return(core8_swap(record, torev));
}
// U_EMRPOLYBEZIER16 85
@@ -1376,23 +1662,23 @@ void U_EMREXTTEXTOUTW_swap(char *record, int torev){
\brief Convert a pointer to a U_EMR_POLYBEZIER16 record.
\param record pointer to a buffer holding the EMR record
*/
-void U_EMRPOLYBEZIER16_swap(char *record, int torev){
- core6_swap(record, torev);
+int U_EMRPOLYBEZIER16_swap(char *record, int torev){
+ return(core6_swap(record, torev));
}
// U_EMRPOLYGON16 86
-void U_EMRPOLYGON16_swap(char *record, int torev){
- core6_swap(record, torev);
+int U_EMRPOLYGON16_swap(char *record, int torev){
+ return(core6_swap(record, torev));
}
// U_EMRPOLYLINE16 87
-void U_EMRPOLYLINE16_swap(char *record, int torev){
- core6_swap(record, torev);
+int U_EMRPOLYLINE16_swap(char *record, int torev){
+ return(core6_swap(record, torev));
}
// U_EMRPOLYBEZIERTO16 88
-void U_EMRPOLYBEZIERTO16_swap(char *record, int torev){
- core6_swap(record, torev);
+int U_EMRPOLYBEZIERTO16_swap(char *record, int torev){
+ return(core6_swap(record, torev));
}
// U_EMRPOLYLINETO16 89
@@ -1400,61 +1686,81 @@ void U_EMRPOLYBEZIERTO16_swap(char *record, int torev){
\brief Convert a pointer to a U_EMR_POLYLINETO16 record.
\param record pointer to a buffer holding the EMR record
*/
-void U_EMRPOLYLINETO16_swap(char *record, int torev){
- core6_swap(record, torev);
+int U_EMRPOLYLINETO16_swap(char *record, int torev){
+ return(core6_swap(record, torev));
}
// U_EMRPOLYPOLYLINE16 90
-void U_EMRPOLYPOLYLINE16_swap(char *record, int torev){
- core10_swap(record, torev);
+int U_EMRPOLYPOLYLINE16_swap(char *record, int torev){
+ return(core10_swap(record, torev));
}
// U_EMRPOLYPOLYGON16 91
-void U_EMRPOLYPOLYGON16_swap(char *record, int torev){
- core10_swap(record, torev);
+int U_EMRPOLYPOLYGON16_swap(char *record, int torev){
+ return(core10_swap(record, torev));
}
// U_EMRPOLYDRAW16 92
-void U_EMRPOLYDRAW16_swap(char *record, int torev){
+int U_EMRPOLYDRAW16_swap(char *record, int torev){
int count=0;
- core5_swap(record, torev);
+ const char *blimit = NULL;
PU_EMRPOLYDRAW16 pEmr = (PU_EMRPOLYDRAW16)(record);
if(torev){
count = pEmr->cpts;
+ blimit = record + pEmr->emr.nSize;
}
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
U_swap4(&(pEmr->cpts),1); // cpts
if(!torev){
count = pEmr->cpts;
+ blimit = record + pEmr->emr.nSize;
}
+ if(IS_MEM_UNSAFE((pEmr->apts), count*sizeof(U_POINT16), blimit))return(0);
point16_swap(pEmr->apts,count); // apts[]
- U_swap4(pEmr->abTypes,count); // abTypes[]
+ // single byte data abTypes
+ return(1);
}
// U_EMRCREATEMONOBRUSH 93
-void U_EMRCREATEMONOBRUSH_swap(char *record, int torev){
- core12_swap(record, torev);
+int U_EMRCREATEMONOBRUSH_swap(char *record, int torev){
+ return(core12_swap(record, torev));
}
// U_EMRCREATEDIBPATTERNBRUSHPT_swap 94
-void U_EMRCREATEDIBPATTERNBRUSHPT_swap(char *record, int torev){
- core12_swap(record, torev);
+int U_EMRCREATEDIBPATTERNBRUSHPT_swap(char *record, int torev){
+ return(core12_swap(record, torev));
}
// U_EMREXTCREATEPEN 95
-void U_EMREXTCREATEPEN_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMREXTCREATEPEN_swap(char *record, int torev){
+ const char *blimit = NULL;
+ U_OFFBMI offBmi = 0;
+ U_CBBMI cbBmi = 0;
+ U_OFFBITS offBits = 0;
+ U_CBBITS cbBits = 0;
PU_EMREXTCREATEPEN pEmr = (PU_EMREXTCREATEPEN)(record);
- if(torev && pEmr->cbBmi){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmi));
- }
+ if(torev){
+ offBmi = pEmr->offBmi;
+ cbBmi = pEmr->cbBmi;
+ offBits = pEmr->offBits;
+ cbBits = pEmr->cbBits;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, U_DIB_RGB_COLORS, offBmi, cbBmi, offBits, cbBits, blimit, torev))return(0);
+ }
+ if(!core5_swap(record, torev))return(0);
U_swap4(&(pEmr->ihPen),5); // ihPen offBmi cbBmi offBits cbBits
- if(!torev && pEmr->cbBmi){
- bitmapinfo_swap((PU_BITMAPINFO)(record + pEmr->offBmi));
+ if(!torev){
+ offBmi = pEmr->offBmi;
+ cbBmi = pEmr->cbBmi;
+ offBits = pEmr->offBits;
+ cbBits = pEmr->cbBits;
+ blimit = record + pEmr->emr.nSize;
+ if(!DIB_swap(record, U_DIB_RGB_COLORS, offBmi, cbBmi, offBits, cbBits, blimit, torev))return(0);
}
- extlogpen_swap((PU_EXTLOGPEN) &(pEmr->elp), torev);
+ return(extlogpen_swap((PU_EXTLOGPEN) &(pEmr->elp), blimit, torev));
}
// U_EMRPOLYTEXTOUTA 96 NOT IMPLEMENTED, denigrated after Windows NT
@@ -1463,26 +1769,27 @@ void U_EMREXTCREATEPEN_swap(char *record, int torev){
#define U_EMRPOLYTEXTOUTW_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented.
// U_EMRSETICMMODE 98
-void U_EMRSETICMMODE_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRSETICMMODE_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRCREATECOLORSPACE 99
-void U_EMRCREATECOLORSPACE_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRCREATECOLORSPACE_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRCREATECOLORSPACE pEmr = (PU_EMRCREATECOLORSPACE)(record);
U_swap4(&(pEmr->ihCS),1); // ihCS
logcolorspacea_swap(&(pEmr->lcs)); // lcs
+ return(1);
}
// U_EMRSETCOLORSPACE 100
-void U_EMRSETCOLORSPACE_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRSETCOLORSPACE_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRDELETECOLORSPACE 101
-void U_EMRDELETECOLORSPACE_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRDELETECOLORSPACE_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRGLSRECORD 102 Not implemented
@@ -1491,10 +1798,11 @@ void U_EMRDELETECOLORSPACE_swap(char *record, int torev){
#define U_EMRGLSBOUNDEDRECORD_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented.
// U_EMRPIXELFORMAT 104
-void U_EMRPIXELFORMAT_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRPIXELFORMAT_swap(char *record, int torev){
+ if(!core5_swap(record, torev))return(0);
PU_EMRPIXELFORMAT pEmr = (PU_EMRPIXELFORMAT)(record);
pixelformatdescriptor_swap(&(pEmr->pfd)); // pfd
+ return(1);
}
// U_EMRDRAWESCAPE 105 Not implemented
@@ -1505,24 +1813,32 @@ void U_EMRPIXELFORMAT_swap(char *record, int torev){
#define U_EMRUNDEF107_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented.
// U_EMRSMALLTEXTOUT 108
-void U_EMRSMALLTEXTOUT_swap(char *record, int torev){
- int roff=0;
- int fuOptions=0;
- core5_swap(record, torev);
+int U_EMRSMALLTEXTOUT_swap(char *record, int torev){
+ int roff=sizeof(U_EMRSMALLTEXTOUT); // offset to the start of the variable fields
+ int fuOptions = 0;
+ int cChars = 0;
+ const char *blimit = NULL;
PU_EMRSMALLTEXTOUT pEmr = (PU_EMRSMALLTEXTOUT)(record);
if(torev){
fuOptions = pEmr->fuOptions;
+ cChars = pEmr->cChars;
+ blimit = record + pEmr->emr.nSize;
}
+ if(!core5_swap(record, torev))return(0);
pointl_swap(&(pEmr->Dest),1); // Dest
U_swap4(&(pEmr->cChars),5); // cChars fuOptions iGraphicsMode exScale eyScale
if(!torev){
fuOptions = pEmr->fuOptions;
+ cChars = pEmr->cChars;
+ blimit = record + pEmr->emr.nSize;
}
- roff = sizeof(U_EMRSMALLTEXTOUT); // offset to the start of the variable fields
if(!(fuOptions & U_ETO_NO_RECT)){
+ if(IS_MEM_UNSAFE(record, roff + sizeof(U_RECTL), blimit))return(0);
rectl_swap( (PU_RECTL) (record + roff),1); // rclBounds
}
+ if(IS_MEM_UNSAFE(record, roff + sizeof(U_RECTL) + cChars, blimit))return(0);
// ordered bytes or UTF16-LE TextString
+ return(1);
}
// U_EMRFORCEUFIMAPPING 109 Not implemented
@@ -1537,55 +1853,62 @@ void U_EMRSMALLTEXTOUT_swap(char *record, int torev){
#define U_EMRSETICMPROFILEW_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented.
// U_EMRALPHABLEND 114
-void U_EMRALPHABLEND_swap(char *record, int torev){
- core13_swap(record, torev);
+int U_EMRALPHABLEND_swap(char *record, int torev){
+ return(core13_swap(record, torev));
}
// U_EMRSETLAYOUT 115
-void U_EMRSETLAYOUT_swap(char *record, int torev){
- core3_swap(record, torev);
+int U_EMRSETLAYOUT_swap(char *record, int torev){
+ return(core3_swap(record, torev));
}
// U_EMRTRANSPARENTBLT 116
-void U_EMRTRANSPARENTBLT_swap(char *record, int torev){
- core13_swap(record, torev);
+int U_EMRTRANSPARENTBLT_swap(char *record, int torev){
+ return(core13_swap(record, torev));
}
// U_EMRUNDEF117 117 Not implemented
#define U_EMRUNDEF117_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented.
// U_EMRGRADIENTFILL 118
-void U_EMRGRADIENTFILL_swap(char *record, int torev){
+int U_EMRGRADIENTFILL_swap(char *record, int torev){
int nTriVert=0;
int nGradObj=0;
int ulMode=0;
- core5_swap(record, torev);
+ const char *blimit = NULL;
PU_EMRGRADIENTFILL pEmr = (PU_EMRGRADIENTFILL)(record);
if(torev){
nTriVert = pEmr->nTriVert;
nGradObj = pEmr->nGradObj;
ulMode = pEmr->ulMode;
+ blimit = record + pEmr->emr.nSize;
}
+ if(!core5_swap(record, torev))return(0);
rectl_swap(&(pEmr->rclBounds),1); // rclBounds
U_swap4(&(pEmr->nTriVert),3); // nTriVert nGradObj ulMode
if(!torev){
nTriVert = pEmr->nTriVert;
nGradObj = pEmr->nGradObj;
ulMode = pEmr->ulMode;
+ blimit = record + pEmr->emr.nSize;
}
record += sizeof(U_EMRGRADIENTFILL);
+ if(IS_MEM_UNSAFE(record, nTriVert*sizeof(U_TRIVERTEX), blimit))return(0);
if(nTriVert){
trivertex_swap((PU_TRIVERTEX)(record),nTriVert); // TriVert[]
}
record += nTriVert * sizeof(U_TRIVERTEX);
if(nGradObj){
if( ulMode == U_GRADIENT_FILL_TRIANGLE){
+ if(IS_MEM_UNSAFE(record, nGradObj*sizeof(U_GRADIENT3), blimit))return(0);
gradient3_swap((PU_GRADIENT3)(record), nGradObj); // GradObj[]
}
else if(ulMode == U_GRADIENT_FILL_RECT_H || ulMode == U_GRADIENT_FILL_RECT_V){
+ if(IS_MEM_UNSAFE(record, nGradObj*sizeof(U_GRADIENT4), blimit))return(0);
gradient4_swap((PU_GRADIENT4)(record), nGradObj); // GradObj[]
}
}
+ return(1);
}
// U_EMRSETLINKEDUFIS 119 Not implemented
@@ -1596,17 +1919,185 @@ void U_EMRGRADIENTFILL_swap(char *record, int torev){
#define U_EMRCOLORMATCHTOTARGETW_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented.
// U_EMRCREATECOLORSPACEW 122
-void U_EMRCREATECOLORSPACEW_swap(char *record, int torev){
- core5_swap(record, torev);
+int U_EMRCREATECOLORSPACEW_swap(char *record, int torev){
PU_EMRCREATECOLORSPACEW pEmr = (PU_EMRCREATECOLORSPACEW)(record);
+ if(!core5_swap(record, torev))return(0);
U_swap4(&(pEmr->ihCS),1); // ihCS
logcolorspacew_swap(&(pEmr->lcs)); // lcs
U_swap4(&(pEmr->dwFlags),2); // dwFlags cbData
// ordered bytes: Data
+ return(1);
}
//! \endcond
+/**
+ \brief Checks the declared size of a record for consistency
+ \return 0 on failure, 1 on success
+ \param record pointer to the start of the EMF record in memory
+ \param blimit pointer to one byte after the EMF record in memory
+ \param nSize number of bytes in the record, read from the record
+ \param iType type of the record, read from the record
+ \param torev 1 for native to reversed, 0 for reversed to native
+
+ Normally this would be called immediately after reading the data from a file.
+ Verifies that the declared size is consistent with this type of record.
+*/
+int U_emf_record_sizeok(const char *record, const char *blimit, uint32_t *nSize, uint32_t *iType, int torev){
+ uint32_t rsize=0;
+ if(!nSize || !iType)return(0); // programming error
+
+ /* Check that COMMON data in record can be touched without an access violation. If it cannot be
+ this is either a corrupt EMF or one engineered to cause a buffer overflow. Pointer math
+ could wrap so check both sides of the range, and fail any indications of such a wrap.
+ */
+ if(IS_MEM_UNSAFE(record, sizeof(U_EMR), blimit))return(0);
+
+ PU_ENHMETARECORD pEmr = (PU_ENHMETARECORD)(record);
+ *iType = pEmr->iType;
+ *nSize = pEmr->nSize;
+ if(!torev){
+ U_swap4(iType,1);
+ U_swap4(nSize,1);
+ }
+
+ /* Check that the FULL record size is OK, abort if not. */
+ if(IS_MEM_UNSAFE(record, *nSize, blimit))return(0);
+
+ switch (*iType)
+ {
+ // next line, ancient EMF files used a smaller header, to be safe, test for that
+ case U_EMR_HEADER: rsize = U_SIZE_EMRHEADER_MIN; break;
+ case U_EMR_POLYBEZIER: rsize = U_SIZE_EMRPOLYBEZIER; break;
+ case U_EMR_POLYGON: rsize = U_SIZE_EMRPOLYGON; break;
+ case U_EMR_POLYLINE: rsize = U_SIZE_EMRPOLYLINE; break;
+ case U_EMR_POLYBEZIERTO: rsize = U_SIZE_EMRPOLYBEZIERTO; break;
+ case U_EMR_POLYLINETO: rsize = U_SIZE_EMRPOLYLINETO; break;
+ case U_EMR_POLYPOLYLINE: rsize = U_SIZE_EMRPOLYPOLYLINE; break;
+ case U_EMR_POLYPOLYGON: rsize = U_SIZE_EMRPOLYPOLYGON; break;
+ case U_EMR_SETWINDOWEXTEX: rsize = U_SIZE_EMRSETWINDOWEXTEX; break;
+ case U_EMR_SETWINDOWORGEX: rsize = U_SIZE_EMRSETWINDOWORGEX; break;
+ case U_EMR_SETVIEWPORTEXTEX: rsize = U_SIZE_EMRSETVIEWPORTEXTEX; break;
+ case U_EMR_SETVIEWPORTORGEX: rsize = U_SIZE_EMRSETVIEWPORTORGEX; break;
+ case U_EMR_SETBRUSHORGEX: rsize = U_SIZE_EMRSETBRUSHORGEX; break;
+ case U_EMR_EOF: rsize = U_SIZE_EMREOF; break;
+ case U_EMR_SETPIXELV: rsize = U_SIZE_EMRSETPIXELV; break;
+ case U_EMR_SETMAPPERFLAGS: rsize = U_SIZE_EMRSETMAPPERFLAGS; break;
+ case U_EMR_SETMAPMODE: rsize = U_SIZE_EMRSETMAPMODE; break;
+ case U_EMR_SETBKMODE: rsize = U_SIZE_EMRSETBKMODE; break;
+ case U_EMR_SETPOLYFILLMODE: rsize = U_SIZE_EMRSETPOLYFILLMODE; break;
+ case U_EMR_SETROP2: rsize = U_SIZE_EMRSETROP2; break;
+ case U_EMR_SETSTRETCHBLTMODE: rsize = U_SIZE_EMRSETSTRETCHBLTMODE; break;
+ case U_EMR_SETTEXTALIGN: rsize = U_SIZE_EMRSETTEXTALIGN; break;
+ case U_EMR_SETCOLORADJUSTMENT: rsize = U_SIZE_EMRSETCOLORADJUSTMENT; break;
+ case U_EMR_SETTEXTCOLOR: rsize = U_SIZE_EMRSETTEXTCOLOR; break;
+ case U_EMR_SETBKCOLOR: rsize = U_SIZE_EMRSETBKCOLOR; break;
+ case U_EMR_OFFSETCLIPRGN: rsize = U_SIZE_EMROFFSETCLIPRGN; break;
+ case U_EMR_MOVETOEX: rsize = U_SIZE_EMRMOVETOEX; break;
+ case U_EMR_SETMETARGN: rsize = U_SIZE_EMRSETMETARGN; break;
+ case U_EMR_EXCLUDECLIPRECT: rsize = U_SIZE_EMREXCLUDECLIPRECT; break;
+ case U_EMR_INTERSECTCLIPRECT: rsize = U_SIZE_EMRINTERSECTCLIPRECT; break;
+ case U_EMR_SCALEVIEWPORTEXTEX: rsize = U_SIZE_EMRSCALEVIEWPORTEXTEX; break;
+ case U_EMR_SCALEWINDOWEXTEX: rsize = U_SIZE_EMRSCALEWINDOWEXTEX; break;
+ case U_EMR_SAVEDC: rsize = U_SIZE_EMRSAVEDC; break;
+ case U_EMR_RESTOREDC: rsize = U_SIZE_EMRRESTOREDC; break;
+ case U_EMR_SETWORLDTRANSFORM: rsize = U_SIZE_EMRSETWORLDTRANSFORM; break;
+ case U_EMR_MODIFYWORLDTRANSFORM: rsize = U_SIZE_EMRMODIFYWORLDTRANSFORM; break;
+ case U_EMR_SELECTOBJECT: rsize = U_SIZE_EMRSELECTOBJECT; break;
+ case U_EMR_CREATEPEN: rsize = U_SIZE_EMRCREATEPEN; break;
+ case U_EMR_CREATEBRUSHINDIRECT: rsize = U_SIZE_EMRCREATEBRUSHINDIRECT; break;
+ case U_EMR_DELETEOBJECT: rsize = U_SIZE_EMRDELETEOBJECT; break;
+ case U_EMR_ANGLEARC: rsize = U_SIZE_EMRANGLEARC; break;
+ case U_EMR_ELLIPSE: rsize = U_SIZE_EMRELLIPSE; break;
+ case U_EMR_RECTANGLE: rsize = U_SIZE_EMRRECTANGLE; break;
+ case U_EMR_ROUNDRECT: rsize = U_SIZE_EMRROUNDRECT; break;
+ case U_EMR_ARC: rsize = U_SIZE_EMRARC; break;
+ case U_EMR_CHORD: rsize = U_SIZE_EMRCHORD; break;
+ case U_EMR_PIE: rsize = U_SIZE_EMRPIE; break;
+ case U_EMR_SELECTPALETTE: rsize = U_SIZE_EMRSELECTPALETTE; break;
+ case U_EMR_CREATEPALETTE: rsize = U_SIZE_EMRCREATEPALETTE; break;
+ case U_EMR_SETPALETTEENTRIES: rsize = U_SIZE_EMRSETPALETTEENTRIES; break;
+ case U_EMR_RESIZEPALETTE: rsize = U_SIZE_EMRRESIZEPALETTE; break;
+ case U_EMR_REALIZEPALETTE: rsize = U_SIZE_EMRREALIZEPALETTE; break;
+ case U_EMR_EXTFLOODFILL: rsize = U_SIZE_EMREXTFLOODFILL; break;
+ case U_EMR_LINETO: rsize = U_SIZE_EMRLINETO; break;
+ case U_EMR_ARCTO: rsize = U_SIZE_EMRARCTO; break;
+ case U_EMR_POLYDRAW: rsize = U_SIZE_EMRPOLYDRAW; break;
+ case U_EMR_SETARCDIRECTION: rsize = U_SIZE_EMRSETARCDIRECTION; break;
+ case U_EMR_SETMITERLIMIT: rsize = U_SIZE_EMRSETMITERLIMIT; break;
+ case U_EMR_BEGINPATH: rsize = U_SIZE_EMRBEGINPATH; break;
+ case U_EMR_ENDPATH: rsize = U_SIZE_EMRENDPATH; break;
+ case U_EMR_CLOSEFIGURE: rsize = U_SIZE_EMRCLOSEFIGURE; break;
+ case U_EMR_FILLPATH: rsize = U_SIZE_EMRFILLPATH; break;
+ case U_EMR_STROKEANDFILLPATH: rsize = U_SIZE_EMRSTROKEANDFILLPATH; break;
+ case U_EMR_STROKEPATH: rsize = U_SIZE_EMRSTROKEPATH; break;
+ case U_EMR_FLATTENPATH: rsize = U_SIZE_EMRFLATTENPATH; break;
+ case U_EMR_WIDENPATH: rsize = U_SIZE_EMRWIDENPATH; break;
+ case U_EMR_SELECTCLIPPATH: rsize = U_SIZE_EMRSELECTCLIPPATH; break;
+ case U_EMR_ABORTPATH: rsize = U_SIZE_EMRABORTPATH; break;
+ case U_EMR_UNDEF69: rsize = U_SIZE_EMRUNDEFINED; break;
+ case U_EMR_COMMENT: rsize = U_SIZE_EMRCOMMENT; break;
+ case U_EMR_FILLRGN: rsize = U_SIZE_EMRFILLRGN; break;
+ case U_EMR_FRAMERGN: rsize = U_SIZE_EMRFRAMERGN; break;
+ case U_EMR_INVERTRGN: rsize = U_SIZE_EMRINVERTRGN; break;
+ case U_EMR_PAINTRGN: rsize = U_SIZE_EMRPAINTRGN; break;
+ case U_EMR_EXTSELECTCLIPRGN: rsize = U_SIZE_EMREXTSELECTCLIPRGN; break;
+ case U_EMR_BITBLT: rsize = U_SIZE_EMRBITBLT; break;
+ case U_EMR_STRETCHBLT: rsize = U_SIZE_EMRSTRETCHBLT; break;
+ case U_EMR_MASKBLT: rsize = U_SIZE_EMRMASKBLT; break;
+ case U_EMR_PLGBLT: rsize = U_SIZE_EMRPLGBLT; break;
+ case U_EMR_SETDIBITSTODEVICE: rsize = U_SIZE_EMRSETDIBITSTODEVICE; break;
+ case U_EMR_STRETCHDIBITS: rsize = U_SIZE_EMRSTRETCHDIBITS; break;
+ case U_EMR_EXTCREATEFONTINDIRECTW: rsize = U_SIZE_EMREXTCREATEFONTINDIRECTW_LOGFONT; break;
+ case U_EMR_EXTTEXTOUTA: rsize = U_SIZE_EMREXTTEXTOUTA; break;
+ case U_EMR_EXTTEXTOUTW: rsize = U_SIZE_EMREXTTEXTOUTW; break;
+ case U_EMR_POLYBEZIER16: rsize = U_SIZE_EMRPOLYBEZIER16; break;
+ case U_EMR_POLYGON16: rsize = U_SIZE_EMRPOLYGON16; break;
+ case U_EMR_POLYLINE16: rsize = U_SIZE_EMRPOLYLINE16; break;
+ case U_EMR_POLYBEZIERTO16: rsize = U_SIZE_EMRPOLYBEZIERTO16; break;
+ case U_EMR_POLYLINETO16: rsize = U_SIZE_EMRPOLYLINETO16; break;
+ case U_EMR_POLYPOLYLINE16: rsize = U_SIZE_EMRPOLYPOLYLINE16; break;
+ case U_EMR_POLYPOLYGON16: rsize = U_SIZE_EMRPOLYPOLYGON16; break;
+ case U_EMR_POLYDRAW16: rsize = U_SIZE_EMRPOLYDRAW16; break;
+ case U_EMR_CREATEMONOBRUSH: rsize = U_SIZE_EMRCREATEMONOBRUSH; break;
+ case U_EMR_CREATEDIBPATTERNBRUSHPT: rsize = U_SIZE_EMRCREATEDIBPATTERNBRUSHPT; break;
+ case U_EMR_EXTCREATEPEN: rsize = U_SIZE_EMREXTCREATEPEN; break;
+ case U_EMR_POLYTEXTOUTA: rsize = U_SIZE_EMRPOLYTEXTOUTA; break;
+ case U_EMR_POLYTEXTOUTW: rsize = U_SIZE_EMRPOLYTEXTOUTW; break;
+ case U_EMR_SETICMMODE: rsize = U_SIZE_EMRSETICMMODE; break;
+ case U_EMR_CREATECOLORSPACE: rsize = U_SIZE_EMRCREATECOLORSPACE; break;
+ case U_EMR_SETCOLORSPACE: rsize = U_SIZE_EMRSETCOLORSPACE; break;
+ case U_EMR_DELETECOLORSPACE: rsize = U_SIZE_EMRDELETECOLORSPACE; break;
+ case U_EMR_GLSRECORD: rsize = U_SIZE_EMRGLSRECORD; break;
+ case U_EMR_GLSBOUNDEDRECORD: rsize = U_SIZE_EMRGLSBOUNDEDRECORD; break;
+ case U_EMR_PIXELFORMAT: rsize = U_SIZE_EMRPIXELFORMAT; break;
+ case U_EMR_DRAWESCAPE: rsize = U_SIZE_EMRDRAWESCAPE; break;
+ case U_EMR_EXTESCAPE: rsize = U_SIZE_EMREXTESCAPE; break;
+ case U_EMR_UNDEF107: rsize = U_SIZE_EMRUNDEFINED; break;
+ case U_EMR_SMALLTEXTOUT: rsize = U_SIZE_EMRSMALLTEXTOUT; break;
+// case U_EMR_FORCEUFIMAPPING: rsize = U_SIZE_EMRFORCEUFIMAPPING; break;
+ case U_EMR_NAMEDESCAPE: rsize = U_SIZE_EMRNAMEDESCAPE; break;
+// case U_EMR_COLORCORRECTPALETTE: rsize = U_SIZE_EMRCOLORCORRECTPALETTE; break;
+// case U_EMR_SETICMPROFILEA: rsize = U_SIZE_EMRSETICMPROFILEA; break;
+// case U_EMR_SETICMPROFILEW: rsize = U_SIZE_EMRSETICMPROFILEW; break;
+ case U_EMR_ALPHABLEND: rsize = U_SIZE_EMRALPHABLEND; break;
+ case U_EMR_SETLAYOUT: rsize = U_SIZE_EMRSETLAYOUT; break;
+ case U_EMR_TRANSPARENTBLT: rsize = U_SIZE_EMRTRANSPARENTBLT; break;
+ case U_EMR_UNDEF117: rsize = U_SIZE_EMRUNDEFINED; break;
+ case U_EMR_GRADIENTFILL: rsize = U_SIZE_EMRGRADIENTFILL; break;
+// case U_EMR_SETLINKEDUFIS: rsize = U_SIZE_EMRSETLINKEDUFIS; break;
+// case U_EMR_SETTEXTJUSTIFICATION: rsize = U_SIZE_EMRSETTEXTJUSTIFICATION; break;
+ case U_EMR_COLORMATCHTOTARGETW: rsize = U_SIZE_EMRCOLORMATCHTOTARGETW; break;
+ case U_EMR_CREATECOLORSPACEW: rsize = U_SIZE_EMRCREATECOLORSPACEW; break;
+ default: rsize = U_SIZE_EMRNOTIMPLEMENTED; break;
+ } //end of switch
+ // record's declared size must be more than the minimum size for this type of record
+ if(*nSize < rsize){
+ return(0);
+ }
+ return(1);
+}
+
/**
\brief Convert an entire EMF in memory from Big Endian to Little Endian.
@@ -1622,155 +2113,151 @@ int U_emf_endian(char *contents, size_t length, int torev){
uint32_t off;
uint32_t OK, recnum, iType;
char *record;
- PU_ENHMETARECORD pEmr;
+ const char *blimit = contents + length; /* should never wrap since it describes a structure in memory */
+ int rstatus=1;
record = contents;
OK = 1;
off = 0;
recnum = 0;
while(OK){
- if(record > contents + length){ // this is most likely a corrupt EMF
- return(0);
- }
- pEmr = (PU_ENHMETARECORD)(record);
-
- iType = pEmr->iType;
- off = pEmr->nSize;
- if(!torev){
- U_swap4(&iType,1);
- U_swap4(&off,1);
+ if(!U_emf_record_sizeok(record, blimit, &off, &iType, torev)){
+ return(0);
}
switch (iType)
{
- case U_EMR_HEADER: U_EMRHEADER_swap(record, torev); break;
- case U_EMR_POLYBEZIER: U_EMRPOLYBEZIER_swap(record, torev); break;
- case U_EMR_POLYGON: U_EMRPOLYGON_swap(record, torev); break;
- case U_EMR_POLYLINE: U_EMRPOLYLINE_swap(record, torev); break;
- case U_EMR_POLYBEZIERTO: U_EMRPOLYBEZIERTO_swap(record, torev); break;
- case U_EMR_POLYLINETO: U_EMRPOLYLINETO_swap(record, torev); break;
- case U_EMR_POLYPOLYLINE: U_EMRPOLYPOLYLINE_swap(record, torev); break;
- case U_EMR_POLYPOLYGON: U_EMRPOLYPOLYGON_swap(record, torev); break;
- case U_EMR_SETWINDOWEXTEX: U_EMRSETWINDOWEXTEX_swap(record, torev); break;
- case U_EMR_SETWINDOWORGEX: U_EMRSETWINDOWORGEX_swap(record, torev); break;
- case U_EMR_SETVIEWPORTEXTEX: U_EMRSETVIEWPORTEXTEX_swap(record, torev); break;
- case U_EMR_SETVIEWPORTORGEX: U_EMRSETVIEWPORTORGEX_swap(record, torev); break;
- case U_EMR_SETBRUSHORGEX: U_EMRSETBRUSHORGEX_swap(record, torev); break;
+ case U_EMR_HEADER: rstatus=U_EMRHEADER_swap(record, torev); break;
+ case U_EMR_POLYBEZIER: rstatus=U_EMRPOLYBEZIER_swap(record, torev); break;
+ case U_EMR_POLYGON: rstatus=U_EMRPOLYGON_swap(record, torev); break;
+ case U_EMR_POLYLINE: rstatus=U_EMRPOLYLINE_swap(record, torev); break;
+ case U_EMR_POLYBEZIERTO: rstatus=U_EMRPOLYBEZIERTO_swap(record, torev); break;
+ case U_EMR_POLYLINETO: rstatus=U_EMRPOLYLINETO_swap(record, torev); break;
+ case U_EMR_POLYPOLYLINE: rstatus=U_EMRPOLYPOLYLINE_swap(record, torev); break;
+ case U_EMR_POLYPOLYGON: rstatus=U_EMRPOLYPOLYGON_swap(record, torev); break;
+ case U_EMR_SETWINDOWEXTEX: rstatus=U_EMRSETWINDOWEXTEX_swap(record, torev); break;
+ case U_EMR_SETWINDOWORGEX: rstatus=U_EMRSETWINDOWORGEX_swap(record, torev); break;
+ case U_EMR_SETVIEWPORTEXTEX: rstatus=U_EMRSETVIEWPORTEXTEX_swap(record, torev); break;
+ case U_EMR_SETVIEWPORTORGEX: rstatus=U_EMRSETVIEWPORTORGEX_swap(record, torev); break;
+ case U_EMR_SETBRUSHORGEX: rstatus=U_EMRSETBRUSHORGEX_swap(record, torev); break;
case U_EMR_EOF:
- U_EMREOF_swap(record, torev);
+ rstatus=U_EMREOF_swap(record, torev);
OK = 0; /* Exit triggered here */
break;
- case U_EMR_SETPIXELV: U_EMRSETPIXELV_swap(record, torev); break;
- case U_EMR_SETMAPPERFLAGS: U_EMRSETMAPPERFLAGS_swap(record, torev); break;
- case U_EMR_SETMAPMODE: U_EMRSETMAPMODE_swap(record, torev); break;
- case U_EMR_SETBKMODE: U_EMRSETBKMODE_swap(record, torev); break;
- case U_EMR_SETPOLYFILLMODE: U_EMRSETPOLYFILLMODE_swap(record, torev); break;
- case U_EMR_SETROP2: U_EMRSETROP2_swap(record, torev); break;
- case U_EMR_SETSTRETCHBLTMODE: U_EMRSETSTRETCHBLTMODE_swap(record, torev); break;
- case U_EMR_SETTEXTALIGN: U_EMRSETTEXTALIGN_swap(record, torev); break;
- case U_EMR_SETCOLORADJUSTMENT: U_EMRSETCOLORADJUSTMENT_swap(record, torev); break;
- case U_EMR_SETTEXTCOLOR: U_EMRSETTEXTCOLOR_swap(record, torev); break;
- case U_EMR_SETBKCOLOR: U_EMRSETBKCOLOR_swap(record, torev); break;
- case U_EMR_OFFSETCLIPRGN: U_EMROFFSETCLIPRGN_swap(record, torev); break;
- case U_EMR_MOVETOEX: U_EMRMOVETOEX_swap(record, torev); break;
- case U_EMR_SETMETARGN: U_EMRSETMETARGN_swap(record, torev); break;
- case U_EMR_EXCLUDECLIPRECT: U_EMREXCLUDECLIPRECT_swap(record, torev); break;
- case U_EMR_INTERSECTCLIPRECT: U_EMRINTERSECTCLIPRECT_swap(record, torev); break;
- case U_EMR_SCALEVIEWPORTEXTEX: U_EMRSCALEVIEWPORTEXTEX_swap(record, torev); break;
- case U_EMR_SCALEWINDOWEXTEX: U_EMRSCALEWINDOWEXTEX_swap(record, torev); break;
- case U_EMR_SAVEDC: U_EMRSAVEDC_swap(record, torev); break;
- case U_EMR_RESTOREDC: U_EMRRESTOREDC_swap(record, torev); break;
- case U_EMR_SETWORLDTRANSFORM: U_EMRSETWORLDTRANSFORM_swap(record, torev); break;
- case U_EMR_MODIFYWORLDTRANSFORM: U_EMRMODIFYWORLDTRANSFORM_swap(record, torev); break;
- case U_EMR_SELECTOBJECT: U_EMRSELECTOBJECT_swap(record, torev); break;
- case U_EMR_CREATEPEN: U_EMRCREATEPEN_swap(record, torev); break;
- case U_EMR_CREATEBRUSHINDIRECT: U_EMRCREATEBRUSHINDIRECT_swap(record, torev); break;
- case U_EMR_DELETEOBJECT: U_EMRDELETEOBJECT_swap(record, torev); break;
- case U_EMR_ANGLEARC: U_EMRANGLEARC_swap(record, torev); break;
- case U_EMR_ELLIPSE: U_EMRELLIPSE_swap(record, torev); break;
- case U_EMR_RECTANGLE: U_EMRRECTANGLE_swap(record, torev); break;
- case U_EMR_ROUNDRECT: U_EMRROUNDRECT_swap(record, torev); break;
- case U_EMR_ARC: U_EMRARC_swap(record, torev); break;
- case U_EMR_CHORD: U_EMRCHORD_swap(record, torev); break;
- case U_EMR_PIE: U_EMRPIE_swap(record, torev); break;
- case U_EMR_SELECTPALETTE: U_EMRSELECTPALETTE_swap(record, torev); break;
- case U_EMR_CREATEPALETTE: U_EMRCREATEPALETTE_swap(record, torev); break;
- case U_EMR_SETPALETTEENTRIES: U_EMRSETPALETTEENTRIES_swap(record, torev); break;
- case U_EMR_RESIZEPALETTE: U_EMRRESIZEPALETTE_swap(record, torev); break;
- case U_EMR_REALIZEPALETTE: U_EMRREALIZEPALETTE_swap(record, torev); break;
- case U_EMR_EXTFLOODFILL: U_EMREXTFLOODFILL_swap(record, torev); break;
- case U_EMR_LINETO: U_EMRLINETO_swap(record, torev); break;
- case U_EMR_ARCTO: U_EMRARCTO_swap(record, torev); break;
- case U_EMR_POLYDRAW: U_EMRPOLYDRAW_swap(record, torev); break;
- case U_EMR_SETARCDIRECTION: U_EMRSETARCDIRECTION_swap(record, torev); break;
- case U_EMR_SETMITERLIMIT: U_EMRSETMITERLIMIT_swap(record, torev); break;
- case U_EMR_BEGINPATH: U_EMRBEGINPATH_swap(record, torev); break;
- case U_EMR_ENDPATH: U_EMRENDPATH_swap(record, torev); break;
- case U_EMR_CLOSEFIGURE: U_EMRCLOSEFIGURE_swap(record, torev); break;
- case U_EMR_FILLPATH: U_EMRFILLPATH_swap(record, torev); break;
- case U_EMR_STROKEANDFILLPATH: U_EMRSTROKEANDFILLPATH_swap(record, torev); break;
- case U_EMR_STROKEPATH: U_EMRSTROKEPATH_swap(record, torev); break;
- case U_EMR_FLATTENPATH: U_EMRFLATTENPATH_swap(record, torev); break;
- case U_EMR_WIDENPATH: U_EMRWIDENPATH_swap(record, torev); break;
- case U_EMR_SELECTCLIPPATH: U_EMRSELECTCLIPPATH_swap(record, torev); break;
- case U_EMR_ABORTPATH: U_EMRABORTPATH_swap(record, torev); break;
- case U_EMR_UNDEF69: U_EMRUNDEF69_swap(record, torev); break;
- case U_EMR_COMMENT: U_EMRCOMMENT_swap(record, torev); break;
- case U_EMR_FILLRGN: U_EMRFILLRGN_swap(record, torev); break;
- case U_EMR_FRAMERGN: U_EMRFRAMERGN_swap(record, torev); break;
- case U_EMR_INVERTRGN: U_EMRINVERTRGN_swap(record, torev); break;
- case U_EMR_PAINTRGN: U_EMRPAINTRGN_swap(record, torev); break;
- case U_EMR_EXTSELECTCLIPRGN: U_EMREXTSELECTCLIPRGN_swap(record, torev); break;
- case U_EMR_BITBLT: U_EMRBITBLT_swap(record, torev); break;
- case U_EMR_STRETCHBLT: U_EMRSTRETCHBLT_swap(record, torev); break;
- case U_EMR_MASKBLT: U_EMRMASKBLT_swap(record, torev); break;
- case U_EMR_PLGBLT: U_EMRPLGBLT_swap(record, torev); break;
- case U_EMR_SETDIBITSTODEVICE: U_EMRSETDIBITSTODEVICE_swap(record, torev); break;
- case U_EMR_STRETCHDIBITS: U_EMRSTRETCHDIBITS_swap(record, torev); break;
- case U_EMR_EXTCREATEFONTINDIRECTW: U_EMREXTCREATEFONTINDIRECTW_swap(record, torev); break;
- case U_EMR_EXTTEXTOUTA: U_EMREXTTEXTOUTA_swap(record, torev); break;
- case U_EMR_EXTTEXTOUTW: U_EMREXTTEXTOUTW_swap(record, torev); break;
- case U_EMR_POLYBEZIER16: U_EMRPOLYBEZIER16_swap(record, torev); break;
- case U_EMR_POLYGON16: U_EMRPOLYGON16_swap(record, torev); break;
- case U_EMR_POLYLINE16: U_EMRPOLYLINE16_swap(record, torev); break;
- case U_EMR_POLYBEZIERTO16: U_EMRPOLYBEZIERTO16_swap(record, torev); break;
- case U_EMR_POLYLINETO16: U_EMRPOLYLINETO16_swap(record, torev); break;
- case U_EMR_POLYPOLYLINE16: U_EMRPOLYPOLYLINE16_swap(record, torev); break;
- case U_EMR_POLYPOLYGON16: U_EMRPOLYPOLYGON16_swap(record, torev); break;
- case U_EMR_POLYDRAW16: U_EMRPOLYDRAW16_swap(record, torev); break;
- case U_EMR_CREATEMONOBRUSH: U_EMRCREATEMONOBRUSH_swap(record, torev); break;
- case U_EMR_CREATEDIBPATTERNBRUSHPT: U_EMRCREATEDIBPATTERNBRUSHPT_swap(record, torev); break;
- case U_EMR_EXTCREATEPEN: U_EMREXTCREATEPEN_swap(record, torev); break;
- case U_EMR_POLYTEXTOUTA: U_EMRPOLYTEXTOUTA_swap(record, torev); break;
- case U_EMR_POLYTEXTOUTW: U_EMRPOLYTEXTOUTW_swap(record, torev); break;
- case U_EMR_SETICMMODE: U_EMRSETICMMODE_swap(record, torev); break;
- case U_EMR_CREATECOLORSPACE: U_EMRCREATECOLORSPACE_swap(record, torev); break;
- case U_EMR_SETCOLORSPACE: U_EMRSETCOLORSPACE_swap(record, torev); break;
- case U_EMR_DELETECOLORSPACE: U_EMRDELETECOLORSPACE_swap(record, torev); break;
- case U_EMR_GLSRECORD: U_EMRGLSRECORD_swap(record, torev); break;
- case U_EMR_GLSBOUNDEDRECORD: U_EMRGLSBOUNDEDRECORD_swap(record, torev); break;
- case U_EMR_PIXELFORMAT: U_EMRPIXELFORMAT_swap(record, torev); break;
- case U_EMR_DRAWESCAPE: U_EMRDRAWESCAPE_swap(record, torev); break;
- case U_EMR_EXTESCAPE: U_EMREXTESCAPE_swap(record, torev); break;
- case U_EMR_UNDEF107: U_EMRUNDEF107_swap(record, torev); break;
- case U_EMR_SMALLTEXTOUT: U_EMRSMALLTEXTOUT_swap(record, torev); break;
- case U_EMR_FORCEUFIMAPPING: U_EMRFORCEUFIMAPPING_swap(record, torev); break;
- case U_EMR_NAMEDESCAPE: U_EMRNAMEDESCAPE_swap(record, torev); break;
- case U_EMR_COLORCORRECTPALETTE: U_EMRCOLORCORRECTPALETTE_swap(record, torev); break;
- case U_EMR_SETICMPROFILEA: U_EMRSETICMPROFILEA_swap(record, torev); break;
- case U_EMR_SETICMPROFILEW: U_EMRSETICMPROFILEW_swap(record, torev); break;
- case U_EMR_ALPHABLEND: U_EMRALPHABLEND_swap(record, torev); break;
- case U_EMR_SETLAYOUT: U_EMRSETLAYOUT_swap(record, torev); break;
- case U_EMR_TRANSPARENTBLT: U_EMRTRANSPARENTBLT_swap(record, torev); break;
- case U_EMR_UNDEF117: U_EMRUNDEF117_swap(record, torev); break;
- case U_EMR_GRADIENTFILL: U_EMRGRADIENTFILL_swap(record, torev); break;
- case U_EMR_SETLINKEDUFIS: U_EMRSETLINKEDUFIS_swap(record, torev); break;
- case U_EMR_SETTEXTJUSTIFICATION: U_EMRSETTEXTJUSTIFICATION_swap(record, torev); break;
- case U_EMR_COLORMATCHTOTARGETW: U_EMRCOLORMATCHTOTARGETW_swap(record, torev); break;
- case U_EMR_CREATECOLORSPACEW: U_EMRCREATECOLORSPACEW_swap(record, torev); break;
- default: U_EMRNOTIMPLEMENTED_swap(record, torev); break;
+ case U_EMR_SETPIXELV: rstatus=U_EMRSETPIXELV_swap(record, torev); break;
+ case U_EMR_SETMAPPERFLAGS: rstatus=U_EMRSETMAPPERFLAGS_swap(record, torev); break;
+ case U_EMR_SETMAPMODE: rstatus=U_EMRSETMAPMODE_swap(record, torev); break;
+ case U_EMR_SETBKMODE: rstatus=U_EMRSETBKMODE_swap(record, torev); break;
+ case U_EMR_SETPOLYFILLMODE: rstatus=U_EMRSETPOLYFILLMODE_swap(record, torev); break;
+ case U_EMR_SETROP2: rstatus=U_EMRSETROP2_swap(record, torev); break;
+ case U_EMR_SETSTRETCHBLTMODE: rstatus=U_EMRSETSTRETCHBLTMODE_swap(record, torev); break;
+ case U_EMR_SETTEXTALIGN: rstatus=U_EMRSETTEXTALIGN_swap(record, torev); break;
+ case U_EMR_SETCOLORADJUSTMENT: rstatus=U_EMRSETCOLORADJUSTMENT_swap(record, torev); break;
+ case U_EMR_SETTEXTCOLOR: rstatus=U_EMRSETTEXTCOLOR_swap(record, torev); break;
+ case U_EMR_SETBKCOLOR: rstatus=U_EMRSETBKCOLOR_swap(record, torev); break;
+ case U_EMR_OFFSETCLIPRGN: rstatus=U_EMROFFSETCLIPRGN_swap(record, torev); break;
+ case U_EMR_MOVETOEX: rstatus=U_EMRMOVETOEX_swap(record, torev); break;
+ case U_EMR_SETMETARGN: rstatus=U_EMRSETMETARGN_swap(record, torev); break;
+ case U_EMR_EXCLUDECLIPRECT: rstatus=U_EMREXCLUDECLIPRECT_swap(record, torev); break;
+ case U_EMR_INTERSECTCLIPRECT: rstatus=U_EMRINTERSECTCLIPRECT_swap(record, torev); break;
+ case U_EMR_SCALEVIEWPORTEXTEX: rstatus=U_EMRSCALEVIEWPORTEXTEX_swap(record, torev); break;
+ case U_EMR_SCALEWINDOWEXTEX: rstatus=U_EMRSCALEWINDOWEXTEX_swap(record, torev); break;
+ case U_EMR_SAVEDC: rstatus=U_EMRSAVEDC_swap(record, torev); break;
+ case U_EMR_RESTOREDC: rstatus=U_EMRRESTOREDC_swap(record, torev); break;
+ case U_EMR_SETWORLDTRANSFORM: rstatus=U_EMRSETWORLDTRANSFORM_swap(record, torev); break;
+ case U_EMR_MODIFYWORLDTRANSFORM: rstatus=U_EMRMODIFYWORLDTRANSFORM_swap(record, torev); break;
+ case U_EMR_SELECTOBJECT: rstatus=U_EMRSELECTOBJECT_swap(record, torev); break;
+ case U_EMR_CREATEPEN: rstatus=U_EMRCREATEPEN_swap(record, torev); break;
+ case U_EMR_CREATEBRUSHINDIRECT: rstatus=U_EMRCREATEBRUSHINDIRECT_swap(record, torev); break;
+ case U_EMR_DELETEOBJECT: rstatus=U_EMRDELETEOBJECT_swap(record, torev); break;
+ case U_EMR_ANGLEARC: rstatus=U_EMRANGLEARC_swap(record, torev); break;
+ case U_EMR_ELLIPSE: rstatus=U_EMRELLIPSE_swap(record, torev); break;
+ case U_EMR_RECTANGLE: rstatus=U_EMRRECTANGLE_swap(record, torev); break;
+ case U_EMR_ROUNDRECT: rstatus=U_EMRROUNDRECT_swap(record, torev); break;
+ case U_EMR_ARC: rstatus=U_EMRARC_swap(record, torev); break;
+ case U_EMR_CHORD: rstatus=U_EMRCHORD_swap(record, torev); break;
+ case U_EMR_PIE: rstatus=U_EMRPIE_swap(record, torev); break;
+ case U_EMR_SELECTPALETTE: rstatus=U_EMRSELECTPALETTE_swap(record, torev); break;
+ case U_EMR_CREATEPALETTE: rstatus=U_EMRCREATEPALETTE_swap(record, torev); break;
+ case U_EMR_SETPALETTEENTRIES: rstatus=U_EMRSETPALETTEENTRIES_swap(record, torev); break;
+ case U_EMR_RESIZEPALETTE: rstatus=U_EMRRESIZEPALETTE_swap(record, torev); break;
+ case U_EMR_REALIZEPALETTE: rstatus=U_EMRREALIZEPALETTE_swap(record, torev); break;
+ case U_EMR_EXTFLOODFILL: rstatus=U_EMREXTFLOODFILL_swap(record, torev); break;
+ case U_EMR_LINETO: rstatus=U_EMRLINETO_swap(record, torev); break;
+ case U_EMR_ARCTO: rstatus=U_EMRARCTO_swap(record, torev); break;
+ case U_EMR_POLYDRAW: rstatus=U_EMRPOLYDRAW_swap(record, torev); break;
+ case U_EMR_SETARCDIRECTION: rstatus=U_EMRSETARCDIRECTION_swap(record, torev); break;
+ case U_EMR_SETMITERLIMIT: rstatus=U_EMRSETMITERLIMIT_swap(record, torev); break;
+ case U_EMR_BEGINPATH: rstatus=U_EMRBEGINPATH_swap(record, torev); break;
+ case U_EMR_ENDPATH: rstatus=U_EMRENDPATH_swap(record, torev); break;
+ case U_EMR_CLOSEFIGURE: rstatus=U_EMRCLOSEFIGURE_swap(record, torev); break;
+ case U_EMR_FILLPATH: rstatus=U_EMRFILLPATH_swap(record, torev); break;
+ case U_EMR_STROKEANDFILLPATH: rstatus=U_EMRSTROKEANDFILLPATH_swap(record, torev); break;
+ case U_EMR_STROKEPATH: rstatus=U_EMRSTROKEPATH_swap(record, torev); break;
+ case U_EMR_FLATTENPATH: rstatus=U_EMRFLATTENPATH_swap(record, torev); break;
+ case U_EMR_WIDENPATH: rstatus=U_EMRWIDENPATH_swap(record, torev); break;
+ case U_EMR_SELECTCLIPPATH: rstatus=U_EMRSELECTCLIPPATH_swap(record, torev); break;
+ case U_EMR_ABORTPATH: rstatus=U_EMRABORTPATH_swap(record, torev); break;
+ case U_EMR_UNDEF69: rstatus=U_EMRUNDEF69_swap(record, torev); break;
+ case U_EMR_COMMENT: rstatus=U_EMRCOMMENT_swap(record, torev); break;
+ case U_EMR_FILLRGN: rstatus=U_EMRFILLRGN_swap(record, torev); break;
+ case U_EMR_FRAMERGN: rstatus=U_EMRFRAMERGN_swap(record, torev); break;
+ case U_EMR_INVERTRGN: rstatus=U_EMRINVERTRGN_swap(record, torev); break;
+ case U_EMR_PAINTRGN: rstatus=U_EMRPAINTRGN_swap(record, torev); break;
+ case U_EMR_EXTSELECTCLIPRGN: rstatus=U_EMREXTSELECTCLIPRGN_swap(record, torev);break;
+ case U_EMR_BITBLT: rstatus=U_EMRBITBLT_swap(record, torev); break;
+ case U_EMR_STRETCHBLT: rstatus=U_EMRSTRETCHBLT_swap(record, torev); break;
+ case U_EMR_MASKBLT: rstatus=U_EMRMASKBLT_swap(record, torev); break;
+ case U_EMR_PLGBLT: rstatus=U_EMRPLGBLT_swap(record, torev); break;
+ case U_EMR_SETDIBITSTODEVICE: rstatus=U_EMRSETDIBITSTODEVICE_swap(record, torev); break;
+ case U_EMR_STRETCHDIBITS: rstatus=U_EMRSTRETCHDIBITS_swap(record, torev); break;
+ case U_EMR_EXTCREATEFONTINDIRECTW: rstatus=U_EMREXTCREATEFONTINDIRECTW_swap(record, torev); break;
+ case U_EMR_EXTTEXTOUTA: rstatus=U_EMREXTTEXTOUTA_swap(record, torev); break;
+ case U_EMR_EXTTEXTOUTW: rstatus=U_EMREXTTEXTOUTW_swap(record, torev); break;
+ case U_EMR_POLYBEZIER16: rstatus=U_EMRPOLYBEZIER16_swap(record, torev); break;
+ case U_EMR_POLYGON16: rstatus=U_EMRPOLYGON16_swap(record, torev); break;
+ case U_EMR_POLYLINE16: rstatus=U_EMRPOLYLINE16_swap(record, torev); break;
+ case U_EMR_POLYBEZIERTO16: rstatus=U_EMRPOLYBEZIERTO16_swap(record, torev); break;
+ case U_EMR_POLYLINETO16: rstatus=U_EMRPOLYLINETO16_swap(record, torev); break;
+ case U_EMR_POLYPOLYLINE16: rstatus=U_EMRPOLYPOLYLINE16_swap(record, torev); break;
+ case U_EMR_POLYPOLYGON16: rstatus=U_EMRPOLYPOLYGON16_swap(record, torev); break;
+ case U_EMR_POLYDRAW16: rstatus=U_EMRPOLYDRAW16_swap(record, torev); break;
+ case U_EMR_CREATEMONOBRUSH: rstatus=U_EMRCREATEMONOBRUSH_swap(record, torev); break;
+ case U_EMR_CREATEDIBPATTERNBRUSHPT: rstatus=U_EMRCREATEDIBPATTERNBRUSHPT_swap(record, torev); break;
+ case U_EMR_EXTCREATEPEN: rstatus=U_EMREXTCREATEPEN_swap(record, torev); break;
+ case U_EMR_POLYTEXTOUTA: rstatus=U_EMRPOLYTEXTOUTA_swap(record, torev); break;
+ case U_EMR_POLYTEXTOUTW: rstatus=U_EMRPOLYTEXTOUTW_swap(record, torev); break;
+ case U_EMR_SETICMMODE: rstatus=U_EMRSETICMMODE_swap(record, torev); break;
+ case U_EMR_CREATECOLORSPACE: rstatus=U_EMRCREATECOLORSPACE_swap(record, torev); break;
+ case U_EMR_SETCOLORSPACE: rstatus=U_EMRSETCOLORSPACE_swap(record, torev); break;
+ case U_EMR_DELETECOLORSPACE: rstatus=U_EMRDELETECOLORSPACE_swap(record, torev); break;
+ case U_EMR_GLSRECORD: rstatus=U_EMRGLSRECORD_swap(record, torev); break;
+ case U_EMR_GLSBOUNDEDRECORD: rstatus=U_EMRGLSBOUNDEDRECORD_swap(record, torev); break;
+ case U_EMR_PIXELFORMAT: rstatus=U_EMRPIXELFORMAT_swap(record, torev); break;
+ case U_EMR_DRAWESCAPE: rstatus=U_EMRDRAWESCAPE_swap(record, torev); break;
+ case U_EMR_EXTESCAPE: rstatus=U_EMREXTESCAPE_swap(record, torev); break;
+ case U_EMR_UNDEF107: rstatus=U_EMRUNDEF107_swap(record, torev); break;
+ case U_EMR_SMALLTEXTOUT: rstatus=U_EMRSMALLTEXTOUT_swap(record, torev); break;
+ case U_EMR_FORCEUFIMAPPING: rstatus=U_EMRFORCEUFIMAPPING_swap(record, torev); break;
+ case U_EMR_NAMEDESCAPE: rstatus=U_EMRNAMEDESCAPE_swap(record, torev); break;
+ case U_EMR_COLORCORRECTPALETTE: rstatus=U_EMRCOLORCORRECTPALETTE_swap(record, torev); break;
+ case U_EMR_SETICMPROFILEA: rstatus=U_EMRSETICMPROFILEA_swap(record, torev); break;
+ case U_EMR_SETICMPROFILEW: rstatus=U_EMRSETICMPROFILEW_swap(record, torev); break;
+ case U_EMR_ALPHABLEND: rstatus=U_EMRALPHABLEND_swap(record, torev); break;
+ case U_EMR_SETLAYOUT: rstatus=U_EMRSETLAYOUT_swap(record, torev); break;
+ case U_EMR_TRANSPARENTBLT: rstatus=U_EMRTRANSPARENTBLT_swap(record, torev); break;
+ case U_EMR_UNDEF117: rstatus=U_EMRUNDEF117_swap(record, torev); break;
+ case U_EMR_GRADIENTFILL: rstatus=U_EMRGRADIENTFILL_swap(record, torev); break;
+ case U_EMR_SETLINKEDUFIS: rstatus=U_EMRSETLINKEDUFIS_swap(record, torev); break;
+ case U_EMR_SETTEXTJUSTIFICATION: rstatus=U_EMRSETTEXTJUSTIFICATION_swap(record, torev); break;
+ case U_EMR_COLORMATCHTOTARGETW: rstatus=U_EMRCOLORMATCHTOTARGETW_swap(record, torev); break;
+ case U_EMR_CREATECOLORSPACEW: rstatus=U_EMRCREATECOLORSPACEW_swap(record, torev); break;
+ default: rstatus=U_EMRNOTIMPLEMENTED_swap(record, torev); break;
} //end of switch
+ if(!rstatus){
+ return(rstatus);
+ }
record += off;
recnum++;
} //end of while
diff --git a/src/libuemf/uemf_endian.h b/src/libuemf/uemf_endian.h
index 317968c34..9dbcec455 100644
--- a/src/libuemf/uemf_endian.h
+++ b/src/libuemf/uemf_endian.h
@@ -6,11 +6,11 @@
/*
File: uemf_endian.h
-Version: 0.0.3
-Date: 24-JUL-2012
+Version: 0.0.4
+Date: 24-MAR-2015
Author: David Mathog, Biology Division, Caltech
email: mathog@caltech.edu
-Copyright: 2012 David Mathog and California Institute of Technology (Caltech)
+Copyright: 2015 David Mathog and California Institute of Technology (Caltech)
*/
#ifndef _UEMF_ENDIAN_
@@ -49,6 +49,7 @@ extern "C" {
//! \cond
// prototypes
int U_emf_endian(char *contents, size_t length, int torev);
+int U_emf_record_sizeok(const char *record, const char *blimit, uint32_t *nSize, uint32_t *iType, int torev);
//! \endcond
#ifdef __cplusplus
diff --git a/src/libuemf/uemf_print.c b/src/libuemf/uemf_print.c
index aa574bd73..adcf54c0f 100644
--- a/src/libuemf/uemf_print.c
+++ b/src/libuemf/uemf_print.c
@@ -6,11 +6,11 @@
/*
File: uemf_print.c
-Version: 0.0.15
-Date: 17-OCT-2013
+Version: 0.0.18
+Date: 25-MAR-2015
Author: David Mathog, Biology Division, Caltech
email: mathog@caltech.edu
-Copyright: 2013 David Mathog and California Institute of Technology (Caltech)
+Copyright: 2015 David Mathog and California Institute of Technology (Caltech)
*/
#ifdef __cplusplus
@@ -23,9 +23,12 @@ extern "C" {
#include <string.h>
#include "uemf.h"
#include "upmf_print.h"
+#include "uemf_safe.h"
//! \cond
#define UNUSED(x) (void)(x)
+/* This bit of code is used all over the place, so reduce it to a DEFINITION */
+#define IF_MEM_UNSAFE_PRINT_AND_RETURN(A,B,C) if(IS_MEM_UNSAFE(A,B,C)){printf(" record corruption HERE\n"); return; }
/* one needed prototype */
void U_swap4(void *ul, unsigned int count);
@@ -364,24 +367,28 @@ int bitmapinfoheader_print(
/**
\brief Print a Pointer to a U_BITMAPINFO object.
\param Bmi Pointer to a U_BITMAPINFO object
+ \param blimit Pointer to the first byte after after this record
This may be called from WMF _print routines, where problems could occur
if the data was passed as the struct or a pointer to the struct, as the struct may not
be aligned in memory.
*/
void bitmapinfo_print(
- const char *Bmi
+ const char *Bmi,
+ const char *blimit
){
int i,k;
int ClrUsed;
U_RGBQUAD BmiColor;
printf("BmiHeader: ");
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(Bmi, offsetof(U_BITMAPINFO,bmiHeader) + sizeof(U_BITMAPINFOHEADER), blimit);
ClrUsed = bitmapinfoheader_print(Bmi + offsetof(U_BITMAPINFO,bmiHeader));
if(ClrUsed){
- k= offsetof(U_BITMAPINFO,bmiColors);
- for(i=0; i<ClrUsed; i++, k+= sizeof(U_RGBQUAD)){
- memcpy(&BmiColor, Bmi+k, sizeof(U_RGBQUAD));
- printf("%d:",i); rgbquad_print(BmiColor);
- }
+ k= offsetof(U_BITMAPINFO,bmiColors);
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(Bmi, offsetof(U_BITMAPINFO,bmiColors) + ClrUsed*sizeof(U_RGBQUAD), blimit);
+ for(i=0; i<ClrUsed; i++, k+= sizeof(U_RGBQUAD)){
+ memcpy(&BmiColor, Bmi+k, sizeof(U_RGBQUAD));
+ printf("%d:",i); rgbquad_print(BmiColor);
+ }
}
}
@@ -484,15 +491,19 @@ void rgndataheader_print(
/**
\brief Print a pointer to a U_RGNDATA object.
\param rd pointer to a U_RGNDATA object.
+ \param limit pointer that sets upper limit for data examination
*/
void rgndata_print(
- PU_RGNDATA rd
+ PU_RGNDATA rd,
+ const char *blimit
){
unsigned int i;
PU_RECTL rects;
- printf("rdh:"); rgndataheader_print(rd->rdh );
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(rd, sizeof(U_RGNDATAHEADER), blimit);
+ printf("rdh: "); rgndataheader_print(rd->rdh ); printf(" rects: ");
if(rd->rdh.nCount){
rects = (PU_RECTL) &(rd->Buffer);
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(rects, rd->rdh.nCount * sizeof(U_RECTL), blimit);
for(i=0;i<rd->rdh.nCount;i++){
printf("%d:",i); rectl_print(rects[i]);
}
@@ -559,11 +570,13 @@ void pixelformatdescriptor_print(
\brief Print a Pointer to a U_EMRTEXT record
\param emt Pointer to a U_EMRTEXT record
\param record Pointer to the start of the record which contains this U_ERMTEXT
+ \param blimit Pointer to the first byte after after this record
\param type 0 for 8 bit character, anything else for 16
*/
void emrtext_print(
const char *emt,
const char *record,
+ const char *blimit,
int type
){
unsigned int i,off;
@@ -575,9 +588,11 @@ void emrtext_print(
printf("offString:%u " ,pemt->offString );
if(pemt->offString){
if(!type){
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(record, pemt->offString + pemt->nChars*sizeof(char), blimit);
printf("string8:<%s> ",record + pemt->offString);
}
else {
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(record, pemt->offString + pemt->nChars*2*sizeof(char), blimit);
string = U_Utf16leToUtf8((uint16_t *)(record + pemt->offString), pemt->nChars, NULL);
printf("string16:<%s> ",string);
free(string);
@@ -622,9 +637,15 @@ void core1_print(const char *name, const char *contents){
unsigned int i;
UNUSED(name);
PU_EMRPOLYLINETO pEmr = (PU_EMRPOLYLINETO) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRPOLYBEZIER)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n");
printf(" cptl: %d\n",pEmr->cptl );
printf(" Points: ");
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(pEmr->aptl, pEmr->cptl*sizeof(U_POINTL), blimit);
for(i=0;i<pEmr->cptl; i++){
printf("[%d]:",i); pointl_print(pEmr->aptl[i]);
}
@@ -636,16 +657,23 @@ void core2_print(const char *name, const char *contents){
unsigned int i;
UNUSED(name);
PU_EMRPOLYPOLYGON pEmr = (PU_EMRPOLYPOLYGON) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRPOLYPOLYGON)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n");
printf(" nPolys: %d\n",pEmr->nPolys );
printf(" cptl: %d\n",pEmr->cptl );
printf(" Counts: ");
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(pEmr->aPolyCounts, pEmr->nPolys*sizeof(U_POLYCOUNTS), blimit);
for(i=0;i<pEmr->nPolys; i++){
printf(" [%d]:%d ",i,pEmr->aPolyCounts[i] );
}
printf("\n");
PU_POINTL paptl = (PU_POINTL)((char *)pEmr->aPolyCounts + sizeof(uint32_t)* pEmr->nPolys);
printf(" Points: ");
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(paptl, pEmr->cptl*sizeof(U_POINTL), blimit);
for(i=0;i<pEmr->cptl; i++){
printf(" [%d]:",i); pointl_print(paptl[i]);
}
@@ -656,7 +684,12 @@ void core2_print(const char *name, const char *contents){
// Functions with the same form starting with U_EMRSETMAPMODE_print
void core3_print(const char *name, const char *label, const char *contents){
UNUSED(name);
+ /* access violation is impossible for these because there are no counts or offsets */
PU_EMRSETMAPMODE pEmr = (PU_EMRSETMAPMODE)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRSETMAPMODE)){
+ printf(" record corruption HERE\n");
+ return;
+ }
if(!strcmp(label,"crColor:")){
printf(" %-15s ",label); colorref_print(*(U_COLORREF *)&(pEmr->iMode)); printf("\n");
}
@@ -672,6 +705,10 @@ void core3_print(const char *name, const char *label, const char *contents){
void core4_print(const char *name, const char *contents){
UNUSED(name);
PU_EMRELLIPSE pEmr = (PU_EMRELLIPSE)( contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRELLIPSE)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" rclBox: "); rectl_print(pEmr->rclBox); printf("\n");
}
@@ -680,10 +717,16 @@ void core6_print(const char *name, const char *contents){
UNUSED(name);
unsigned int i;
PU_EMRPOLYBEZIER16 pEmr = (PU_EMRPOLYBEZIER16) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRPOLYBEZIER16)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n");
printf(" cpts: %d\n",pEmr->cpts );
printf(" Points: ");
PU_POINT16 papts = (PU_POINT16)(&(pEmr->apts));
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(papts, pEmr->cpts*sizeof(U_POINT16), blimit);
for(i=0; i<pEmr->cpts; i++){
printf(" [%d]:",i); point16_print(papts[i]);
}
@@ -698,6 +741,10 @@ void core6_print(const char *name, const char *contents){
void core7_print(const char *name, const char *field1, const char *field2, const char *contents){
UNUSED(name);
PU_EMRGENERICPAIR pEmr = (PU_EMRGENERICPAIR) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRGENERICPAIR)){
+ printf(" record corruption HERE\n");
+ return;
+ }
if(*field2){
printf(" %-15s %d\n",field1,pEmr->pair.x);
printf(" %-15s %d\n",field2,pEmr->pair.y);
@@ -711,12 +758,13 @@ void core7_print(const char *name, const char *field1, const char *field2, const
void core8_print(const char *name, const char *contents, int type){
UNUSED(name);
PU_EMREXTTEXTOUTA pEmr = (PU_EMREXTTEXTOUTA) (contents);
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" iGraphicsMode: %u\n",pEmr->iGraphicsMode );
printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n");
printf(" exScale: %f\n",pEmr->exScale );
printf(" eyScale: %f\n",pEmr->eyScale );
printf(" emrtext: ");
- emrtext_print(contents + sizeof(U_EMREXTTEXTOUTA) - sizeof(U_EMRTEXT),contents,type);
+ emrtext_print(contents + sizeof(U_EMREXTTEXTOUTA) - sizeof(U_EMRTEXT),contents,blimit,type);
printf("\n");
}
@@ -724,6 +772,10 @@ void core8_print(const char *name, const char *contents, int type){
void core9_print(const char *name, const char *contents){
UNUSED(name);
PU_EMRARC pEmr = (PU_EMRARC) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRARC)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" rclBox: "); rectl_print(pEmr->rclBox); printf("\n");
printf(" ptlStart: "); pointl_print(pEmr->ptlStart); printf("\n");
printf(" ptlEnd: "); pointl_print(pEmr->ptlEnd); printf("\n");
@@ -734,16 +786,23 @@ void core10_print(const char *name, const char *contents){
UNUSED(name);
unsigned int i;
PU_EMRPOLYPOLYLINE16 pEmr = (PU_EMRPOLYPOLYLINE16) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRPOLYPOLYLINE16)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n");
printf(" nPolys: %d\n",pEmr->nPolys );
printf(" cpts: %d\n",pEmr->cpts );
printf(" Counts: ");
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(&(pEmr->aPolyCounts), pEmr->nPolys*sizeof(U_POLYCOUNTS), blimit);
for(i=0;i<pEmr->nPolys; i++){
printf(" [%d]:%d ",i,pEmr->aPolyCounts[i] );
}
printf("\n");
printf(" Points: ");
- PU_POINT16 papts = (PU_POINT16)((char *)pEmr->aPolyCounts + sizeof(uint32_t)* pEmr->nPolys);
+ PU_POINT16 papts = (PU_POINT16)((char *)pEmr->aPolyCounts + pEmr->nPolys*sizeof(U_POLYCOUNTS) );
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(papts, pEmr->cpts*sizeof(U_POINT16), blimit);
for(i=0; i<pEmr->cpts; i++){
printf(" [%d]:",i); point16_print(papts[i]);
}
@@ -754,20 +813,18 @@ void core10_print(const char *name, const char *contents){
// Functions with the same form starting with U_EMRINVERTRGN_print and U_EMRPAINTRGN_print,
void core11_print(const char *name, const char *contents){
UNUSED(name);
- unsigned int i,roff;
PU_EMRINVERTRGN pEmr = (PU_EMRINVERTRGN) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRINVERTRGN)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n");
printf(" cbRgnData: %d\n",pEmr->cbRgnData);
- // This one is a pain since each RGNDATA may be a different size, so it isn't possible to index through them.
- roff=0;
- i=1;
- char *prd = (char *) &(pEmr->RgnData);
- while(roff + sizeof(U_RGNDATAHEADER) < pEmr->cbRgnData){ // stop at end of the record 4*4 = header + 4*4=rect
- printf(" RegionData:%d",i);
- rgndata_print((PU_RGNDATA) (prd + roff));
- roff += (((PU_RGNDATA)prd)->rdh.dwSize + ((PU_RGNDATA)prd)->rdh.nRgnSize - 16);
- printf("\n");
- }
+ printf(" RegionData:");
+ const char *minptr = MAKE_MIN_PTR(((const char *) &pEmr->RgnData + pEmr->cbRgnData),blimit);
+ rgndata_print(pEmr->RgnData, minptr);
+ printf("\n");
}
@@ -775,13 +832,18 @@ void core11_print(const char *name, const char *contents){
void core12_print(const char *name, const char *contents){
UNUSED(name);
PU_EMRCREATEMONOBRUSH pEmr = (PU_EMRCREATEMONOBRUSH) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRCREATEMONOBRUSH)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" ihBrush: %u\n",pEmr->ihBrush );
printf(" iUsage : %u\n",pEmr->iUsage );
printf(" offBmi : %u\n",pEmr->offBmi );
printf(" cbBmi : %u\n",pEmr->cbBmi );
if(pEmr->cbBmi){
printf(" bitmap:");
- bitmapinfo_print(contents + pEmr->offBmi);
+ bitmapinfo_print(contents + pEmr->offBmi, blimit);
printf("\n");
}
printf(" offBits: %u\n",pEmr->offBits );
@@ -792,6 +854,11 @@ void core12_print(const char *name, const char *contents){
void core13_print(const char *name, const char *contents){
UNUSED(name);
PU_EMRALPHABLEND pEmr = (PU_EMRALPHABLEND) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRALPHABLEND)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n");
printf(" Dest: "); pointl_print(pEmr->Dest); printf("\n");
printf(" cDest: "); pointl_print(pEmr->cDest); printf("\n");
@@ -804,7 +871,7 @@ void core13_print(const char *name, const char *contents){
printf(" cbBmiSrc: %u\n",pEmr->cbBmiSrc );
if(pEmr->cbBmiSrc){
printf(" bitmap:");
- bitmapinfo_print(contents + pEmr->offBmiSrc);
+ bitmapinfo_print(contents + pEmr->offBmiSrc, blimit);
printf("\n");
}
printf(" offBitsSrc: %u\n",pEmr->offBitsSrc );
@@ -839,6 +906,11 @@ void U_EMRHEADER_print(const char *contents){
int p1len;
PU_EMRHEADER pEmr = (PU_EMRHEADER)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRHEADER)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n");
printf(" rclFrame: "); rectl_print( pEmr->rclFrame); printf("\n");
printf(" dSignature: 0x%8.8X\n", pEmr->dSignature );
@@ -850,6 +922,7 @@ void U_EMRHEADER_print(const char *contents){
printf(" nDescription: %d\n", pEmr->nDescription );
printf(" offDescription: %d\n", pEmr->offDescription);
if(pEmr->offDescription){
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, pEmr->offDescription + pEmr->nDescription*2*sizeof(char), blimit);
string = U_Utf16leToUtf8((uint16_t *)((char *) pEmr + pEmr->offDescription), pEmr->nDescription, NULL);
printf(" Desc. A: %s\n",string);
free(string);
@@ -868,6 +941,7 @@ void U_EMRHEADER_print(const char *contents){
printf(" offPixelFormat: %d\n", pEmr->offPixelFormat);
if(pEmr->cbPixelFormat){
printf(" PFD:");
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, pEmr->offPixelFormat + sizeof(U_PIXELFORMATDESCRIPTOR), blimit);
pixelformatdescriptor_print( *(PU_PIXELFORMATDESCRIPTOR) (contents + pEmr->offPixelFormat));
printf("\n");
}
@@ -997,6 +1071,10 @@ void U_EMRSETBRUSHORGEX_print(const char *contents){
*/
void U_EMREOF_print(const char *contents){
PU_EMREOF pEmr = (PU_EMREOF)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMREOF)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" cbPalEntries: %u\n", pEmr->cbPalEntries );
printf(" offPalEntries: %u\n", pEmr->offPalEntries);
if(pEmr->cbPalEntries){
@@ -1014,6 +1092,10 @@ void U_EMREOF_print(const char *contents){
*/
void U_EMRSETPIXELV_print(const char *contents){
PU_EMRSETPIXELV pEmr = (PU_EMRSETPIXELV)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRSETPIXELV)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" ptlPixel: "); pointl_print( pEmr->ptlPixel); printf("\n");
printf(" crColor: "); colorref_print(pEmr->crColor); printf("\n");
}
@@ -1026,6 +1108,10 @@ void U_EMRSETPIXELV_print(const char *contents){
*/
void U_EMRSETMAPPERFLAGS_print(const char *contents){
PU_EMRSETMAPPERFLAGS pEmr = (PU_EMRSETMAPPERFLAGS)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRSETMAPPERFLAGS)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" dwFlags: 0x%8.8X\n",pEmr->dwFlags);
}
@@ -1091,6 +1177,10 @@ void U_EMRSETTEXTALIGN_print(const char *contents){
*/
void U_EMRSETCOLORADJUSTMENT_print(const char *contents){
PU_EMRSETCOLORADJUSTMENT pEmr = (PU_EMRSETCOLORADJUSTMENT)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRSETCOLORADJUSTMENT)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" ColorAdjustment:");
coloradjustment_print(pEmr->ColorAdjustment);
printf("\n");
@@ -1203,6 +1293,10 @@ void U_EMRRESTOREDC_print(const char *contents){
*/
void U_EMRSETWORLDTRANSFORM_print(const char *contents){
PU_EMRSETWORLDTRANSFORM pEmr = (PU_EMRSETWORLDTRANSFORM)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRSETWORLDTRANSFORM)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" xform:");
xform_print(pEmr->xform);
printf("\n");
@@ -1215,6 +1309,10 @@ void U_EMRSETWORLDTRANSFORM_print(const char *contents){
*/
void U_EMRMODIFYWORLDTRANSFORM_print(const char *contents){
PU_EMRMODIFYWORLDTRANSFORM pEmr = (PU_EMRMODIFYWORLDTRANSFORM)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRMODIFYWORLDTRANSFORM)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" xform:");
xform_print(pEmr->xform);
printf("\n");
@@ -1228,6 +1326,10 @@ void U_EMRMODIFYWORLDTRANSFORM_print(const char *contents){
*/
void U_EMRSELECTOBJECT_print(const char *contents){
PU_EMRSELECTOBJECT pEmr = (PU_EMRSELECTOBJECT)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRSELECTOBJECT)){
+ printf(" record corruption HERE\n");
+ return;
+ }
if(pEmr->ihObject & U_STOCK_OBJECT){
printf(" StockObject: 0x%8.8X\n", pEmr->ihObject );
}
@@ -1243,6 +1345,10 @@ void U_EMRSELECTOBJECT_print(const char *contents){
*/
void U_EMRCREATEPEN_print(const char *contents){
PU_EMRCREATEPEN pEmr = (PU_EMRCREATEPEN)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRCREATEPEN)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" ihPen: %u\n", pEmr->ihPen );
printf(" lopn: "); logpen_print(pEmr->lopn); printf("\n");
}
@@ -1254,6 +1360,10 @@ void U_EMRCREATEPEN_print(const char *contents){
*/
void U_EMRCREATEBRUSHINDIRECT_print(const char *contents){
PU_EMRCREATEBRUSHINDIRECT pEmr = (PU_EMRCREATEBRUSHINDIRECT)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRCREATEBRUSHINDIRECT)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" ihBrush: %u\n", pEmr->ihBrush );
printf(" lb: "); logbrush_print(pEmr->lb); printf("\n");
}
@@ -1265,6 +1375,10 @@ void U_EMRCREATEBRUSHINDIRECT_print(const char *contents){
*/
void U_EMRDELETEOBJECT_print(const char *contents){
PU_EMRDELETEOBJECT pEmr = (PU_EMRDELETEOBJECT)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRDELETEOBJECT)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" ihObject: %u\n", pEmr->ihObject );
}
@@ -1275,6 +1389,10 @@ void U_EMRDELETEOBJECT_print(const char *contents){
*/
void U_EMRANGLEARC_print(const char *contents){
PU_EMRANGLEARC pEmr = (PU_EMRANGLEARC)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRANGLEARC)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" ptlCenter: "), pointl_print(pEmr->ptlCenter ); printf("\n");
printf(" nRadius: %u\n", pEmr->nRadius );
printf(" eStartAngle: %f\n", pEmr->eStartAngle );
@@ -1306,6 +1424,10 @@ void U_EMRRECTANGLE_print(const char *contents){
*/
void U_EMRROUNDRECT_print(const char *contents){
PU_EMRROUNDRECT pEmr = (PU_EMRROUNDRECT)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRROUNDRECT)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" rclBox: "), rectl_print(pEmr->rclBox ); printf("\n");
printf(" szlCorner: "), sizel_print(pEmr->szlCorner ); printf("\n");
}
@@ -1353,6 +1475,10 @@ void U_EMRSELECTPALETTE_print(const char *contents){
*/
void U_EMRCREATEPALETTE_print(const char *contents){
PU_EMRCREATEPALETTE pEmr = (PU_EMRCREATEPALETTE)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRCREATEPALETTE)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" ihPal: %u\n",pEmr->ihPal);
printf(" lgpl: "), logpalette_print( (PU_LOGPALETTE)&(pEmr->lgpl) ); printf("\n");
}
@@ -1365,12 +1491,18 @@ void U_EMRCREATEPALETTE_print(const char *contents){
void U_EMRSETPALETTEENTRIES_print(const char *contents){
unsigned int i;
PU_EMRSETPALETTEENTRIES pEmr = (PU_EMRSETPALETTEENTRIES)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRSETPALETTEENTRIES)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" ihPal: %u\n",pEmr->ihPal);
printf(" iStart: %u\n",pEmr->iStart);
printf(" cEntries: %u\n",pEmr->cEntries);
if(pEmr->cEntries){
printf(" PLTEntries:");
PU_LOGPLTNTRY aPalEntries = (PU_LOGPLTNTRY) &(pEmr->aPalEntries);
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(aPalEntries, pEmr->cEntries*sizeof(U_LOGPLTNTRY), blimit);
for(i=0; i<pEmr->cEntries; i++){
printf("%d:",i); logpltntry_print(aPalEntries[i]);
}
@@ -1403,6 +1535,10 @@ void U_EMRREALIZEPALETTE_print(const char *contents){
*/
void U_EMREXTFLOODFILL_print(const char *contents){
PU_EMREXTFLOODFILL pEmr = (PU_EMREXTFLOODFILL)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMREXTFLOODFILL)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" ptlStart: "); pointl_print(pEmr->ptlStart); printf("\n");
printf(" crColor: "); colorref_print(pEmr->crColor); printf("\n");
printf(" iMode: %u\n",pEmr->iMode);
@@ -1434,17 +1570,25 @@ void U_EMRARCTO_print(const char *contents){
void U_EMRPOLYDRAW_print(const char *contents){
unsigned int i;
PU_EMRPOLYDRAW pEmr = (PU_EMRPOLYDRAW)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRPOLYDRAW)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n");
printf(" cptl: %d\n",pEmr->cptl );
printf(" Points: ");
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(pEmr->aptl, pEmr->cptl*sizeof(U_POINTL), blimit);
for(i=0;i<pEmr->cptl; i++){
printf(" [%d]:",i);
pointl_print(pEmr->aptl[i]);
}
printf("\n");
printf(" Types: ");
+ const char *abTypes = (const char *) pEmr->aptl + pEmr->cptl*sizeof(U_POINTL);
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(abTypes, pEmr->cptl, blimit);
for(i=0;i<pEmr->cptl; i++){
- printf(" [%d]:%u ",i,pEmr->abTypes[i]);
+ printf(" [%d]:%u ",i,((uint8_t *)abTypes)[i]);
}
printf("\n");
}
@@ -1565,12 +1709,11 @@ void U_EMRABORTPATH_print(const char *contents){
/**
\brief Print a pointer to a U_EMR_COMMENT record.
\param contents pointer to a location in memory holding the comment record
- \param blimit size in bytes of the comment record
- \param off offset in bytes to the first byte in this record
+ \param off offset in bytes to the first byte in this record (needed for EMF+ record printing)
EMF+ records, if any, are stored in EMF comment records.
*/
-void U_EMRCOMMENT_print(const char *contents, const char *blimit, size_t off){
+void U_EMRCOMMENT_print(const char *contents, size_t off){
char *string;
char *src;
uint32_t cIdent,cIdent2,cbData;
@@ -1579,21 +1722,30 @@ void U_EMRCOMMENT_print(const char *contents, const char *blimit, size_t off){
static int recnum=0;
PU_EMRCOMMENT pEmr = (PU_EMRCOMMENT)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRCOMMENT)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
/* There are several different types of comments */
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, sizeof(U_EMRCOMMENT), blimit);
cbData = pEmr->cbData;
printf(" cbData: %d\n",cbData );
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, sizeof(U_EMR) + sizeof(U_CBDATA) + cbData, blimit);
src = (char *)&(pEmr->Data); // default
if(cbData >= 4){
/* Since the comment is just a big bag of bytes the emf endian code cannot safely touch
- any of its payload. This is the only record type with that limitation. Try to determine
+ any of its payload. This is the only record type with that limitation. So the record
+ may appear at this stage with the wrong endianness. Try to determine
what the contents are even if more byte swapping is required. */
cIdent = *(uint32_t *)(src);
if(U_BYTE_SWAP){ U_swap4(&(cIdent),1); }
if( cIdent == U_EMR_COMMENT_PUBLIC ){
printf(" cIdent: Public\n");
PU_EMRCOMMENT_PUBLIC pEmrp = (PU_EMRCOMMENT_PUBLIC) pEmr;
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, sizeof(U_EMRCOMMENT_PUBLIC), blimit);
cIdent2 = pEmrp->pcIdent;
if(U_BYTE_SWAP){ U_swap4(&(cIdent2),1); }
printf(" pcIdent: 0x%8.8x\n",cIdent2);
@@ -1603,6 +1755,7 @@ void U_EMRCOMMENT_print(const char *contents, const char *blimit, size_t off){
else if(cIdent == U_EMR_COMMENT_SPOOL ){
printf(" cIdent: Spool\n");
PU_EMRCOMMENT_SPOOL pEmrs = (PU_EMRCOMMENT_SPOOL) pEmr;
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, sizeof(U_EMRCOMMENT_SPOOL), blimit);
cIdent2 = pEmrs->esrIdent;
if(U_BYTE_SWAP){ U_swap4(&(cIdent2),1); }
printf(" esrIdent: 0x%8.8x\n",cIdent2);
@@ -1612,11 +1765,16 @@ void U_EMRCOMMENT_print(const char *contents, const char *blimit, size_t off){
else if(cIdent == U_EMR_COMMENT_EMFPLUSRECORD){
printf(" cIdent: EMF+\n");
PU_EMRCOMMENT_EMFPLUS pEmrpl = (PU_EMRCOMMENT_EMFPLUS) pEmr;
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, sizeof(U_EMRCOMMENT_EMFPLUS), blimit);
src = (char *)&(pEmrpl->Data);
loff = 16; /* Header size of the header part of an EMF+ comment record */
while(loff < cbData + 12){ // EMF+ records may not fill the entire comment, cbData value includes cIdent, but not U_EMR or cbData
recsize = U_pmf_onerec_print(src, blimit, recnum, loff + off);
- if(recsize<=0)break;
+ if(recsize==0){ break; }
+ else if(recsize<0){
+ printf(" record corruption HERE\n");
+ return;
+ }
loff += recsize;
src += recsize;
recnum++;
@@ -1642,19 +1800,17 @@ void U_EMRCOMMENT_print(const char *contents, const char *blimit, size_t off){
\param contents pointer to a buffer holding all EMR records
*/
void U_EMRFILLRGN_print(const char *contents){
- int i,roff;
PU_EMRFILLRGN pEmr = (PU_EMRFILLRGN)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRFILLRGN)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n");
printf(" cbRgnData: %u\n",pEmr->cbRgnData);
printf(" ihBrush: %u\n",pEmr->ihBrush);
- // This one is a pain since each RGNDATA may be a different size, so it isn't possible to index through them.
- roff=0;
- i=1;
- char *prd = (char *) &(pEmr->RgnData);
- while(roff + sizeof(U_RGNDATAHEADER) < pEmr->emr.nSize){ // up to the end of the record
- printf(" RegionData[%d]: ",i); rgndata_print((PU_RGNDATA) (prd + roff)); printf("\n");
- roff += (((PU_RGNDATA)prd)->rdh.dwSize + ((PU_RGNDATA)prd)->rdh.nRgnSize - 16);
- }
+ const char *minptr = MAKE_MIN_PTR(((const char *) &pEmr->RgnData + pEmr->cbRgnData + sizeof(U_RGNDATAHEADER)),blimit);
+ printf(" RegionData: "); rgndata_print(pEmr->RgnData, minptr); printf("\n");
}
// U_EMRFRAMERGN 72
@@ -1663,20 +1819,18 @@ void U_EMRFILLRGN_print(const char *contents){
\param contents pointer to a buffer holding all EMR records
*/
void U_EMRFRAMERGN_print(const char *contents){
- int i,roff;
PU_EMRFRAMERGN pEmr = (PU_EMRFRAMERGN)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRFRAMERGN)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n");
printf(" cbRgnData: %u\n",pEmr->cbRgnData);
printf(" ihBrush: %u\n",pEmr->ihBrush);
printf(" szlStroke: "), sizel_print(pEmr->szlStroke ); printf("\n");
- // This one is a pain since each RGNDATA may be a different size, so it isn't possible to index through them.
- roff=0;
- i=1;
- char *prd = (char *) &(pEmr->RgnData);
- while(roff + sizeof(U_RGNDATAHEADER) < pEmr->emr.nSize){ // up to the end of the record
- printf(" RegionData[%d]: ",i); rgndata_print((PU_RGNDATA) (prd + roff)); printf("\n");
- roff += (((PU_RGNDATA)prd)->rdh.dwSize + ((PU_RGNDATA)prd)->rdh.nRgnSize - 16);
- }
+ const char *minptr = MAKE_MIN_PTR(((const char *) &pEmr->RgnData + pEmr->cbRgnData),blimit);
+ printf(" RegionData: "); rgndata_print(pEmr->RgnData, minptr); printf("\n");
}
// U_EMRINVERTRGN 73
@@ -1703,17 +1857,16 @@ void U_EMRPAINTRGN_print(const char *contents){
\param contents pointer to a buffer holding all EMR records
*/
void U_EMREXTSELECTCLIPRGN_print(const char *contents){
- int i,roff;
PU_EMREXTSELECTCLIPRGN pEmr = (PU_EMREXTSELECTCLIPRGN) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMREXTSELECTCLIPRGN)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" cbRgnData: %u\n",pEmr->cbRgnData);
printf(" iMode: %u\n",pEmr->iMode);
- // This one is a pain since each RGNDATA may be a different size, so it isn't possible to index through them.
- char *prd = (char *) &(pEmr->RgnData);
- i=roff=0;
- while(roff + sizeof(U_RGNDATAHEADER) < pEmr->cbRgnData){ // stop at end of the record 4*4 = header + 4*4=rect
- printf(" RegionData[%d]: ",i++); rgndata_print((PU_RGNDATA) (prd + roff)); printf("\n");
- roff += (((PU_RGNDATA)prd)->rdh.dwSize + ((PU_RGNDATA)prd)->rdh.nRgnSize - 16);
- }
+ const char *minptr = MAKE_MIN_PTR(((const char *) &pEmr->RgnData + pEmr->cbRgnData),blimit);
+ printf(" RegionData: "); rgndata_print(pEmr->RgnData, minptr); printf("\n");
}
// U_EMRBITBLT 76
@@ -1723,6 +1876,11 @@ void U_EMREXTSELECTCLIPRGN_print(const char *contents){
*/
void U_EMRBITBLT_print(const char *contents){
PU_EMRBITBLT pEmr = (PU_EMRBITBLT) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRBITBLT)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n");
printf(" Dest: "); pointl_print(pEmr->Dest); printf("\n");
printf(" cDest: "); pointl_print(pEmr->cDest); printf("\n");
@@ -1735,7 +1893,7 @@ void U_EMRBITBLT_print(const char *contents){
printf(" cbBmiSrc: %u\n", pEmr->cbBmiSrc );
if(pEmr->cbBmiSrc){
printf(" bitmap: ");
- bitmapinfo_print(contents + pEmr->offBmiSrc);
+ bitmapinfo_print(contents + pEmr->offBmiSrc, blimit);
printf("\n");
}
printf(" offBitsSrc: %u\n", pEmr->offBitsSrc );
@@ -1749,6 +1907,11 @@ void U_EMRBITBLT_print(const char *contents){
*/
void U_EMRSTRETCHBLT_print(const char *contents){
PU_EMRSTRETCHBLT pEmr = (PU_EMRSTRETCHBLT) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRSTRETCHBLT)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n");
printf(" Dest: "); pointl_print(pEmr->Dest); printf("\n");
printf(" cDest: "); pointl_print(pEmr->cDest); printf("\n");
@@ -1761,7 +1924,7 @@ void U_EMRSTRETCHBLT_print(const char *contents){
printf(" cbBmiSrc: %u\n", pEmr->cbBmiSrc );
if(pEmr->cbBmiSrc){
printf(" bitmap: ");
- bitmapinfo_print(contents + pEmr->offBmiSrc);
+ bitmapinfo_print(contents + pEmr->offBmiSrc, blimit);
printf("\n");
}
printf(" offBitsSrc: %u\n", pEmr->offBitsSrc );
@@ -1776,6 +1939,11 @@ void U_EMRSTRETCHBLT_print(const char *contents){
*/
void U_EMRMASKBLT_print(const char *contents){
PU_EMRMASKBLT pEmr = (PU_EMRMASKBLT) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRMASKBLT)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n");
printf(" Dest: "); pointl_print(pEmr->Dest); printf("\n");
printf(" cDest: "); pointl_print(pEmr->cDest); printf("\n");
@@ -1788,7 +1956,7 @@ void U_EMRMASKBLT_print(const char *contents){
printf(" cbBmiSrc: %u\n", pEmr->cbBmiSrc );
if(pEmr->cbBmiSrc){
printf(" Src bitmap: ");
- bitmapinfo_print(contents + pEmr->offBmiSrc);
+ bitmapinfo_print(contents + pEmr->offBmiSrc, blimit);
printf("\n");
}
printf(" offBitsSrc: %u\n", pEmr->offBitsSrc );
@@ -1799,7 +1967,7 @@ void U_EMRMASKBLT_print(const char *contents){
printf(" cbBmiMask: %u\n", pEmr->cbBmiMask );
if(pEmr->cbBmiMask){
printf(" Mask bitmap: ");
- bitmapinfo_print(contents + pEmr->offBmiMask);
+ bitmapinfo_print(contents + pEmr->offBmiMask, blimit);
printf("\n");
}
printf(" offBitsMask: %u\n", pEmr->offBitsMask );
@@ -1813,6 +1981,11 @@ void U_EMRMASKBLT_print(const char *contents){
*/
void U_EMRPLGBLT_print(const char *contents){
PU_EMRPLGBLT pEmr = (PU_EMRPLGBLT) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRPLGBLT)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n");
printf(" aptlDst(UL): "); pointl_print(pEmr->aptlDst[0]); printf("\n");
printf(" aptlDst(UR): "); pointl_print(pEmr->aptlDst[1]); printf("\n");
@@ -1826,7 +1999,7 @@ void U_EMRPLGBLT_print(const char *contents){
printf(" cbBmiSrc: %u\n", pEmr->cbBmiSrc );
if(pEmr->cbBmiSrc){
printf(" Src bitmap: ");
- bitmapinfo_print(contents + pEmr->offBmiSrc);
+ bitmapinfo_print(contents + pEmr->offBmiSrc, blimit);
printf("\n");
}
printf(" offBitsSrc: %u\n", pEmr->offBitsSrc );
@@ -1837,7 +2010,7 @@ void U_EMRPLGBLT_print(const char *contents){
printf(" cbBmiMask: %u\n", pEmr->cbBmiMask );
if(pEmr->cbBmiMask){
printf(" Mask bitmap: ");
- bitmapinfo_print(contents + pEmr->offBmiMask);
+ bitmapinfo_print(contents + pEmr->offBmiMask, blimit);
printf("\n");
}
printf(" offBitsMask: %u\n", pEmr->offBitsMask );
@@ -1851,6 +2024,11 @@ void U_EMRPLGBLT_print(const char *contents){
*/
void U_EMRSETDIBITSTODEVICE_print(const char *contents){
PU_EMRSETDIBITSTODEVICE pEmr = (PU_EMRSETDIBITSTODEVICE) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRSETDIBITSTODEVICE)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n");
printf(" Dest: "); pointl_print(pEmr->Dest); printf("\n");
printf(" Src: "); pointl_print(pEmr->Src); printf("\n");
@@ -1859,7 +2037,7 @@ void U_EMRSETDIBITSTODEVICE_print(const char *contents){
printf(" cbBmiSrc: %u\n", pEmr->cbBmiSrc );
if(pEmr->cbBmiSrc){
printf(" Src bitmap: ");
- bitmapinfo_print(contents + pEmr->offBmiSrc);
+ bitmapinfo_print(contents + pEmr->offBmiSrc, blimit);
printf("\n");
}
printf(" offBitsSrc: %u\n", pEmr->offBitsSrc );
@@ -1876,6 +2054,11 @@ void U_EMRSETDIBITSTODEVICE_print(const char *contents){
*/
void U_EMRSTRETCHDIBITS_print(const char *contents){
PU_EMRSTRETCHDIBITS pEmr = (PU_EMRSTRETCHDIBITS) (contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRSTRETCHDIBITS)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n");
printf(" Dest: "); pointl_print(pEmr->Dest); printf("\n");
printf(" Src: "); pointl_print(pEmr->Src); printf("\n");
@@ -1884,7 +2067,7 @@ void U_EMRSTRETCHDIBITS_print(const char *contents){
printf(" cbBmiSrc: %u\n", pEmr->cbBmiSrc );
if(pEmr->cbBmiSrc){
printf(" Src bitmap: ");
- bitmapinfo_print(contents + pEmr->offBmiSrc);
+ bitmapinfo_print(contents + pEmr->offBmiSrc, blimit);
printf("\n");
}
printf(" offBitsSrc: %u\n", pEmr->offBitsSrc );
@@ -1901,12 +2084,19 @@ void U_EMRSTRETCHDIBITS_print(const char *contents){
*/
void U_EMREXTCREATEFONTINDIRECTW_print(const char *contents){
PU_EMREXTCREATEFONTINDIRECTW pEmr = (PU_EMREXTCREATEFONTINDIRECTW) (contents);
+ if(pEmr->emr.nSize < U_SIZE_EMREXTCREATEFONTINDIRECTW_LOGFONT){ // smallest variant
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" ihFont: %u\n",pEmr->ihFont );
printf(" Font: ");
- if(pEmr->emr.nSize == sizeof(U_EMREXTCREATEFONTINDIRECTW)){ // holds logfont_panose
+ if(pEmr->emr.nSize == U_SIZE_EMREXTCREATEFONTINDIRECTW_LOGFONT_PANOSE){ // holds logfont_panose
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(&(pEmr->elfw), sizeof(U_PANOSE), blimit);
logfont_panose_print(pEmr->elfw);
}
- else { // holds logfont
+ else { // holds logfont or logfontExDv. The latter isn't supported but it starts with logfont, so use that
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(&(pEmr->elfw), sizeof(U_LOGFONT), blimit);
logfont_print( *(PU_LOGFONT) &(pEmr->elfw));
}
printf("\n");
@@ -2002,17 +2192,25 @@ void U_EMRPOLYPOLYGON16_print(const char *contents){
void U_EMRPOLYDRAW16_print(const char *contents){
unsigned int i;
PU_EMRPOLYDRAW16 pEmr = (PU_EMRPOLYDRAW16)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRPOLYDRAW16)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n");
printf(" cpts: %d\n",pEmr->cpts );
printf(" Points: ");
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(pEmr->apts, pEmr->cpts*sizeof(U_POINT16), blimit);
for(i=0;i<pEmr->cpts; i++){
printf(" [%d]:",i);
point16_print(pEmr->apts[i]);
}
printf("\n");
printf(" Types: ");
+ const char *abTypes = (const char *) pEmr->apts + pEmr->cpts*sizeof(U_POINT16);
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(abTypes, pEmr->cpts, blimit);
for(i=0;i<pEmr->cpts; i++){
- printf(" [%d]:%u ",i,pEmr->abTypes[i]);
+ printf(" [%d]:%u ",i,((uint8_t *)abTypes)[i]);
}
printf("\n");
}
@@ -2043,12 +2241,17 @@ void U_EMRCREATEDIBPATTERNBRUSHPT_print(const char *contents){
*/
void U_EMREXTCREATEPEN_print(const char *contents){
PU_EMREXTCREATEPEN pEmr = (PU_EMREXTCREATEPEN)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMREXTCREATEPEN)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" ihPen: %u\n", pEmr->ihPen );
printf(" offBmi: %u\n", pEmr->offBmi );
printf(" cbBmi: %u\n", pEmr->cbBmi );
if(pEmr->cbBmi){
printf(" bitmap: ");
- bitmapinfo_print(contents + pEmr->offBmi);
+ bitmapinfo_print(contents + pEmr->offBmi, blimit);
printf("\n");
}
printf(" offBits: %u\n", pEmr->offBits );
@@ -2077,6 +2280,10 @@ void U_EMRSETICMMODE_print(const char *contents){
*/
void U_EMRCREATECOLORSPACE_print(const char *contents){
PU_EMRCREATECOLORSPACE pEmr = (PU_EMRCREATECOLORSPACE)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRCREATECOLORSPACE)){
+ printf(" record corruption HERE\n");
+ return;
+ }
printf(" ihCS: %u\n", pEmr->ihCS );
printf(" ColorSpace: "); logcolorspacea_print(pEmr->lcs); printf("\n");
}
@@ -2111,6 +2318,12 @@ void U_EMRDELETECOLORSPACE_print(const char *contents){
*/
void U_EMRPIXELFORMAT_print(const char *contents){
PU_EMRPIXELFORMAT pEmr = (PU_EMRPIXELFORMAT)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRPIXELFORMAT)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(&(pEmr->pfd), sizeof(U_PIXELFORMATDESCRIPTOR), blimit);
printf(" Pfd: "); pixelformatdescriptor_print(pEmr->pfd); printf("\n");
}
@@ -2130,6 +2343,11 @@ void U_EMRSMALLTEXTOUT_print(const char *contents){
int roff;
char *string;
PU_EMRSMALLTEXTOUT pEmr = (PU_EMRSMALLTEXTOUT)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRSMALLTEXTOUT)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" Dest: "); pointl_print(pEmr->Dest); printf("\n");
printf(" cChars: %u\n", pEmr->cChars );
printf(" fuOptions: 0x%8.8X\n", pEmr->fuOptions );
@@ -2138,14 +2356,17 @@ void U_EMRSMALLTEXTOUT_print(const char *contents){
printf(" eyScale: %f\n", pEmr->eyScale );
roff = sizeof(U_EMRSMALLTEXTOUT); //offset to the start of the variable fields
if(!(pEmr->fuOptions & U_ETO_NO_RECT)){
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, roff, blimit);
printf(" rclBounds: "); rectl_print( *(PU_RECTL) (contents + roff)); printf("\n");
roff += sizeof(U_RECTL);
}
if(pEmr->fuOptions & U_ETO_SMALL_CHARS){
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, roff + pEmr->cChars*sizeof(char), blimit);
printf(" Text8: <%.*s>\n",pEmr->cChars,contents+roff); /* May not be null terminated */
}
else {
string = U_Utf16leToUtf8((uint16_t *)(contents+roff), pEmr->cChars, NULL);
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, roff + pEmr->cChars*2*sizeof(char), blimit);
printf(" Text16: <%s>\n",contents+roff);
free(string);
}
@@ -2199,12 +2420,18 @@ void U_EMRTRANSPARENTBLT_print(const char *contents){
void U_EMRGRADIENTFILL_print(const char *contents){
unsigned int i;
PU_EMRGRADIENTFILL pEmr = (PU_EMRGRADIENTFILL)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRGRADIENTFILL)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n");
printf(" nTriVert: %u\n", pEmr->nTriVert );
printf(" nGradObj: %u\n", pEmr->nGradObj );
printf(" ulMode: %u\n", pEmr->ulMode );
contents += sizeof(U_EMRGRADIENTFILL);
if(pEmr->nTriVert){
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, pEmr->nTriVert*sizeof(U_TRIVERTEX), blimit);
printf(" TriVert: ");
for(i=0; i<pEmr->nTriVert; i++, contents+=sizeof(U_TRIVERTEX)){
trivertex_print(*(PU_TRIVERTEX)(contents));
@@ -2214,12 +2441,14 @@ void U_EMRGRADIENTFILL_print(const char *contents){
if(pEmr->nGradObj){
printf(" GradObj: ");
if( pEmr->ulMode == U_GRADIENT_FILL_TRIANGLE){
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, pEmr->nGradObj*sizeof(U_GRADIENT3), blimit);
for(i=0; i<pEmr->nGradObj; i++, contents+=sizeof(U_GRADIENT3)){
gradient3_print(*(PU_GRADIENT3)(contents));
}
}
else if(pEmr->ulMode == U_GRADIENT_FILL_RECT_H ||
pEmr->ulMode == U_GRADIENT_FILL_RECT_V){
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, pEmr->nGradObj*sizeof(U_GRADIENT4), blimit);
for(i=0; i<pEmr->nGradObj; i++, contents+=sizeof(U_GRADIENT4)){
gradient4_print(*(PU_GRADIENT4)(contents));
}
@@ -2244,12 +2473,18 @@ void U_EMRGRADIENTFILL_print(const char *contents){
void U_EMRCREATECOLORSPACEW_print(const char *contents){
unsigned int i;
PU_EMRCREATECOLORSPACEW pEmr = (PU_EMRCREATECOLORSPACEW)(contents);
+ if(pEmr->emr.nSize < sizeof(U_EMRCREATECOLORSPACEW)){
+ printf(" record corruption HERE\n");
+ return;
+ }
+ const char *blimit = contents + pEmr->emr.nSize;
printf(" ihCS: %u\n", pEmr->ihCS );
printf(" ColorSpace: "); logcolorspacew_print(pEmr->lcs); printf("\n");
printf(" dwFlags: 0x%8.8X\n", pEmr->dwFlags );
printf(" cbData: %u\n", pEmr->cbData );
printf(" Data(hexvalues):");
if(pEmr->dwFlags & 1){
+ IF_MEM_UNSAFE_PRINT_AND_RETURN(contents, pEmr->cbData, blimit);
for(i=0; i<pEmr->cbData; i++){
printf("[%d]:%2.2X ",i,pEmr->Data[i]);
}
@@ -2267,145 +2502,154 @@ void U_EMRCREATECOLORSPACEW_print(const char *contents){
*/
int U_emf_onerec_print(const char *contents, const char *blimit, int recnum, size_t off){
PU_ENHMETARECORD lpEMFR = (PU_ENHMETARECORD)(contents + off);
- unsigned int size;
-
- printf("%-30srecord:%5d type:%-4d offset:%8d rsize:%8d\n",U_emr_names(lpEMFR->iType),recnum,lpEMFR->iType,(int) off,lpEMFR->nSize);
- size = lpEMFR->nSize;
- contents += off;
+ uint32_t nSize;
+ uint32_t iType;
+ const char *record = contents + off;
- /* Check that the record size is OK, abort if not.
- Pointer math might wrap, so check both sides of the range */
- if(size < sizeof(U_EMR) ||
- contents + size - 1 >= blimit ||
- contents + size - 1 < contents)return(-1);
+ if(record < contents)return(-1); // offset wrapped
+ /* Check that COMMON data in record can be touched without an access violation. If it cannot be
+ this is either a corrupt EMF or one engineered to cause a buffer overflow. Pointer math
+ could wrap so check both sides of the range.
+ */
+ if(!U_emf_record_sizeok(record, blimit, &nSize, &iType, 1))return(-1);
+
+ printf("%-30srecord:%5d type:%-4d offset:%8d rsize:%8d\n",U_emr_names(iType),recnum,iType,(int) off,nSize);
+ fflush(stdout);
+
+ /* print the record header before checking further.
+ Note if this is a corrupt record, but continue anyway.
+ The _print routines will stop at the actual problem and print another corrupt message.
+ */
+ if(!U_emf_record_safe(record)){printf("WARNING: Corrupt record. Emitting fields above the problem.\n");}
+
switch (lpEMFR->iType)
{
- case U_EMR_HEADER: U_EMRHEADER_print(contents); break;
- case U_EMR_POLYBEZIER: U_EMRPOLYBEZIER_print(contents); break;
- case U_EMR_POLYGON: U_EMRPOLYGON_print(contents); break;
- case U_EMR_POLYLINE: U_EMRPOLYLINE_print(contents); break;
- case U_EMR_POLYBEZIERTO: U_EMRPOLYBEZIERTO_print(contents); break;
- case U_EMR_POLYLINETO: U_EMRPOLYLINETO_print(contents); break;
- case U_EMR_POLYPOLYLINE: U_EMRPOLYPOLYLINE_print(contents); break;
- case U_EMR_POLYPOLYGON: U_EMRPOLYPOLYGON_print(contents); break;
- case U_EMR_SETWINDOWEXTEX: U_EMRSETWINDOWEXTEX_print(contents); break;
- case U_EMR_SETWINDOWORGEX: U_EMRSETWINDOWORGEX_print(contents); break;
- case U_EMR_SETVIEWPORTEXTEX: U_EMRSETVIEWPORTEXTEX_print(contents); break;
- case U_EMR_SETVIEWPORTORGEX: U_EMRSETVIEWPORTORGEX_print(contents); break;
- case U_EMR_SETBRUSHORGEX: U_EMRSETBRUSHORGEX_print(contents); break;
- case U_EMR_EOF: U_EMREOF_print(contents); size=0; break;
- case U_EMR_SETPIXELV: U_EMRSETPIXELV_print(contents); break;
- case U_EMR_SETMAPPERFLAGS: U_EMRSETMAPPERFLAGS_print(contents); break;
- case U_EMR_SETMAPMODE: U_EMRSETMAPMODE_print(contents); break;
- case U_EMR_SETBKMODE: U_EMRSETBKMODE_print(contents); break;
- case U_EMR_SETPOLYFILLMODE: U_EMRSETPOLYFILLMODE_print(contents); break;
- case U_EMR_SETROP2: U_EMRSETROP2_print(contents); break;
- case U_EMR_SETSTRETCHBLTMODE: U_EMRSETSTRETCHBLTMODE_print(contents); break;
- case U_EMR_SETTEXTALIGN: U_EMRSETTEXTALIGN_print(contents); break;
- case U_EMR_SETCOLORADJUSTMENT: U_EMRSETCOLORADJUSTMENT_print(contents); break;
- case U_EMR_SETTEXTCOLOR: U_EMRSETTEXTCOLOR_print(contents); break;
- case U_EMR_SETBKCOLOR: U_EMRSETBKCOLOR_print(contents); break;
- case U_EMR_OFFSETCLIPRGN: U_EMROFFSETCLIPRGN_print(contents); break;
- case U_EMR_MOVETOEX: U_EMRMOVETOEX_print(contents); break;
- case U_EMR_SETMETARGN: U_EMRSETMETARGN_print(contents); break;
- case U_EMR_EXCLUDECLIPRECT: U_EMREXCLUDECLIPRECT_print(contents); break;
- case U_EMR_INTERSECTCLIPRECT: U_EMRINTERSECTCLIPRECT_print(contents); break;
- case U_EMR_SCALEVIEWPORTEXTEX: U_EMRSCALEVIEWPORTEXTEX_print(contents); break;
- case U_EMR_SCALEWINDOWEXTEX: U_EMRSCALEWINDOWEXTEX_print(contents); break;
- case U_EMR_SAVEDC: U_EMRSAVEDC_print(contents); break;
- case U_EMR_RESTOREDC: U_EMRRESTOREDC_print(contents); break;
- case U_EMR_SETWORLDTRANSFORM: U_EMRSETWORLDTRANSFORM_print(contents); break;
- case U_EMR_MODIFYWORLDTRANSFORM: U_EMRMODIFYWORLDTRANSFORM_print(contents); break;
- case U_EMR_SELECTOBJECT: U_EMRSELECTOBJECT_print(contents); break;
- case U_EMR_CREATEPEN: U_EMRCREATEPEN_print(contents); break;
- case U_EMR_CREATEBRUSHINDIRECT: U_EMRCREATEBRUSHINDIRECT_print(contents); break;
- case U_EMR_DELETEOBJECT: U_EMRDELETEOBJECT_print(contents); break;
- case U_EMR_ANGLEARC: U_EMRANGLEARC_print(contents); break;
- case U_EMR_ELLIPSE: U_EMRELLIPSE_print(contents); break;
- case U_EMR_RECTANGLE: U_EMRRECTANGLE_print(contents); break;
- case U_EMR_ROUNDRECT: U_EMRROUNDRECT_print(contents); break;
- case U_EMR_ARC: U_EMRARC_print(contents); break;
- case U_EMR_CHORD: U_EMRCHORD_print(contents); break;
- case U_EMR_PIE: U_EMRPIE_print(contents); break;
- case U_EMR_SELECTPALETTE: U_EMRSELECTPALETTE_print(contents); break;
- case U_EMR_CREATEPALETTE: U_EMRCREATEPALETTE_print(contents); break;
- case U_EMR_SETPALETTEENTRIES: U_EMRSETPALETTEENTRIES_print(contents); break;
- case U_EMR_RESIZEPALETTE: U_EMRRESIZEPALETTE_print(contents); break;
- case U_EMR_REALIZEPALETTE: U_EMRREALIZEPALETTE_print(contents); break;
- case U_EMR_EXTFLOODFILL: U_EMREXTFLOODFILL_print(contents); break;
- case U_EMR_LINETO: U_EMRLINETO_print(contents); break;
- case U_EMR_ARCTO: U_EMRARCTO_print(contents); break;
- case U_EMR_POLYDRAW: U_EMRPOLYDRAW_print(contents); break;
- case U_EMR_SETARCDIRECTION: U_EMRSETARCDIRECTION_print(contents); break;
- case U_EMR_SETMITERLIMIT: U_EMRSETMITERLIMIT_print(contents); break;
- case U_EMR_BEGINPATH: U_EMRBEGINPATH_print(contents); break;
- case U_EMR_ENDPATH: U_EMRENDPATH_print(contents); break;
- case U_EMR_CLOSEFIGURE: U_EMRCLOSEFIGURE_print(contents); break;
- case U_EMR_FILLPATH: U_EMRFILLPATH_print(contents); break;
- case U_EMR_STROKEANDFILLPATH: U_EMRSTROKEANDFILLPATH_print(contents); break;
- case U_EMR_STROKEPATH: U_EMRSTROKEPATH_print(contents); break;
- case U_EMR_FLATTENPATH: U_EMRFLATTENPATH_print(contents); break;
- case U_EMR_WIDENPATH: U_EMRWIDENPATH_print(contents); break;
- case U_EMR_SELECTCLIPPATH: U_EMRSELECTCLIPPATH_print(contents); break;
- case U_EMR_ABORTPATH: U_EMRABORTPATH_print(contents); break;
- case U_EMR_UNDEF69: U_EMRUNDEF69_print(contents); break;
- case U_EMR_COMMENT: U_EMRCOMMENT_print(contents, blimit, off); break;
- case U_EMR_FILLRGN: U_EMRFILLRGN_print(contents); break;
- case U_EMR_FRAMERGN: U_EMRFRAMERGN_print(contents); break;
- case U_EMR_INVERTRGN: U_EMRINVERTRGN_print(contents); break;
- case U_EMR_PAINTRGN: U_EMRPAINTRGN_print(contents); break;
- case U_EMR_EXTSELECTCLIPRGN: U_EMREXTSELECTCLIPRGN_print(contents); break;
- case U_EMR_BITBLT: U_EMRBITBLT_print(contents); break;
- case U_EMR_STRETCHBLT: U_EMRSTRETCHBLT_print(contents); break;
- case U_EMR_MASKBLT: U_EMRMASKBLT_print(contents); break;
- case U_EMR_PLGBLT: U_EMRPLGBLT_print(contents); break;
- case U_EMR_SETDIBITSTODEVICE: U_EMRSETDIBITSTODEVICE_print(contents); break;
- case U_EMR_STRETCHDIBITS: U_EMRSTRETCHDIBITS_print(contents); break;
- case U_EMR_EXTCREATEFONTINDIRECTW: U_EMREXTCREATEFONTINDIRECTW_print(contents); break;
- case U_EMR_EXTTEXTOUTA: U_EMREXTTEXTOUTA_print(contents); break;
- case U_EMR_EXTTEXTOUTW: U_EMREXTTEXTOUTW_print(contents); break;
- case U_EMR_POLYBEZIER16: U_EMRPOLYBEZIER16_print(contents); break;
- case U_EMR_POLYGON16: U_EMRPOLYGON16_print(contents); break;
- case U_EMR_POLYLINE16: U_EMRPOLYLINE16_print(contents); break;
- case U_EMR_POLYBEZIERTO16: U_EMRPOLYBEZIERTO16_print(contents); break;
- case U_EMR_POLYLINETO16: U_EMRPOLYLINETO16_print(contents); break;
- case U_EMR_POLYPOLYLINE16: U_EMRPOLYPOLYLINE16_print(contents); break;
- case U_EMR_POLYPOLYGON16: U_EMRPOLYPOLYGON16_print(contents); break;
- case U_EMR_POLYDRAW16: U_EMRPOLYDRAW16_print(contents); break;
- case U_EMR_CREATEMONOBRUSH: U_EMRCREATEMONOBRUSH_print(contents); break;
- case U_EMR_CREATEDIBPATTERNBRUSHPT: U_EMRCREATEDIBPATTERNBRUSHPT_print(contents); break;
- case U_EMR_EXTCREATEPEN: U_EMREXTCREATEPEN_print(contents); break;
- case U_EMR_POLYTEXTOUTA: U_EMRPOLYTEXTOUTA_print(contents); break;
- case U_EMR_POLYTEXTOUTW: U_EMRPOLYTEXTOUTW_print(contents); break;
- case U_EMR_SETICMMODE: U_EMRSETICMMODE_print(contents); break;
- case U_EMR_CREATECOLORSPACE: U_EMRCREATECOLORSPACE_print(contents); break;
- case U_EMR_SETCOLORSPACE: U_EMRSETCOLORSPACE_print(contents); break;
- case U_EMR_DELETECOLORSPACE: U_EMRDELETECOLORSPACE_print(contents); break;
- case U_EMR_GLSRECORD: U_EMRGLSRECORD_print(contents); break;
- case U_EMR_GLSBOUNDEDRECORD: U_EMRGLSBOUNDEDRECORD_print(contents); break;
- case U_EMR_PIXELFORMAT: U_EMRPIXELFORMAT_print(contents); break;
- case U_EMR_DRAWESCAPE: U_EMRDRAWESCAPE_print(contents); break;
- case U_EMR_EXTESCAPE: U_EMREXTESCAPE_print(contents); break;
- case U_EMR_UNDEF107: U_EMRUNDEF107_print(contents); break;
- case U_EMR_SMALLTEXTOUT: U_EMRSMALLTEXTOUT_print(contents); break;
- case U_EMR_FORCEUFIMAPPING: U_EMRFORCEUFIMAPPING_print(contents); break;
- case U_EMR_NAMEDESCAPE: U_EMRNAMEDESCAPE_print(contents); break;
- case U_EMR_COLORCORRECTPALETTE: U_EMRCOLORCORRECTPALETTE_print(contents); break;
- case U_EMR_SETICMPROFILEA: U_EMRSETICMPROFILEA_print(contents); break;
- case U_EMR_SETICMPROFILEW: U_EMRSETICMPROFILEW_print(contents); break;
- case U_EMR_ALPHABLEND: U_EMRALPHABLEND_print(contents); break;
- case U_EMR_SETLAYOUT: U_EMRSETLAYOUT_print(contents); break;
- case U_EMR_TRANSPARENTBLT: U_EMRTRANSPARENTBLT_print(contents); break;
- case U_EMR_UNDEF117: U_EMRUNDEF117_print(contents); break;
- case U_EMR_GRADIENTFILL: U_EMRGRADIENTFILL_print(contents); break;
- case U_EMR_SETLINKEDUFIS: U_EMRSETLINKEDUFIS_print(contents); break;
- case U_EMR_SETTEXTJUSTIFICATION: U_EMRSETTEXTJUSTIFICATION_print(contents); break;
- case U_EMR_COLORMATCHTOTARGETW: U_EMRCOLORMATCHTOTARGETW_print(contents); break;
- case U_EMR_CREATECOLORSPACEW: U_EMRCREATECOLORSPACEW_print(contents); break;
- default: U_EMRNOTIMPLEMENTED_print("?",contents); break;
+ case U_EMR_HEADER: U_EMRHEADER_print(record); break;
+ case U_EMR_POLYBEZIER: U_EMRPOLYBEZIER_print(record); break;
+ case U_EMR_POLYGON: U_EMRPOLYGON_print(record); break;
+ case U_EMR_POLYLINE: U_EMRPOLYLINE_print(record); break;
+ case U_EMR_POLYBEZIERTO: U_EMRPOLYBEZIERTO_print(record); break;
+ case U_EMR_POLYLINETO: U_EMRPOLYLINETO_print(record); break;
+ case U_EMR_POLYPOLYLINE: U_EMRPOLYPOLYLINE_print(record); break;
+ case U_EMR_POLYPOLYGON: U_EMRPOLYPOLYGON_print(record); break;
+ case U_EMR_SETWINDOWEXTEX: U_EMRSETWINDOWEXTEX_print(record); break;
+ case U_EMR_SETWINDOWORGEX: U_EMRSETWINDOWORGEX_print(record); break;
+ case U_EMR_SETVIEWPORTEXTEX: U_EMRSETVIEWPORTEXTEX_print(record); break;
+ case U_EMR_SETVIEWPORTORGEX: U_EMRSETVIEWPORTORGEX_print(record); break;
+ case U_EMR_SETBRUSHORGEX: U_EMRSETBRUSHORGEX_print(record); break;
+ case U_EMR_EOF: U_EMREOF_print(record); nSize=0; break;
+ case U_EMR_SETPIXELV: U_EMRSETPIXELV_print(record); break;
+ case U_EMR_SETMAPPERFLAGS: U_EMRSETMAPPERFLAGS_print(record); break;
+ case U_EMR_SETMAPMODE: U_EMRSETMAPMODE_print(record); break;
+ case U_EMR_SETBKMODE: U_EMRSETBKMODE_print(record); break;
+ case U_EMR_SETPOLYFILLMODE: U_EMRSETPOLYFILLMODE_print(record); break;
+ case U_EMR_SETROP2: U_EMRSETROP2_print(record); break;
+ case U_EMR_SETSTRETCHBLTMODE: U_EMRSETSTRETCHBLTMODE_print(record); break;
+ case U_EMR_SETTEXTALIGN: U_EMRSETTEXTALIGN_print(record); break;
+ case U_EMR_SETCOLORADJUSTMENT: U_EMRSETCOLORADJUSTMENT_print(record); break;
+ case U_EMR_SETTEXTCOLOR: U_EMRSETTEXTCOLOR_print(record); break;
+ case U_EMR_SETBKCOLOR: U_EMRSETBKCOLOR_print(record); break;
+ case U_EMR_OFFSETCLIPRGN: U_EMROFFSETCLIPRGN_print(record); break;
+ case U_EMR_MOVETOEX: U_EMRMOVETOEX_print(record); break;
+ case U_EMR_SETMETARGN: U_EMRSETMETARGN_print(record); break;
+ case U_EMR_EXCLUDECLIPRECT: U_EMREXCLUDECLIPRECT_print(record); break;
+ case U_EMR_INTERSECTCLIPRECT: U_EMRINTERSECTCLIPRECT_print(record); break;
+ case U_EMR_SCALEVIEWPORTEXTEX: U_EMRSCALEVIEWPORTEXTEX_print(record); break;
+ case U_EMR_SCALEWINDOWEXTEX: U_EMRSCALEWINDOWEXTEX_print(record); break;
+ case U_EMR_SAVEDC: U_EMRSAVEDC_print(record); break;
+ case U_EMR_RESTOREDC: U_EMRRESTOREDC_print(record); break;
+ case U_EMR_SETWORLDTRANSFORM: U_EMRSETWORLDTRANSFORM_print(record); break;
+ case U_EMR_MODIFYWORLDTRANSFORM: U_EMRMODIFYWORLDTRANSFORM_print(record); break;
+ case U_EMR_SELECTOBJECT: U_EMRSELECTOBJECT_print(record); break;
+ case U_EMR_CREATEPEN: U_EMRCREATEPEN_print(record); break;
+ case U_EMR_CREATEBRUSHINDIRECT: U_EMRCREATEBRUSHINDIRECT_print(record); break;
+ case U_EMR_DELETEOBJECT: U_EMRDELETEOBJECT_print(record); break;
+ case U_EMR_ANGLEARC: U_EMRANGLEARC_print(record); break;
+ case U_EMR_ELLIPSE: U_EMRELLIPSE_print(record); break;
+ case U_EMR_RECTANGLE: U_EMRRECTANGLE_print(record); break;
+ case U_EMR_ROUNDRECT: U_EMRROUNDRECT_print(record); break;
+ case U_EMR_ARC: U_EMRARC_print(record); break;
+ case U_EMR_CHORD: U_EMRCHORD_print(record); break;
+ case U_EMR_PIE: U_EMRPIE_print(record); break;
+ case U_EMR_SELECTPALETTE: U_EMRSELECTPALETTE_print(record); break;
+ case U_EMR_CREATEPALETTE: U_EMRCREATEPALETTE_print(record); break;
+ case U_EMR_SETPALETTEENTRIES: U_EMRSETPALETTEENTRIES_print(record); break;
+ case U_EMR_RESIZEPALETTE: U_EMRRESIZEPALETTE_print(record); break;
+ case U_EMR_REALIZEPALETTE: U_EMRREALIZEPALETTE_print(record); break;
+ case U_EMR_EXTFLOODFILL: U_EMREXTFLOODFILL_print(record); break;
+ case U_EMR_LINETO: U_EMRLINETO_print(record); break;
+ case U_EMR_ARCTO: U_EMRARCTO_print(record); break;
+ case U_EMR_POLYDRAW: U_EMRPOLYDRAW_print(record); break;
+ case U_EMR_SETARCDIRECTION: U_EMRSETARCDIRECTION_print(record); break;
+ case U_EMR_SETMITERLIMIT: U_EMRSETMITERLIMIT_print(record); break;
+ case U_EMR_BEGINPATH: U_EMRBEGINPATH_print(record); break;
+ case U_EMR_ENDPATH: U_EMRENDPATH_print(record); break;
+ case U_EMR_CLOSEFIGURE: U_EMRCLOSEFIGURE_print(record); break;
+ case U_EMR_FILLPATH: U_EMRFILLPATH_print(record); break;
+ case U_EMR_STROKEANDFILLPATH: U_EMRSTROKEANDFILLPATH_print(record); break;
+ case U_EMR_STROKEPATH: U_EMRSTROKEPATH_print(record); break;
+ case U_EMR_FLATTENPATH: U_EMRFLATTENPATH_print(record); break;
+ case U_EMR_WIDENPATH: U_EMRWIDENPATH_print(record); break;
+ case U_EMR_SELECTCLIPPATH: U_EMRSELECTCLIPPATH_print(record); break;
+ case U_EMR_ABORTPATH: U_EMRABORTPATH_print(record); break;
+ case U_EMR_UNDEF69: U_EMRUNDEF69_print(record); break;
+ case U_EMR_COMMENT: U_EMRCOMMENT_print(record, off); break;
+ case U_EMR_FILLRGN: U_EMRFILLRGN_print(record); break;
+ case U_EMR_FRAMERGN: U_EMRFRAMERGN_print(record); break;
+ case U_EMR_INVERTRGN: U_EMRINVERTRGN_print(record); break;
+ case U_EMR_PAINTRGN: U_EMRPAINTRGN_print(record); break;
+ case U_EMR_EXTSELECTCLIPRGN: U_EMREXTSELECTCLIPRGN_print(record); break;
+ case U_EMR_BITBLT: U_EMRBITBLT_print(record); break;
+ case U_EMR_STRETCHBLT: U_EMRSTRETCHBLT_print(record); break;
+ case U_EMR_MASKBLT: U_EMRMASKBLT_print(record); break;
+ case U_EMR_PLGBLT: U_EMRPLGBLT_print(record); break;
+ case U_EMR_SETDIBITSTODEVICE: U_EMRSETDIBITSTODEVICE_print(record); break;
+ case U_EMR_STRETCHDIBITS: U_EMRSTRETCHDIBITS_print(record); break;
+ case U_EMR_EXTCREATEFONTINDIRECTW: U_EMREXTCREATEFONTINDIRECTW_print(record); break;
+ case U_EMR_EXTTEXTOUTA: U_EMREXTTEXTOUTA_print(record); break;
+ case U_EMR_EXTTEXTOUTW: U_EMREXTTEXTOUTW_print(record); break;
+ case U_EMR_POLYBEZIER16: U_EMRPOLYBEZIER16_print(record); break;
+ case U_EMR_POLYGON16: U_EMRPOLYGON16_print(record); break;
+ case U_EMR_POLYLINE16: U_EMRPOLYLINE16_print(record); break;
+ case U_EMR_POLYBEZIERTO16: U_EMRPOLYBEZIERTO16_print(record); break;
+ case U_EMR_POLYLINETO16: U_EMRPOLYLINETO16_print(record); break;
+ case U_EMR_POLYPOLYLINE16: U_EMRPOLYPOLYLINE16_print(record); break;
+ case U_EMR_POLYPOLYGON16: U_EMRPOLYPOLYGON16_print(record); break;
+ case U_EMR_POLYDRAW16: U_EMRPOLYDRAW16_print(record); break;
+ case U_EMR_CREATEMONOBRUSH: U_EMRCREATEMONOBRUSH_print(record); break;
+ case U_EMR_CREATEDIBPATTERNBRUSHPT: U_EMRCREATEDIBPATTERNBRUSHPT_print(record); break;
+ case U_EMR_EXTCREATEPEN: U_EMREXTCREATEPEN_print(record); break;
+ case U_EMR_POLYTEXTOUTA: U_EMRPOLYTEXTOUTA_print(record); break;
+ case U_EMR_POLYTEXTOUTW: U_EMRPOLYTEXTOUTW_print(record); break;
+ case U_EMR_SETICMMODE: U_EMRSETICMMODE_print(record); break;
+ case U_EMR_CREATECOLORSPACE: U_EMRCREATECOLORSPACE_print(record); break;
+ case U_EMR_SETCOLORSPACE: U_EMRSETCOLORSPACE_print(record); break;
+ case U_EMR_DELETECOLORSPACE: U_EMRDELETECOLORSPACE_print(record); break;
+ case U_EMR_GLSRECORD: U_EMRGLSRECORD_print(record); break;
+ case U_EMR_GLSBOUNDEDRECORD: U_EMRGLSBOUNDEDRECORD_print(record); break;
+ case U_EMR_PIXELFORMAT: U_EMRPIXELFORMAT_print(record); break;
+ case U_EMR_DRAWESCAPE: U_EMRDRAWESCAPE_print(record); break;
+ case U_EMR_EXTESCAPE: U_EMREXTESCAPE_print(record); break;
+ case U_EMR_UNDEF107: U_EMRUNDEF107_print(record); break;
+ case U_EMR_SMALLTEXTOUT: U_EMRSMALLTEXTOUT_print(record); break;
+ case U_EMR_FORCEUFIMAPPING: U_EMRFORCEUFIMAPPING_print(record); break;
+ case U_EMR_NAMEDESCAPE: U_EMRNAMEDESCAPE_print(record); break;
+ case U_EMR_COLORCORRECTPALETTE: U_EMRCOLORCORRECTPALETTE_print(record); break;
+ case U_EMR_SETICMPROFILEA: U_EMRSETICMPROFILEA_print(record); break;
+ case U_EMR_SETICMPROFILEW: U_EMRSETICMPROFILEW_print(record); break;
+ case U_EMR_ALPHABLEND: U_EMRALPHABLEND_print(record); break;
+ case U_EMR_SETLAYOUT: U_EMRSETLAYOUT_print(record); break;
+ case U_EMR_TRANSPARENTBLT: U_EMRTRANSPARENTBLT_print(record); break;
+ case U_EMR_UNDEF117: U_EMRUNDEF117_print(record); break;
+ case U_EMR_GRADIENTFILL: U_EMRGRADIENTFILL_print(record); break;
+ case U_EMR_SETLINKEDUFIS: U_EMRSETLINKEDUFIS_print(record); break;
+ case U_EMR_SETTEXTJUSTIFICATION: U_EMRSETTEXTJUSTIFICATION_print(record); break;
+ case U_EMR_COLORMATCHTOTARGETW: U_EMRCOLORMATCHTOTARGETW_print(record); break;
+ case U_EMR_CREATECOLORSPACEW: U_EMRCREATECOLORSPACEW_print(record); break;
+ default: U_EMRNOTIMPLEMENTED_print("?",record); break;
} //end of switch
- return(size);
+ return(nSize);
}
diff --git a/src/libuemf/uemf_print.h b/src/libuemf/uemf_print.h
index 896de659e..6568b4cfa 100644
--- a/src/libuemf/uemf_print.h
+++ b/src/libuemf/uemf_print.h
@@ -6,11 +6,11 @@
/*
File: uemf_print.h
-Version: 0.0.5
-Date: 14-FEB-2013
+Version: 0.0.7
+Date: 24-MAR-2015
Author: David Mathog, Biology Division, Caltech
email: mathog@caltech.edu
-Copyright: 2013 David Mathog and California Institute of Technology (Caltech)
+Copyright: 2015 David Mathog and California Institute of Technology (Caltech)
*/
#ifndef _UEMF_PRINT_
@@ -44,17 +44,17 @@ void panose_print(U_PANOSE panose);
void logfont_print(U_LOGFONT lf);
void logfont_panose_print(U_LOGFONT_PANOSE lfp);
void bitmapinfoheader_print(const char *Bmih);
-void bitmapinfo_print(const char *Bmi);
+void bitmapinfo_print(const char *Bmi, const char *blimit);
void blend_print(U_BLEND blend);
void extlogpen_print(const PU_EXTLOGPEN elp);
void logpen_print(U_LOGPEN lp);
void logpltntry_print(U_LOGPLTNTRY lpny);
void logpalette_print(const PU_LOGPALETTE lp);
void rgndataheader_print(U_RGNDATAHEADER rdh);
-void rgndata_print(const PU_RGNDATA rd);
+void rgndata_print(const PU_RGNDATA rd, const char *blimit);
void coloradjustment_print(U_COLORADJUSTMENT ca);
void pixelformatdescriptor_print(U_PIXELFORMATDESCRIPTOR pfd);
-void emrtext_print(const char *emt, const char *record, int type);
+void emrtext_print(const char *emt, const char *record, const char *blimit, int type);
/* prototypes for EMR records */
void U_EMRNOTIMPLEMENTED_print(const char *name, const char *contents, int recnum, int off);
@@ -126,7 +126,7 @@ void U_EMRFLATTENPATH_print(const char *contents);
void U_EMRWIDENPATH_print(const char *contents);
void U_EMRSELECTCLIPPATH_print(const char *contents);
void U_EMRABORTPATH_print(const char *contents);
-void U_EMRCOMMENT_print(const char *contents, const char *blimit, size_t off);
+void U_EMRCOMMENT_print(const char *contents, size_t off);
void U_EMRFILLRGN_print(const char *contents);
void U_EMRFRAMERGN_print(const char *contents);
void U_EMRINVERTRGN_print(const char *contents);
diff --git a/src/libuemf/uemf_safe.c b/src/libuemf/uemf_safe.c
new file mode 100644
index 000000000..36284d60e
--- /dev/null
+++ b/src/libuemf/uemf_safe.c
@@ -0,0 +1,1202 @@
+/**
+ @file uemf_safe.c
+
+ @brief Functions for checking EMF records for memory issues.
+
+ EMF records come in a variety of sizes, and some types have variable sizes.
+ These functions check the record types and report if there are any issues
+ that could cause a memory access problem. All counts and offsets are examined
+ and the data structure checked so that no referenced byte is outside of the
+ declared size of the record.
+
+ Many variables are initialized to zero even though they will always be set because
+ some versions of gcc give spurious "may be used uninitialized" warnings otherwise.
+*/
+
+/*
+File: uemf_safe.c
+Version: 0.0.4
+Date: 23-APR-2015
+Author: David Mathog, Biology Division, Caltech
+email: mathog@caltech.edu
+Copyright: 2015 David Mathog and California Institute of Technology (Caltech)
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stddef.h> /* for offsetof() macro */
+#include "uemf.h"
+#include "uemf_endian.h" // for u_emf_record_sizeok
+
+// hide almost everuything in here from Doxygen
+//! \cond
+
+/**
+ \brief Test a U_EXTLOGPEN object.
+ \param elp PU_EXTLOGPEN object
+ \param blimit one byte past the end of the record
+*/
+int extlogpen_safe(
+ PU_EXTLOGPEN elp,
+ const char *blimit
+ ){
+ int count=elp->elpNumEntries;
+ if(IS_MEM_UNSAFE(&(elp->elpStyleEntry), count*4, blimit))return(0);
+ return(1);
+}
+
+/**
+ \brief Test a U_EMRTEXT record
+ \param pemt Pointer to a U_EMRTEXT record
+ \param record Pointer to the start of the record which contains this U_EMRTEXT
+ \param blimit one byte past the end of the record.
+*/
+int emrtext_safe(
+ PU_EMRTEXT pemt,
+ const char *record,
+ const char *blimit
+ ){
+ int off;
+ uint32_t count = pemt->nChars;
+ uint32_t fOptions = pemt->fOptions;
+ uint32_t offDx = 0;
+ off = sizeof(U_EMRTEXT);
+ if(!(fOptions & U_ETO_NO_RECT)){
+ if(IS_MEM_UNSAFE(pemt, sizeof(U_RECTL), blimit))return(0);
+ off+=sizeof(U_RECTL);
+ }
+ offDx = *(uint32_t *)((char *)pemt +off);
+ if(IS_MEM_UNSAFE(pemt, off + 4, blimit))return(0);
+ if(IS_MEM_UNSAFE(record, offDx + count*4, blimit))return(0);
+ return(1);
+}
+
+/**
+ \return 1 on success, 0 on failure
+ \brief Test a U_RGNDATA object.
+ \param rd pointer to a U_RGNDATA object.
+ \param cbRgnData size of the U_RGNDATA object.
+*/
+int rgndata_safe(
+ PU_RGNDATA rd,
+ int cbRgnData
+ ){
+ int count = rd->rdh.nCount;
+ if(4*count + (int)sizeof(U_RGNDATAHEADER) > cbRgnData)return(0);
+ return(1);
+}
+
+
+/**
+ \return 1 on success, 0 on failure
+ \brief Test a U_BITMAPINFO object.
+ \param Bmi pointer to a U_BITMAPINFO object.
+ \param blimit one byte past the end of the record.
+*/
+int bitmapinfo_safe(
+ const char *Bmi,
+ const char *blimit
+ ){
+ int ClrUsed;
+ if(IS_MEM_UNSAFE(Bmi, offsetof(U_BITMAPINFO,bmiHeader) + sizeof(U_BITMAPINFOHEADER), blimit))return(0);
+ ClrUsed = get_real_color_count(Bmi + offsetof(U_BITMAPINFO,bmiHeader));
+ if(ClrUsed && IS_MEM_UNSAFE(Bmi, offsetof(U_BITMAPINFO,bmiColors) + ClrUsed*sizeof(U_RGBQUAD), blimit))return(0);
+ return(1);
+}
+
+/**
+ \brief Check that the bitmap in the specified DIB is compatible with the record size
+
+ \return 1 on success, 0 on failure
+ \param record EMF record that contains a DIB pixel array
+ \param iUsage DIBcolors Enumeration
+ \param offBmi offset from the start of the record to the start of the bitmapinfo structure
+ \param cbBmi declared space for the bitmapinfo structure in the record
+ \param offBits offset from the start of the record to the start of the bitmap
+ \param cbBits declared space for the bitmap in the record (amount used may be less than this)
+ \param blimit one byte past the end of the record.
+
+ This method can only test DIBs that hold Microsoft's various bitmap types. PNG or JPG is just a bag
+ of bytes, and there is no possible way to derive from the known width and height how big it should be.
+*/
+int DIB_safe(
+ const char *record,
+ uint32_t iUsage,
+ uint32_t offBmi,
+ uint32_t cbBmi,
+ uint32_t offBits,
+ uint32_t cbBits,
+ const char *blimit
+ ){
+ int dibparams = U_BI_UNKNOWN; // type of image not yet determined
+ const char *px = NULL; // DIB pixels
+ const U_RGBQUAD *ct = NULL; // DIB color table
+ int bs;
+ int usedbytes;
+
+ if(!cbBmi)return(1); // No DIB in a record where it is optional
+ if(IS_MEM_UNSAFE(record, offBmi + cbBmi, blimit))return(0);
+ if(!bitmapinfo_safe(record + offBmi, blimit))return(0); // checks the number of colors
+ if(cbBits && IS_MEM_UNSAFE(record, offBits + cbBits, blimit))return(0);
+ if(iUsage == U_DIB_RGB_COLORS){
+ uint32_t width, height, colortype, numCt, invert; // these values will be set in get_DIB_params
+ // next call returns pointers and values, but allocates no memory
+ dibparams = get_DIB_params(record, offBits, offBmi, &px, (const U_RGBQUAD **) &ct,
+ &numCt, &width, &height, &colortype, &invert);
+
+ // sanity checking
+ if(numCt && colortype >= U_BCBM_COLOR16)return(0); //color tables not used above 16 bit pixels
+ if(!numCt && colortype < U_BCBM_COLOR16)return(0); //color tables mandatory for < 16 bit
+
+ if(dibparams ==U_BI_RGB){
+ // this is the only DIB type where we can calculate how big it should be when stored in the EMF file
+ bs = colortype/8;
+ if(bs<1){
+ usedbytes = (width*colortype + 7)/8; // width of line in fully and partially occupied bytes
+ }
+ else {
+ usedbytes = width*bs;
+ }
+ if(IS_MEM_UNSAFE(record+offBits, usedbytes, blimit))return(0);
+ }
+ }
+ return(1);
+}
+
+
+/* **********************************************************************************************
+These functions contain shared code used by various U_EMR*_safe functions. These should NEVER be called
+by end user code and to further that end prototypes are NOT provided and they are hidden from Doxygen.
+
+
+ These all have this form:
+
+ void core1_safe(const char *record){
+
+ but some do not actually use torev.
+
+
+
+*********************************************************************************************** */
+
+// all core*_safe call this, U_EMRSETMARGN_safe and some others all it directly
+// numbered as core5 to be consistent with uemf.c, but must appear before the others as there is no prototype
+// sizeof(U_ENHMETARECORD) bytes in the record
+int core5_safe(const char *record, int minSize){
+ PU_EMR pEmr = (PU_EMR)(record);
+ if((int) pEmr->nSize < minSize)return(0);
+ return(1);
+}
+
+// Functions with the same form starting with U_EMRPOLYBEZIER_safe
+int core1_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRPOLYLINETO))return(0);
+ PU_EMRPOLYLINETO pEmr = (PU_EMRPOLYLINETO) (record);
+ int count=pEmr->cptl;
+ const char *blimit = record + pEmr->emr.nSize;
+ if(IS_MEM_UNSAFE(pEmr->aptl, count*sizeof(U_POINTL), blimit))return(0);
+ return(1);
+}
+
+// Functions with the same form starting with U_EMRPOLYPOLYLINE_safe
+int core2_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRPOLYPOLYLINE))return(0);
+ PU_EMRPOLYPOLYLINE pEmr = (PU_EMRPOLYPOLYLINE) (record);
+ int count = pEmr->cptl;
+ int nPolys = pEmr->nPolys;
+ const char * blimit = record + pEmr->emr.nSize;
+ if(IS_MEM_UNSAFE(pEmr->aPolyCounts, nPolys*4, blimit))return(0);
+ record += sizeof(U_EMRPOLYPOLYLINE) - 4 + sizeof(uint32_t)* nPolys;
+ if(IS_MEM_UNSAFE(record, count*sizeof(U_POINTL), blimit))return(0);
+ return(1);
+}
+
+
+// Functions with the same form starting with U_EMRSETMAPMODE_safe
+int core3_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRSETMAPMODE))return(0);
+ return(1);
+}
+
+// Functions taking a single U_RECT or U_RECTL, starting with U_EMRELLIPSE_safe, also U_EMRFILLPATH_safe,
+int core4_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRELLIPSE))return(0);
+ return(1);
+}
+
+// Functions with the same form starting with U_EMRPOLYBEZIER16_safe
+int core6_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRPOLYBEZIER16))return(0);
+ PU_EMRPOLYBEZIER16 pEmr = (PU_EMRPOLYBEZIER16) (record);
+ int count=pEmr->cpts;
+ const char *blimit = record + pEmr->emr.nSize;
+ if(IS_MEM_UNSAFE(pEmr->apts, count*sizeof(U_POINT16), blimit))return(0);
+ return(1);
+}
+
+
+// Records with the same form starting with U_EMRSETWINDOWEXTEX_safe, that is, all with two uint32_t values after the emr
+int core7_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRSETWINDOWEXTEX))return(0);
+ return(1);
+}
+
+// For U_EMREXTTEXTOUTA and U_EMREXTTEXTOUTW, type=0 for the first one
+int core8_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMREXTTEXTOUTA))return(0);
+ PU_EMREXTTEXTOUTA pEmr = (PU_EMREXTTEXTOUTA) (record);
+ const char *blimit = record + pEmr->emr.nSize;
+ if(!emrtext_safe(&(pEmr->emrtext),record,blimit))return(0);
+ return(1);
+}
+
+// Functions that take a rect and a pair of points, starting with U_EMRARC_safe
+int core9_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRARC))return(0);
+ return(1);
+}
+
+// Functions with the same form starting with U_EMRPOLYPOLYLINE16_safe
+int core10_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRPOLYPOLYLINE16))return(0);
+ PU_EMRPOLYPOLYLINE16 pEmr = (PU_EMRPOLYPOLYLINE16) (record);
+ int count = pEmr->cpts;
+ int nPolys = pEmr->nPolys;
+ const char *blimit = record + pEmr->emr.nSize;
+ if(IS_MEM_UNSAFE(pEmr->aPolyCounts, nPolys*4, blimit))return(0);
+ record += sizeof(U_EMRPOLYPOLYLINE16) - 4 + sizeof(uint32_t)* nPolys;
+ if(IS_MEM_UNSAFE(record, count*sizeof(U_POINT16), blimit))return(0);
+ return(1);
+}
+
+// Functions with the same form starting with U_EMRINVERTRGN_safe and U_EMRPAINTRGN_safe,
+int core11_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRINVERTRGN))return(0);
+ PU_EMRINVERTRGN pEmr = (PU_EMRINVERTRGN)(record);
+ int cbRgnData = pEmr->cbRgnData;
+ const char *blimit = record + pEmr->emr.nSize;
+ if(IS_MEM_UNSAFE(pEmr->RgnData, cbRgnData, blimit))return(0);
+ return(rgndata_safe(pEmr->RgnData, cbRgnData));
+}
+
+
+// common code for U_EMRCREATEMONOBRUSH_safe and U_EMRCREATEDIBPATTERNBRUSHPT_safe,
+int core12_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRCREATEMONOBRUSH))return(0);
+ PU_EMRCREATEMONOBRUSH pEmr = (PU_EMRCREATEMONOBRUSH) (record);
+ const char *blimit = record + pEmr->emr.nSize;
+ U_OFFBMI offBmi = pEmr->offBmi;
+ U_CBBMI cbBmi = pEmr->cbBmi;
+ U_OFFBITS offBits = pEmr->offBits;
+ U_CBBITS cbBits = pEmr->cbBits;
+ uint32_t iUsage = pEmr->iUsage;
+ return(DIB_safe(record, iUsage, offBmi, cbBmi, offBits, cbBits, blimit));
+}
+
+// common code for U_EMRALPHABLEND_safe and U_EMRTRANSPARENTBLT_safe,
+int core13_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRALPHABLEND))return(0);
+ PU_EMRALPHABLEND pEmr = (PU_EMRALPHABLEND) (record);
+ const char *blimit = record + pEmr->emr.nSize;
+ U_OFFBMISRC offBmiSrc = pEmr->offBmiSrc;
+ U_CBBMISRC cbBmiSrc = pEmr->cbBmiSrc;
+ U_OFFBITSSRC offBitsSrc = pEmr->offBitsSrc;
+ U_CBBITS cbBitsSrc = pEmr->cbBitsSrc;
+ uint32_t iUsageSrc = pEmr->iUsageSrc;
+ return(DIB_safe(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit));
+}
+
+/* **********************************************************************************************
+These are the core EMR_safe functions, each converts a particular type of record.
+All operate in place on the chunk of memory holding that record.
+Some of these have offsets or counts which, if corrupt or evil would result in access outside
+ the record. These cases return a status value of 0 if that happens, 1 on success. Other
+ records which do not have these issues do not return a status value.
+They are listed in order by the corresponding U_EMR_* index number.
+*********************************************************************************************** */
+
+/**
+ All of the record level (hidden) functions have this form:
+ \brief Convert a pointer to a U_EMR_whatever record which has not been implemented.
+ \param record pointer to a buffer holding the EMR record
+ \param torev 1 for native to reversed, 0 for reversed to native
+*/
+int U_EMRNOTIMPLEMENTED_safe(const char *record){
+ fprintf(stderr,"EMF WARNING: could not safety check record because that type has not been implemented!\n");
+ return(core5_safe(record, sizeof(U_EMR)));
+}
+
+// U_EMRHEADER 1
+int U_EMRHEADER_safe(const char *record){
+ // use _MIN form so that it accepts very old EMF files
+ return(core5_safe(record, U_SIZE_EMRHEADER_MIN));
+}
+
+// U_EMRPOLYBEZIER 2
+int U_EMRPOLYBEZIER_safe(const char *record){
+ return(core1_safe(record));
+}
+
+// U_EMRPOLYGON 3
+int U_EMRPOLYGON_safe(const char *record){
+ return(core1_safe(record));
+}
+
+// U_EMRPOLYLINE 4
+int U_EMRPOLYLINE_safe(const char *record){
+ return(core1_safe(record));
+}
+
+// U_EMRPOLYBEZIERTO 5
+int U_EMRPOLYBEZIERTO_safe(const char *record){
+ return(core1_safe(record));
+}
+
+// U_EMRPOLYLINETO 6
+int U_EMRPOLYLINETO_safe(const char *record){
+ return(core1_safe(record));
+}
+
+// U_EMRPOLYPOLYLINE 7
+int U_EMRPOLYPOLYLINE_safe(const char *record){
+ return(core2_safe(record));
+}
+
+// U_EMRPOLYPOLYGON 8
+int U_EMRPOLYPOLYGON_safe(const char *record){
+ return(core2_safe(record));
+}
+
+// U_EMRSETWINDOWEXTEX 9
+int U_EMRSETWINDOWEXTEX_safe(const char *record){
+ return(core7_safe(record));
+}
+
+// U_EMRSETWINDOWORGEX 10
+int U_EMRSETWINDOWORGEX_safe(const char *record){
+ return(core7_safe(record));
+}
+
+// U_EMRSETVIEWPORTEXTEX 11
+int U_EMRSETVIEWPORTEXTEX_safe(const char *record){
+ return(core7_safe(record));
+}
+
+// U_EMRSETVIEWPORTORGEX 12
+int U_EMRSETVIEWPORTORGEX_safe(const char *record){
+ return(core7_safe(record));
+}
+
+// U_EMRSETBRUSHORGEX 13
+int U_EMRSETBRUSHORGEX_safe(const char *record){
+ return(core7_safe(record));
+}
+
+// U_EMREOF 14
+int U_EMREOF_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMREOF))return(0);
+ PU_EMREOF pEmr = (PU_EMREOF)(record);
+ const char *blimit = record + pEmr->emr.nSize;
+ int cbPalEntries=pEmr->cbPalEntries;
+ if(cbPalEntries){
+ if(IS_MEM_UNSAFE(record, pEmr->offPalEntries + 2*2, blimit))return(0);// 2 16 bit values in U_LOGPALLETE
+ }
+ int off = sizeof(U_EMREOF) + 4 * cbPalEntries;
+ if(IS_MEM_UNSAFE(record, off + 4, blimit))return(0);
+ return(1);
+}
+
+
+// U_EMRSETPIXELV 15
+int U_EMRSETPIXELV_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRSETPIXELV));
+
+}
+
+
+// U_EMRSETMAPPERFLAGS 16
+int U_EMRSETMAPPERFLAGS_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRSETMAPPERFLAGS));
+}
+
+
+// U_EMRSETMAPMODE 17
+int U_EMRSETMAPMODE_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRSETBKMODE 18
+int U_EMRSETBKMODE_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRSETPOLYFILLMODE 19
+int U_EMRSETPOLYFILLMODE_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRSETROP2 20
+int U_EMRSETROP2_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRSETSTRETCHBLTMODE 21
+int U_EMRSETSTRETCHBLTMODE_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRSETTEXTALIGN 22
+int U_EMRSETTEXTALIGN_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRSETCOLORADJUSTMENT 23
+int U_EMRSETCOLORADJUSTMENT_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRSETCOLORADJUSTMENT));
+}
+
+// U_EMRSETTEXTCOLOR 24
+int U_EMRSETTEXTCOLOR_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRSETTEXTCOLOR));
+}
+
+// U_EMRSETBKCOLOR 25
+int U_EMRSETBKCOLOR_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRSETBKCOLOR));
+}
+
+// U_EMROFFSETCLIPRGN 26
+int U_EMROFFSETCLIPRGN_safe(const char *record){
+ return(core7_safe(record));
+}
+
+// U_EMRMOVETOEX 27
+int U_EMRMOVETOEX_safe(const char *record){
+ return(core7_safe(record));
+}
+
+// U_EMRSETMETARGN 28
+int U_EMRSETMETARGN_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRSETMETARGN));
+}
+
+// U_EMREXCLUDECLIPRECT 29
+int U_EMREXCLUDECLIPRECT_safe(const char *record){
+ return(core4_safe(record));
+}
+
+// U_EMRINTERSECTCLIPRECT 30
+int U_EMRINTERSECTCLIPRECT_safe(const char *record){
+ return(core4_safe(record));
+}
+
+// U_EMRSCALEVIEWPORTEXTEX 31
+int U_EMRSCALEVIEWPORTEXTEX_safe(const char *record){
+ return(core4_safe(record));
+}
+
+// U_EMRSCALEWINDOWEXTEX 32
+int U_EMRSCALEWINDOWEXTEX_safe(const char *record){
+ return(core4_safe(record));
+}
+
+// U_EMRSAVEDC 33
+int U_EMRSAVEDC_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRSAVEDC));
+}
+
+// U_EMRRESTOREDC 34
+int U_EMRRESTOREDC_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRSETWORLDTRANSFORM 35
+int U_EMRSETWORLDTRANSFORM_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRSETWORLDTRANSFORM));
+}
+
+// U_EMRMODIFYWORLDTRANSFORM 36
+int U_EMRMODIFYWORLDTRANSFORM_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRMODIFYWORLDTRANSFORM));
+}
+
+// U_EMRSELECTOBJECT 37
+int U_EMRSELECTOBJECT_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRSELECTOBJECT));
+}
+
+// U_EMRCREATEPEN 38
+int U_EMRCREATEPEN_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRCREATEPEN));
+}
+
+// U_EMRCREATEBRUSHINDIRECT 39
+int U_EMRCREATEBRUSHINDIRECT_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRCREATEBRUSHINDIRECT));
+}
+
+// U_EMRDELETEOBJECT 40
+int U_EMRDELETEOBJECT_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRDELETEOBJECT));
+
+}
+
+// U_EMRANGLEARC 41
+int U_EMRANGLEARC_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRANGLEARC));
+}
+
+// U_EMRELLIPSE 42
+int U_EMRELLIPSE_safe(const char *record){
+ return(core4_safe(record));
+}
+
+// U_EMRRECTANGLE 43
+int U_EMRRECTANGLE_safe(const char *record){
+ return(core4_safe(record));
+}
+
+// U_EMRROUNDRECT 44
+int U_EMRROUNDRECT_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRROUNDRECT));
+}
+
+// U_EMRARC 45
+int U_EMRARC_safe(const char *record){
+ return(core9_safe(record));
+}
+
+// U_EMRCHORD 46
+int U_EMRCHORD_safe(const char *record){
+ return(core9_safe(record));
+}
+
+// U_EMRPIE 47
+int U_EMRPIE_safe(const char *record){
+ return(core9_safe(record));
+}
+
+// U_EMRSELECTPALETTE 48
+int U_EMRSELECTPALETTE_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRCREATEPALETTE 49
+int U_EMRCREATEPALETTE_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRCREATEPALETTE));
+}
+
+// U_EMRSETPALETTEENTRIES 50
+int U_EMRSETPALETTEENTRIES_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRSETPALETTEENTRIES));
+}
+
+// U_EMRRESIZEPALETTE 51
+int U_EMRRESIZEPALETTE_safe(const char *record){
+ return(core7_safe(record));
+}
+
+// U_EMRREALIZEPALETTE 52
+int U_EMRREALIZEPALETTE_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRREALIZEPALETTE));
+}
+
+// U_EMREXTFLOODFILL 53
+int U_EMREXTFLOODFILL_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMREXTFLOODFILL));
+}
+
+// U_EMRLINETO 54
+int U_EMRLINETO_safe(const char *record){
+ return(core7_safe(record));
+}
+
+// U_EMRARCTO 55
+int U_EMRARCTO_safe(const char *record){
+ return(core9_safe(record));
+}
+
+// U_EMRPOLYDRAW 56
+int U_EMRPOLYDRAW_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRPOLYDRAW))return(0);
+ PU_EMRPOLYDRAW pEmr = (PU_EMRPOLYDRAW)(record);
+ int count = pEmr->cptl;
+ const char *blimit = record + pEmr->emr.nSize;
+ if(IS_MEM_UNSAFE(pEmr->aptl, count*sizeof(U_POINTL), blimit))return(0);
+ return(1);
+}
+
+// U_EMRSETARCDIRECTION 57
+int U_EMRSETARCDIRECTION_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRSETMITERLIMIT 58
+int U_EMRSETMITERLIMIT_safe(const char *record){
+ return(core3_safe(record));
+}
+
+
+// U_EMRBEGINPATH 59
+int U_EMRBEGINPATH_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRBEGINPATH));
+}
+
+// U_EMRENDPATH 60
+int U_EMRENDPATH_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRENDPATH));
+}
+
+// U_EMRCLOSEFIGURE 61
+int U_EMRCLOSEFIGURE_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRCLOSEFIGURE));
+}
+
+// U_EMRFILLPATH 62
+int U_EMRFILLPATH_safe(const char *record){
+ return(core4_safe(record));
+}
+
+// U_EMRSTROKEANDFILLPATH 63
+int U_EMRSTROKEANDFILLPATH_safe(const char *record){
+ return(core4_safe(record));
+}
+
+// U_EMRSTROKEPATH 64
+int U_EMRSTROKEPATH_safe(const char *record){
+ return(core4_safe(record));
+}
+
+// U_EMRFLATTENPATH 65
+int U_EMRFLATTENPATH_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRFLATTENPATH));
+}
+
+// U_EMRWIDENPATH 66
+int U_EMRWIDENPATH_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRWIDENPATH));
+}
+
+// U_EMRSELECTCLIPPATH 67
+int U_EMRSELECTCLIPPATH_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRABORTPATH 68
+int U_EMRABORTPATH_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRABORTPATH));
+}
+
+// U_EMRUNDEF69 69
+#define U_EMRUNDEF69_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+
+// U_EMRCOMMENT 70 Comment (any binary data, interpretation is program specific)
+int U_EMRCOMMENT_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRCOMMENT))return(0);
+ PU_EMRCOMMENT pEmr = (PU_EMRCOMMENT)(record);
+ int cbData = pEmr->cbData;
+ const char *blimit =record + pEmr->emr.nSize;
+ if(IS_MEM_UNSAFE(record, cbData + sizeof(U_SIZE_EMRCOMMENT), blimit))return(0);
+ return(1);
+}
+
+// U_EMRFILLRGN 71
+int U_EMRFILLRGN_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRFILLRGN))return(0);
+ PU_EMRFILLRGN pEmr = (PU_EMRFILLRGN)(record);
+ int cbRgnData = pEmr->cbRgnData;
+ const char *blimit = record + pEmr->emr.nSize;
+ if(IS_MEM_UNSAFE(pEmr->RgnData, cbRgnData, blimit))return(0);
+ return(rgndata_safe(pEmr->RgnData, cbRgnData));
+}
+
+// U_EMRFRAMERGN 72
+int U_EMRFRAMERGN_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRFRAMERGN))return(0);
+ PU_EMRFRAMERGN pEmr = (PU_EMRFRAMERGN)(record);
+ int cbRgnData = pEmr->cbRgnData;
+ const char *blimit = record + pEmr->emr.nSize;
+ if(IS_MEM_UNSAFE(pEmr->RgnData, cbRgnData, blimit))return(0);
+ return(rgndata_safe(pEmr->RgnData, cbRgnData));
+}
+
+// U_EMRINVERTRGN 73
+int U_EMRINVERTRGN_safe(const char *record){
+ return(core11_safe(record));
+}
+
+// U_EMRPAINTRGN 74
+int U_EMRPAINTRGN_safe(const char *record){
+ return(core11_safe(record));
+}
+
+// U_EMREXTSELECTCLIPRGN 75
+int U_EMREXTSELECTCLIPRGN_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMREXTSELECTCLIPRGN))return(0);
+ PU_EMREXTSELECTCLIPRGN pEmr = (PU_EMREXTSELECTCLIPRGN)(record);
+ int cbRgnData = pEmr->cbRgnData;
+ const char *blimit = record + pEmr->emr.nSize;
+ if(IS_MEM_UNSAFE(pEmr->RgnData, cbRgnData, blimit))return(0);
+ return(rgndata_safe(pEmr->RgnData, cbRgnData));
+}
+
+// U_EMRBITBLT 76
+int U_EMRBITBLT_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRBITBLT))return(0);
+ PU_EMRBITBLT pEmr = (PU_EMRBITBLT) (record);
+ const char *blimit = record + pEmr->emr.nSize;
+ U_OFFBMISRC offBmiSrc = pEmr->offBmiSrc;
+ U_CBBMISRC cbBmiSrc = pEmr->cbBmiSrc;
+ U_OFFBITSSRC offBitsSrc = pEmr->offBitsSrc;
+ U_CBBITS cbBitsSrc = pEmr->cbBitsSrc;
+ uint32_t iUsageSrc = pEmr->iUsageSrc;
+ return(DIB_safe(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit));
+}
+
+// U_EMRSTRETCHBLT 77
+int U_EMRSTRETCHBLT_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRSTRETCHBLT))return(0);
+ PU_EMRBITBLT pEmr = (PU_EMRBITBLT) (record);
+ const char *blimit = record + pEmr->emr.nSize;
+ U_OFFBMISRC offBmiSrc = pEmr->offBmiSrc;
+ U_CBBMISRC cbBmiSrc = pEmr->cbBmiSrc;
+ U_OFFBITSSRC offBitsSrc = pEmr->offBitsSrc;
+ U_CBBITS cbBitsSrc = pEmr->cbBitsSrc;
+ uint32_t iUsageSrc = pEmr->iUsageSrc;
+ return(DIB_safe(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit));
+}
+
+// U_EMRMASKBLT 78
+int U_EMRMASKBLT_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRMASKBLT))return(0);
+ PU_EMRMASKBLT pEmr = (PU_EMRMASKBLT) (record);
+ const char *blimit = record + pEmr->emr.nSize;
+ U_OFFBMISRC offBmiSrc = pEmr->offBmiSrc;
+ U_CBBMISRC cbBmiSrc = pEmr->cbBmiSrc;
+ U_OFFBMIMSK offBmiMask = pEmr->offBmiMask;
+ U_CBBMIMSK cbBmiMask = pEmr->cbBmiMask;
+ U_OFFBITSSRC offBitsSrc = pEmr->offBitsSrc;
+ U_CBBITSSRC cbBitsSrc = pEmr->cbBitsSrc;
+ U_OFFBITSMSK offBitsMask = pEmr->offBitsMask;
+ U_CBBITSMSK cbBitsMask = pEmr->cbBitsMask;
+ uint32_t iUsageSrc = pEmr->iUsageSrc;
+ uint32_t iUsageMask = pEmr->iUsageMask;
+ if(!DIB_safe(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit))return(0);
+ return(DIB_safe(record, iUsageMask, offBmiMask, cbBmiMask, offBitsMask, cbBitsMask, blimit));
+}
+
+// U_EMRPLGBLT 79
+int U_EMRPLGBLT_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRPLGBLT))return(0);
+ PU_EMRPLGBLT pEmr = (PU_EMRPLGBLT) (record);
+ const char *blimit = record + pEmr->emr.nSize;
+ U_OFFBMISRC offBmiSrc = pEmr->offBmiSrc;
+ U_CBBMISRC cbBmiSrc = pEmr->cbBmiSrc;
+ U_OFFBMIMSK offBmiMask = pEmr->offBmiMask;
+ U_CBBMIMSK cbBmiMask = pEmr->cbBmiMask;
+ U_OFFBITSSRC offBitsSrc = pEmr->offBitsSrc;
+ U_CBBITSSRC cbBitsSrc = pEmr->cbBitsSrc;
+ U_OFFBITSMSK offBitsMask = pEmr->offBitsMask;
+ U_CBBITSMSK cbBitsMask = pEmr->cbBitsMask;
+ uint32_t iUsageSrc = pEmr->iUsageSrc;
+ uint32_t iUsageMask = pEmr->iUsageMask;
+ if(!DIB_safe(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit))return(0);
+ return(DIB_safe(record, iUsageMask, offBmiMask, cbBmiMask, offBitsMask, cbBitsMask, blimit));
+}
+
+// U_EMRSETDIBITSTODEVICE 80
+int U_EMRSETDIBITSTODEVICE_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRSETDIBITSTODEVICE))return(0);
+ PU_EMRSETDIBITSTODEVICE pEmr = (PU_EMRSETDIBITSTODEVICE) (record);
+ const char *blimit = record + pEmr->emr.nSize;
+ U_OFFBMISRC offBmiSrc = pEmr->offBmiSrc;
+ U_CBBMISRC cbBmiSrc = pEmr->cbBmiSrc;
+ U_OFFBITSSRC offBitsSrc = pEmr->offBitsSrc;
+ U_CBBITSSRC cbBitsSrc = pEmr->cbBitsSrc;
+ uint32_t iUsageSrc = pEmr->iUsageSrc;
+ return(DIB_safe(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit));
+}
+
+// U_EMRSTRETCHDIBITS 81
+int U_EMRSTRETCHDIBITS_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRSTRETCHDIBITS))return(0);
+ PU_EMRSTRETCHDIBITS pEmr = (PU_EMRSTRETCHDIBITS) (record);
+ const char *blimit = record + pEmr->emr.nSize;
+ U_OFFBMISRC offBmiSrc = pEmr->offBmiSrc;
+ U_CBBMISRC cbBmiSrc = pEmr->cbBmiSrc;
+ U_OFFBITSSRC offBitsSrc = pEmr->offBitsSrc;
+ U_CBBITSSRC cbBitsSrc = pEmr->cbBitsSrc;
+ uint32_t iUsageSrc = pEmr->iUsageSrc;
+ return(DIB_safe(record, iUsageSrc, offBmiSrc, cbBmiSrc, offBitsSrc, cbBitsSrc, blimit));
+}
+
+// U_EMREXTCREATEFONTINDIRECTW 82
+int U_EMREXTCREATEFONTINDIRECTW_safe(const char *record){
+ /* Panose or logfont, LogFontExDv is not supported. Test smallest to largest */
+ if(core5_safe(record, U_SIZE_EMREXTCREATEFONTINDIRECTW_LOGFONT))return(1);
+ return(core5_safe(record, U_SIZE_EMREXTCREATEFONTINDIRECTW_LOGFONT_PANOSE));
+}
+
+// U_EMREXTTEXTOUTA 83
+int U_EMREXTTEXTOUTA_safe(const char *record){
+ return(core8_safe(record));
+}
+
+// U_EMREXTTEXTOUTW 84
+int U_EMREXTTEXTOUTW_safe(const char *record){
+ return(core8_safe(record));
+}
+
+// U_EMRPOLYBEZIER16 85
+/**
+ \brief Convert a pointer to a U_EMR_POLYBEZIER16 record.
+ \param record pointer to a buffer holding the EMR record
+*/
+int U_EMRPOLYBEZIER16_safe(const char *record){
+ return(core6_safe(record));
+}
+
+// U_EMRPOLYGON16 86
+int U_EMRPOLYGON16_safe(const char *record){
+ return(core6_safe(record));
+}
+
+// U_EMRPOLYLINE16 87
+int U_EMRPOLYLINE16_safe(const char *record){
+ return(core6_safe(record));
+}
+
+// U_EMRPOLYBEZIERTO16 88
+int U_EMRPOLYBEZIERTO16_safe(const char *record){
+ return(core6_safe(record));
+}
+
+// U_EMRPOLYLINETO16 89
+/**
+ \brief Convert a pointer to a U_EMR_POLYLINETO16 record.
+ \param record pointer to a buffer holding the EMR record
+*/
+int U_EMRPOLYLINETO16_safe(const char *record){
+ return(core6_safe(record));
+}
+
+// U_EMRPOLYPOLYLINE16 90
+int U_EMRPOLYPOLYLINE16_safe(const char *record){
+ return(core10_safe(record));
+}
+
+// U_EMRPOLYPOLYGON16 91
+int U_EMRPOLYPOLYGON16_safe(const char *record){
+ return(core10_safe(record));
+}
+
+
+// U_EMRPOLYDRAW16 92
+int U_EMRPOLYDRAW16_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRPOLYDRAW16))return(0);
+ PU_EMRPOLYDRAW16 pEmr = (PU_EMRPOLYDRAW16)(record);
+ int count = pEmr->cpts;
+ const char *blimit = record + pEmr->emr.nSize;
+ if(IS_MEM_UNSAFE(pEmr->apts, count*sizeof(U_POINT16), blimit))return(0);
+ return(1);
+}
+
+// U_EMRCREATEMONOBRUSH 93
+int U_EMRCREATEMONOBRUSH_safe(const char *record){
+ return(core12_safe(record));
+}
+
+// U_EMRCREATEDIBPATTERNBRUSHPT_safe 94
+int U_EMRCREATEDIBPATTERNBRUSHPT_safe(const char *record){
+ return(core12_safe(record));
+}
+
+
+// U_EMREXTCREATEPEN 95
+int U_EMREXTCREATEPEN_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMREXTCREATEPEN))return(0);
+ PU_EMREXTCREATEPEN pEmr = (PU_EMREXTCREATEPEN)(record);
+ const char *blimit = record + pEmr->emr.nSize;
+ U_OFFBMI offBmi = pEmr->offBmi;
+ U_CBBMI cbBmi = pEmr->cbBmi;
+ U_OFFBITS offBits = pEmr->offBits;
+ U_CBBITS cbBits = pEmr->cbBits;
+ if(!DIB_safe(record, U_DIB_RGB_COLORS, offBmi, cbBmi, offBits, cbBits, blimit))return(0);
+ return(extlogpen_safe((PU_EXTLOGPEN) &(pEmr->elp), blimit));
+}
+
+// U_EMRPOLYTEXTOUTA 96 NOT IMPLEMENTED, denigrated after Windows NT
+#define U_EMRPOLYTEXTOUTA_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+// U_EMRPOLYTEXTOUTW 97 NOT IMPLEMENTED, denigrated after Windows NT
+#define U_EMRPOLYTEXTOUTW_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+
+// U_EMRSETICMMODE 98
+int U_EMRSETICMMODE_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRCREATECOLORSPACE 99
+int U_EMRCREATECOLORSPACE_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRCREATECOLORSPACE));
+}
+
+// U_EMRSETCOLORSPACE 100
+int U_EMRSETCOLORSPACE_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRDELETECOLORSPACE 101
+int U_EMRDELETECOLORSPACE_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRGLSRECORD 102 Not implemented
+#define U_EMRGLSRECORD_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+// U_EMRGLSBOUNDEDRECORD 103 Not implemented
+#define U_EMRGLSBOUNDEDRECORD_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+
+// U_EMRPIXELFORMAT 104
+int U_EMRPIXELFORMAT_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRPIXELFORMAT));
+}
+
+// U_EMRDRAWESCAPE 105 Not implemented
+#define U_EMRDRAWESCAPE_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+// U_EMREXTESCAPE 106 Not implemented
+#define U_EMREXTESCAPE_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+// U_EMRUNDEF107 107 Not implemented
+#define U_EMRUNDEF107_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+
+// U_EMRSMALLTEXTOUT 108
+int U_EMRSMALLTEXTOUT_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRSMALLTEXTOUT))return(0);
+ PU_EMRSMALLTEXTOUT pEmr = (PU_EMRSMALLTEXTOUT)(record);
+ int roff=sizeof(U_EMRSMALLTEXTOUT); // offset to the start of the variable fields
+ int fuOptions = pEmr->fuOptions;
+ int cChars = pEmr->cChars;
+ const char *blimit = record + pEmr->emr.nSize;
+ if(!(fuOptions & U_ETO_NO_RECT)){
+ if(IS_MEM_UNSAFE(record, roff + sizeof(U_RECTL), blimit))return(0);
+ }
+ if(IS_MEM_UNSAFE(record, roff + sizeof(U_RECTL) + cChars, blimit))return(0);
+ return(1);
+}
+
+// U_EMRFORCEUFIMAPPING 109 Not implemented
+#define U_EMRFORCEUFIMAPPING_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+// U_EMRNAMEDESCAPE 110 Not implemented
+#define U_EMRNAMEDESCAPE_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+// U_EMRCOLORCORRECTPALETTE 111 Not implemented
+#define U_EMRCOLORCORRECTPALETTE_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+// U_EMRSETICMPROFILEA 112 Not implemented
+#define U_EMRSETICMPROFILEA_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+// U_EMRSETICMPROFILEW 113 Not implemented
+#define U_EMRSETICMPROFILEW_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+
+// U_EMRALPHABLEND 114
+int U_EMRALPHABLEND_safe(const char *record){
+ return(core13_safe(record));
+}
+
+// U_EMRSETLAYOUT 115
+int U_EMRSETLAYOUT_safe(const char *record){
+ return(core3_safe(record));
+}
+
+// U_EMRTRANSPARENTBLT 116
+int U_EMRTRANSPARENTBLT_safe(const char *record){
+ return(core13_safe(record));
+}
+
+
+// U_EMRUNDEF117 117 Not implemented
+#define U_EMRUNDEF117_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+// U_EMRGRADIENTFILL 118
+int U_EMRGRADIENTFILL_safe(const char *record){
+ if(!core5_safe(record, U_SIZE_EMRGRADIENTFILL))return(0);
+ PU_EMRGRADIENTFILL pEmr = (PU_EMRGRADIENTFILL)(record);
+ int nTriVert = pEmr->nTriVert;
+ int nGradObj = pEmr->nGradObj;
+ int ulMode = pEmr->ulMode;
+ const char *blimit = record + pEmr->emr.nSize;
+ if(IS_MEM_UNSAFE(record, nTriVert*sizeof(U_TRIVERTEX), blimit))return(0);
+ record += nTriVert * sizeof(U_TRIVERTEX);
+ if(nGradObj){
+ if( ulMode == U_GRADIENT_FILL_TRIANGLE){
+ if(IS_MEM_UNSAFE(record, nGradObj*sizeof(U_GRADIENT3), blimit))return(0);
+ }
+ else if(ulMode == U_GRADIENT_FILL_RECT_H || ulMode == U_GRADIENT_FILL_RECT_V){
+ if(IS_MEM_UNSAFE(record, nGradObj*sizeof(U_GRADIENT4), blimit))return(0);
+ }
+ }
+ return(1);
+}
+
+// U_EMRSETLINKEDUFIS 119 Not implemented
+#define U_EMRSETLINKEDUFIS_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+// U_EMRSETTEXTJUSTIFICATION120 Not implemented (denigrated)
+#define U_EMRSETTEXTJUSTIFICATION_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+// U_EMRCOLORMATCHTOTARGETW 121 Not implemented
+#define U_EMRCOLORMATCHTOTARGETW_safe(A) U_EMRNOTIMPLEMENTED_safe(A) //!< Not implemented.
+
+// U_EMRCREATECOLORSPACEW 122
+int U_EMRCREATECOLORSPACEW_safe(const char *record){
+ return(core5_safe(record, U_SIZE_EMRCREATECOLORSPACEW));
+}
+
+//! \endcond
+
+/**
+ \brief Test an EMF record in memory from Big Endian to Little Endian.
+ \return 0 on failure, 1 on success
+ \param record pointer to the EMF record in memory
+
+ Normally this would be called immediately after reading a record from a file
+ and having called U_emf_record_sizeok().
+ It is NOT safe to call this routine without first calling U_emf_record_sizeok)()!
+ If the file has been converted from one endian to another calling this routine is
+ not necessary, because those routines also perform these checks.
+*/
+int U_emf_record_safe(const char *record){
+ int rstatus=1;
+
+ if(!record)return(0); // programming error
+
+ switch (U_EMRTYPE(record))
+ {
+ case U_EMR_HEADER: rstatus=U_EMRHEADER_safe(record); break;
+ case U_EMR_POLYBEZIER: rstatus=U_EMRPOLYBEZIER_safe(record); break;
+ case U_EMR_POLYGON: rstatus=U_EMRPOLYGON_safe(record); break;
+ case U_EMR_POLYLINE: rstatus=U_EMRPOLYLINE_safe(record); break;
+ case U_EMR_POLYBEZIERTO: rstatus=U_EMRPOLYBEZIERTO_safe(record); break;
+ case U_EMR_POLYLINETO: rstatus=U_EMRPOLYLINETO_safe(record); break;
+ case U_EMR_POLYPOLYLINE: rstatus=U_EMRPOLYPOLYLINE_safe(record); break;
+ case U_EMR_POLYPOLYGON: rstatus=U_EMRPOLYPOLYGON_safe(record); break;
+ case U_EMR_SETWINDOWEXTEX: rstatus=U_EMRSETWINDOWEXTEX_safe(record); break;
+ case U_EMR_SETWINDOWORGEX: rstatus=U_EMRSETWINDOWORGEX_safe(record); break;
+ case U_EMR_SETVIEWPORTEXTEX: rstatus=U_EMRSETVIEWPORTEXTEX_safe(record); break;
+ case U_EMR_SETVIEWPORTORGEX: rstatus=U_EMRSETVIEWPORTORGEX_safe(record); break;
+ case U_EMR_SETBRUSHORGEX: rstatus=U_EMRSETBRUSHORGEX_safe(record); break;
+ case U_EMR_EOF: rstatus=U_EMREOF_safe(record); break;
+ case U_EMR_SETPIXELV: rstatus=U_EMRSETPIXELV_safe(record); break;
+ case U_EMR_SETMAPPERFLAGS: rstatus=U_EMRSETMAPPERFLAGS_safe(record); break;
+ case U_EMR_SETMAPMODE: rstatus=U_EMRSETMAPMODE_safe(record); break;
+ case U_EMR_SETBKMODE: rstatus=U_EMRSETBKMODE_safe(record); break;
+ case U_EMR_SETPOLYFILLMODE: rstatus=U_EMRSETPOLYFILLMODE_safe(record); break;
+ case U_EMR_SETROP2: rstatus=U_EMRSETROP2_safe(record); break;
+ case U_EMR_SETSTRETCHBLTMODE: rstatus=U_EMRSETSTRETCHBLTMODE_safe(record); break;
+ case U_EMR_SETTEXTALIGN: rstatus=U_EMRSETTEXTALIGN_safe(record); break;
+ case U_EMR_SETCOLORADJUSTMENT: rstatus=U_EMRSETCOLORADJUSTMENT_safe(record); break;
+ case U_EMR_SETTEXTCOLOR: rstatus=U_EMRSETTEXTCOLOR_safe(record); break;
+ case U_EMR_SETBKCOLOR: rstatus=U_EMRSETBKCOLOR_safe(record); break;
+ case U_EMR_OFFSETCLIPRGN: rstatus=U_EMROFFSETCLIPRGN_safe(record); break;
+ case U_EMR_MOVETOEX: rstatus=U_EMRMOVETOEX_safe(record); break;
+ case U_EMR_SETMETARGN: rstatus=U_EMRSETMETARGN_safe(record); break;
+ case U_EMR_EXCLUDECLIPRECT: rstatus=U_EMREXCLUDECLIPRECT_safe(record); break;
+ case U_EMR_INTERSECTCLIPRECT: rstatus=U_EMRINTERSECTCLIPRECT_safe(record); break;
+ case U_EMR_SCALEVIEWPORTEXTEX: rstatus=U_EMRSCALEVIEWPORTEXTEX_safe(record); break;
+ case U_EMR_SCALEWINDOWEXTEX: rstatus=U_EMRSCALEWINDOWEXTEX_safe(record); break;
+ case U_EMR_SAVEDC: rstatus=U_EMRSAVEDC_safe(record); break;
+ case U_EMR_RESTOREDC: rstatus=U_EMRRESTOREDC_safe(record); break;
+ case U_EMR_SETWORLDTRANSFORM: rstatus=U_EMRSETWORLDTRANSFORM_safe(record); break;
+ case U_EMR_MODIFYWORLDTRANSFORM: rstatus=U_EMRMODIFYWORLDTRANSFORM_safe(record); break;
+ case U_EMR_SELECTOBJECT: rstatus=U_EMRSELECTOBJECT_safe(record); break;
+ case U_EMR_CREATEPEN: rstatus=U_EMRCREATEPEN_safe(record); break;
+ case U_EMR_CREATEBRUSHINDIRECT: rstatus=U_EMRCREATEBRUSHINDIRECT_safe(record); break;
+ case U_EMR_DELETEOBJECT: rstatus=U_EMRDELETEOBJECT_safe(record); break;
+ case U_EMR_ANGLEARC: rstatus=U_EMRANGLEARC_safe(record); break;
+ case U_EMR_ELLIPSE: rstatus=U_EMRELLIPSE_safe(record); break;
+ case U_EMR_RECTANGLE: rstatus=U_EMRRECTANGLE_safe(record); break;
+ case U_EMR_ROUNDRECT: rstatus=U_EMRROUNDRECT_safe(record); break;
+ case U_EMR_ARC: rstatus=U_EMRARC_safe(record); break;
+ case U_EMR_CHORD: rstatus=U_EMRCHORD_safe(record); break;
+ case U_EMR_PIE: rstatus=U_EMRPIE_safe(record); break;
+ case U_EMR_SELECTPALETTE: rstatus=U_EMRSELECTPALETTE_safe(record); break;
+ case U_EMR_CREATEPALETTE: rstatus=U_EMRCREATEPALETTE_safe(record); break;
+ case U_EMR_SETPALETTEENTRIES: rstatus=U_EMRSETPALETTEENTRIES_safe(record); break;
+ case U_EMR_RESIZEPALETTE: rstatus=U_EMRRESIZEPALETTE_safe(record); break;
+ case U_EMR_REALIZEPALETTE: rstatus=U_EMRREALIZEPALETTE_safe(record); break;
+ case U_EMR_EXTFLOODFILL: rstatus=U_EMREXTFLOODFILL_safe(record); break;
+ case U_EMR_LINETO: rstatus=U_EMRLINETO_safe(record); break;
+ case U_EMR_ARCTO: rstatus=U_EMRARCTO_safe(record); break;
+ case U_EMR_POLYDRAW: rstatus=U_EMRPOLYDRAW_safe(record); break;
+ case U_EMR_SETARCDIRECTION: rstatus=U_EMRSETARCDIRECTION_safe(record); break;
+ case U_EMR_SETMITERLIMIT: rstatus=U_EMRSETMITERLIMIT_safe(record); break;
+ case U_EMR_BEGINPATH: rstatus=U_EMRBEGINPATH_safe(record); break;
+ case U_EMR_ENDPATH: rstatus=U_EMRENDPATH_safe(record); break;
+ case U_EMR_CLOSEFIGURE: rstatus=U_EMRCLOSEFIGURE_safe(record); break;
+ case U_EMR_FILLPATH: rstatus=U_EMRFILLPATH_safe(record); break;
+ case U_EMR_STROKEANDFILLPATH: rstatus=U_EMRSTROKEANDFILLPATH_safe(record); break;
+ case U_EMR_STROKEPATH: rstatus=U_EMRSTROKEPATH_safe(record); break;
+ case U_EMR_FLATTENPATH: rstatus=U_EMRFLATTENPATH_safe(record); break;
+ case U_EMR_WIDENPATH: rstatus=U_EMRWIDENPATH_safe(record); break;
+ case U_EMR_SELECTCLIPPATH: rstatus=U_EMRSELECTCLIPPATH_safe(record); break;
+ case U_EMR_ABORTPATH: rstatus=U_EMRABORTPATH_safe(record); break;
+ case U_EMR_UNDEF69: rstatus=U_EMRUNDEF69_safe(record); break;
+ case U_EMR_COMMENT: rstatus=U_EMRCOMMENT_safe(record); break;
+ case U_EMR_FILLRGN: rstatus=U_EMRFILLRGN_safe(record); break;
+ case U_EMR_FRAMERGN: rstatus=U_EMRFRAMERGN_safe(record); break;
+ case U_EMR_INVERTRGN: rstatus=U_EMRINVERTRGN_safe(record); break;
+ case U_EMR_PAINTRGN: rstatus=U_EMRPAINTRGN_safe(record); break;
+ case U_EMR_EXTSELECTCLIPRGN: rstatus=U_EMREXTSELECTCLIPRGN_safe(record); break;
+ case U_EMR_BITBLT: rstatus=U_EMRBITBLT_safe(record); break;
+ case U_EMR_STRETCHBLT: rstatus=U_EMRSTRETCHBLT_safe(record); break;
+ case U_EMR_MASKBLT: rstatus=U_EMRMASKBLT_safe(record); break;
+ case U_EMR_PLGBLT: rstatus=U_EMRPLGBLT_safe(record); break;
+ case U_EMR_SETDIBITSTODEVICE: rstatus=U_EMRSETDIBITSTODEVICE_safe(record); break;
+ case U_EMR_STRETCHDIBITS: rstatus=U_EMRSTRETCHDIBITS_safe(record); break;
+ case U_EMR_EXTCREATEFONTINDIRECTW: rstatus=U_EMREXTCREATEFONTINDIRECTW_safe(record); break;
+ case U_EMR_EXTTEXTOUTA: rstatus=U_EMREXTTEXTOUTA_safe(record); break;
+ case U_EMR_EXTTEXTOUTW: rstatus=U_EMREXTTEXTOUTW_safe(record); break;
+ case U_EMR_POLYBEZIER16: rstatus=U_EMRPOLYBEZIER16_safe(record); break;
+ case U_EMR_POLYGON16: rstatus=U_EMRPOLYGON16_safe(record); break;
+ case U_EMR_POLYLINE16: rstatus=U_EMRPOLYLINE16_safe(record); break;
+ case U_EMR_POLYBEZIERTO16: rstatus=U_EMRPOLYBEZIERTO16_safe(record); break;
+ case U_EMR_POLYLINETO16: rstatus=U_EMRPOLYLINETO16_safe(record); break;
+ case U_EMR_POLYPOLYLINE16: rstatus=U_EMRPOLYPOLYLINE16_safe(record); break;
+ case U_EMR_POLYPOLYGON16: rstatus=U_EMRPOLYPOLYGON16_safe(record); break;
+ case U_EMR_POLYDRAW16: rstatus=U_EMRPOLYDRAW16_safe(record); break;
+ case U_EMR_CREATEMONOBRUSH: rstatus=U_EMRCREATEMONOBRUSH_safe(record); break;
+ case U_EMR_CREATEDIBPATTERNBRUSHPT: rstatus=U_EMRCREATEDIBPATTERNBRUSHPT_safe(record); break;
+ case U_EMR_EXTCREATEPEN: rstatus=U_EMREXTCREATEPEN_safe(record); break;
+ case U_EMR_POLYTEXTOUTA: rstatus=U_EMRPOLYTEXTOUTA_safe(record); break;
+ case U_EMR_POLYTEXTOUTW: rstatus=U_EMRPOLYTEXTOUTW_safe(record); break;
+ case U_EMR_SETICMMODE: rstatus=U_EMRSETICMMODE_safe(record); break;
+ case U_EMR_CREATECOLORSPACE: rstatus=U_EMRCREATECOLORSPACE_safe(record); break;
+ case U_EMR_SETCOLORSPACE: rstatus=U_EMRSETCOLORSPACE_safe(record); break;
+ case U_EMR_DELETECOLORSPACE: rstatus=U_EMRDELETECOLORSPACE_safe(record); break;
+ case U_EMR_GLSRECORD: rstatus=U_EMRGLSRECORD_safe(record); break;
+ case U_EMR_GLSBOUNDEDRECORD: rstatus=U_EMRGLSBOUNDEDRECORD_safe(record); break;
+ case U_EMR_PIXELFORMAT: rstatus=U_EMRPIXELFORMAT_safe(record); break;
+ case U_EMR_DRAWESCAPE: rstatus=U_EMRDRAWESCAPE_safe(record); break;
+ case U_EMR_EXTESCAPE: rstatus=U_EMREXTESCAPE_safe(record); break;
+ case U_EMR_UNDEF107: rstatus=U_EMRUNDEF107_safe(record); break;
+ case U_EMR_SMALLTEXTOUT: rstatus=U_EMRSMALLTEXTOUT_safe(record); break;
+ case U_EMR_FORCEUFIMAPPING: rstatus=U_EMRFORCEUFIMAPPING_safe(record); break;
+ case U_EMR_NAMEDESCAPE: rstatus=U_EMRNAMEDESCAPE_safe(record); break;
+ case U_EMR_COLORCORRECTPALETTE: rstatus=U_EMRCOLORCORRECTPALETTE_safe(record); break;
+ case U_EMR_SETICMPROFILEA: rstatus=U_EMRSETICMPROFILEA_safe(record); break;
+ case U_EMR_SETICMPROFILEW: rstatus=U_EMRSETICMPROFILEW_safe(record); break;
+ case U_EMR_ALPHABLEND: rstatus=U_EMRALPHABLEND_safe(record); break;
+ case U_EMR_SETLAYOUT: rstatus=U_EMRSETLAYOUT_safe(record); break;
+ case U_EMR_TRANSPARENTBLT: rstatus=U_EMRTRANSPARENTBLT_safe(record); break;
+ case U_EMR_UNDEF117: rstatus=U_EMRUNDEF117_safe(record); break;
+ case U_EMR_GRADIENTFILL: rstatus=U_EMRGRADIENTFILL_safe(record); break;
+ case U_EMR_SETLINKEDUFIS: rstatus=U_EMRSETLINKEDUFIS_safe(record); break;
+ case U_EMR_SETTEXTJUSTIFICATION: rstatus=U_EMRSETTEXTJUSTIFICATION_safe(record); break;
+ case U_EMR_COLORMATCHTOTARGETW: rstatus=U_EMRCOLORMATCHTOTARGETW_safe(record); break;
+ case U_EMR_CREATECOLORSPACEW: rstatus=U_EMRCREATECOLORSPACEW_safe(record); break;
+ default: rstatus=U_EMRNOTIMPLEMENTED_safe(record); break;
+ } //end of switch
+ return(rstatus);
+}
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/src/libuemf/uemf_safe.h b/src/libuemf/uemf_safe.h
new file mode 100644
index 000000000..0c9e3cc69
--- /dev/null
+++ b/src/libuemf/uemf_safe.h
@@ -0,0 +1,32 @@
+/**
+ @file uemf_safe.h
+
+ @brief Defintions and prototype for function for converting EMF records between Big Endian and Little Endian byte orders.
+*/
+
+/*
+File: uemf_endian.h
+Version: 0.0.2
+Date: 26-MAR-2015
+Author: David Mathog, Biology Division, Caltech
+email: mathog@caltech.edu
+Copyright: 2015 David Mathog and California Institute of Technology (Caltech)
+*/
+
+#ifndef _UEMF_SAFE_
+#define _UEMF_SAFE_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// prototypes
+int U_emf_record_safe(const char *record);
+int bitmapinfo_safe(const char *Bmi, const char *blimit);
+//! \endcond
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UEMF_SAFE_ */
diff --git a/src/libuemf/upmf.c b/src/libuemf/upmf.c
index 01f7ba3a4..7d6349185 100644
--- a/src/libuemf/upmf.c
+++ b/src/libuemf/upmf.c
@@ -21,11 +21,11 @@
/*
File: upmf.c
-Version: 0.0.6
-Date: 26-MAR-2014
+Version: 0.0.9
+Date: 25-MAR-2015
Author: David Mathog, Biology Division, Caltech
email: mathog@caltech.edu
-Copyright: 2014 David Mathog and California Institute of Technology (Caltech)
+Copyright: 2015 David Mathog and California Institute of Technology (Caltech)
*/
#ifdef __cplusplus
@@ -1459,11 +1459,18 @@ int U_PMF_PTRSAV_COND(const char **Dst, const char *Src, int Doit){
else { *Dst = NULL; }
return(1);
}
+/*
+
+ =====================================================================================
+ start of U_PMF_*_get() functions
+
+*/
/**
\brief Get the 16 bit unsigned Flags field from a header.
\param contents Record from which to extract data, will be incremented by header size.
\return Flags field
+
In many records the only value needed from the header is Flags. Rather than mapping
the entire Header and returning it, in these instances this function may be called to
just get this one value.
@@ -1516,6 +1523,19 @@ int U_PMF_CMN_HDR_get(const char **contents, U_PMF_CMN_HDR *Header){
}
/**
+ \brief return the size in bytes of the EMF+ record
+ \param contents Record from which to extract data, will not be modified.
+ \returns size, or 0 if contents is Null
+*/
+int U_PMF_RECORD_SIZE_get(const char *contents){
+ if(!contents){ return(0); }
+ int Size;
+ const char *from = contents + 4;
+ U_PMF_SERIAL_get(&from, &Size, 4, 1, U_LE);
+ return(Size);
+}
+
+/**
\brief Return the size of a PenData object from an EMF+ record.
\param PenData Address in memory where the PenData object starts.
\returns size of the object in bytes
@@ -5362,6 +5382,17 @@ U_PSEUDO_OBJ *U_PMR_TRANSLATEWORLDTRANSFORM_set(int xmtype, U_FLOAT Dx, U_FLOAT
return(po);
}
+/*
+
+ end of U_PMF_*_set() functions
+ =====================================================================================
+ start of U_PMF_*_get() functions
+
+ These functions all take a blimit value so that they can check if the data description in the fields
+ they process extend beyond the end of the record.
+
+*/
+
//! \cond
/* core _get functions, not accessed outside of this routine */
@@ -5387,11 +5418,15 @@ int U_PMF_CORE1_get(const char *contents, void *v1, void *v2, void *v3, void *v4
\param Version EmfPlusGraphicsVersion object
\param Type BrushType Enumeration
\param Data one of the 5 types of Brush data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.1.1, Microsoft name: EmfPlusBrush Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_BRUSH_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data){
- if(!contents || !Version || !Type || !Data){ return(0); }
+int U_PMF_BRUSH_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data, const char *blimit){
+ if(!contents || !Version || !Type || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents,sizeof(U_PMF_BRUSH), blimit))return(0);
U_PMF_SERIAL_get(&contents, Version, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Type, 4, 1, U_LE);
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
@@ -5405,11 +5440,15 @@ int U_PMF_BRUSH_get(const char *contents, uint32_t *Version, uint32_t *Type, con
\param Version EmfPlusGraphicsVersion object
\param Type CustomLineCapData Enumeration
\param Data one of the 2 types of Linecap data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.1.2, Microsoft name: EmfPlusCustomLineCap Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_CUSTOMLINECAP_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data){
- if(!contents || !Version || !Type || !Data){ return(0); }
+int U_PMF_CUSTOMLINECAP_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data, const char *blimit){
+ if(!contents || !Version || !Type || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_CUSTOMLINECAP), blimit))return(0);
U_PMF_SERIAL_get(&contents, Version, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Type, 4, 1, U_LE);
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
@@ -5428,10 +5467,13 @@ int U_PMF_CUSTOMLINECAP_get(const char *contents, uint32_t *Version, uint32_t *T
\param Data Unicode (UTF-16LE) name of font family
EMF+ manual 2.2.1.3, Microsoft name: EmfPlusFont Object
+
+ Caller must check Data for possible memory access violations.
*/
int U_PMF_FONT_get(const char *contents, uint32_t *Version, U_FLOAT *EmSize, uint32_t *SizeUnit,
- int32_t *FSFlags, uint32_t *Length, const char **Data){
- if(!contents || !Version || !EmSize || !SizeUnit || !FSFlags || !Length || !Data){ return(0); }
+ int32_t *FSFlags, uint32_t *Length, const char **Data, const char *blimit){
+ if(!contents || !Version || !EmSize || !SizeUnit || !FSFlags || !Length || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_FONT), blimit))return(0);
U_PMF_SERIAL_get(&contents, Version, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, EmSize, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, SizeUnit, 4, 1, U_LE);
@@ -5452,9 +5494,12 @@ int U_PMF_FONT_get(const char *contents, uint32_t *Version, U_FLOAT *EmSize, uin
\param Data one of the 2 types of image data
EMF+ manual 2.2.1.4, Microsoft name: EmfPlusImage Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_IMAGE_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data){
- if(!contents || !Version || !Type){ return(0); }
+int U_PMF_IMAGE_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data, const char *blimit){
+ if(!contents || !Version || !Type || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_IMAGE), blimit))return(0);
U_PMF_SERIAL_get(&contents, Version, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Type, 4, 1, U_LE);
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
@@ -5472,8 +5517,10 @@ int U_PMF_IMAGE_get(const char *contents, uint32_t *Version, uint32_t *Type, con
EMF+ manual 2.2.1.5, Microsoft name: EmfPlusImageAttributes Object
*/
-int U_PMF_IMAGEATTRIBUTES_get(const char *contents, uint32_t *Version, uint32_t *WrapMode, uint32_t *ClampColor, uint32_t *ObjectClamp){
- if(!contents || !Version || !WrapMode || !ClampColor || !ObjectClamp){ return(0); }
+int U_PMF_IMAGEATTRIBUTES_get(const char *contents, uint32_t *Version, uint32_t *WrapMode, uint32_t *ClampColor,
+ uint32_t *ObjectClamp, const char *blimit){
+ if(!contents || !Version || !WrapMode || !ClampColor || !ObjectClamp || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_IMAGEATTRIBUTES), blimit))return(0);
U_PMF_SERIAL_get(&contents, Version, 4, 1, U_LE);
contents += 4; /* Skip Reserved 1*/
U_PMF_SERIAL_get(&contents, WrapMode, 4, 1, U_LE);
@@ -5494,21 +5541,31 @@ int U_PMF_IMAGEATTRIBUTES_get(const char *contents, uint32_t *Version, uint32_t
\param Types array of U_PMF_PATHPOINTTYPERLE and/or U_PMF_PATHPOINTTYPE
EMF+ manual 2.2.1.6, Microsoft name: EmfPlusPath Object
+
+ Caller must check Types for possible memory access violations if type can be U_PMF_PATHPOINTTYPERLE.
*/
-int U_PMF_PATH_get(const char *contents, uint32_t *Version, uint32_t *Count, uint16_t *Flags, const char **Points, const char **Types){
- if(!contents || !Version || !Count || !Flags || !Points || !Types){ return(0); }
+int U_PMF_PATH_get(const char *contents, uint32_t *Version, uint32_t *Count, uint16_t *Flags,
+ const char **Points, const char **Types, const char *blimit){
+ if(!contents || !Version || !Count || !Flags || !Points || !Types || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_PATH), blimit))return(0);
U_PMF_SERIAL_get(&contents, Version, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Count, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Flags, 2, 1, U_LE);
contents+=2; /* reserved */
- U_PMF_PTRSAV_SHIFT(Points, &contents, 0);
+ uint32_t sizeP, sizeT;
if(*Flags & U_PPF_P){
- int killme = U_PMF_LEN_REL715(contents,*Count); //DEBUG
- printf("DEBUG U_PMF_PATH_get count:%d LENREL715:%d\n",*Count,killme);fflush(stdout);
- contents += killme;
+ sizeP = U_PMF_LEN_REL715(contents,*Count); //DEBUG
+ printf("DEBUG U_PMF_PATH_get count:%d LENREL715:%d\n",*Count,sizeP);fflush(stdout);
}
- else if(*Flags & U_PPF_C){ contents += *Count * sizeof(U_PMF_POINT); }
- else { contents += *Count * sizeof(U_PMF_POINTF); }
+ else if(*Flags & U_PPF_C){ sizeP = *Count * sizeof(U_PMF_POINT); }
+ else { sizeP = *Count * sizeof(U_PMF_POINTF); }
+ if(IS_MEM_UNSAFE(contents, sizeP, blimit))return(0);
+ U_PMF_PTRSAV_SHIFT(Points, &contents, 0);
+ contents += sizeP;
+ /* this limit is correct if there are only U_PMF_PATHPOINTTYPE PointTypes, it is a lower bound if
+ there can also be U_PMF_PATHPOINTTYPERLE */
+ sizeT = *Count * sizeof(U_PMF_PATHPOINTTYPE);
+ if(IS_MEM_UNSAFE(contents, sizeT, blimit))return(0);
U_PMF_PTRSAV_SHIFT(Types, &contents, 0);
return(1);
}
@@ -5523,9 +5580,12 @@ int U_PMF_PATH_get(const char *contents, uint32_t *Version, uint32_t *Count, uin
\param Brush Brush Description
EMF+ manual 2.2.1.7, Microsoft name: EmfPlusPen Object
+
+ Caller must check Brush and PenData for possible memory access violations.
*/
-int U_PMF_PEN_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **PenData, const char **Brush){
- if(!contents || !Type || !PenData || !Brush){ return(0); }
+int U_PMF_PEN_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **PenData, const char **Brush, const char *blimit){
+ if(!contents || !Type || !PenData || !Brush || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_PEN), blimit))return(0);
U_PMF_SERIAL_get(&contents, Version, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Type, 4, 1, U_LE);
U_PMF_PTRSAV_SHIFT(PenData, &contents, 0);
@@ -5543,8 +5603,9 @@ int U_PMF_PEN_get(const char *contents, uint32_t *Version, uint32_t *Type, const
EMF+ manual 2.2.1.8, Microsoft name: EmfPlusRegion Object
*/
-int U_PMF_REGION_get(const char *contents, uint32_t *Version, uint32_t *Count, const char **Nodes){
- if(!contents || !Version || !Count || !Nodes){ return(0); }
+int U_PMF_REGION_get(const char *contents, uint32_t *Version, uint32_t *Count, const char **Nodes, const char *blimit){
+ if(!contents || !Version || !Count || !Nodes || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_REGION), blimit))return(0);
U_PMF_SERIAL_get(&contents, Version, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Count, 4, 1, U_LE);
U_PMF_PTRSAV_SHIFT(Nodes, &contents, 0);
@@ -5560,8 +5621,9 @@ int U_PMF_REGION_get(const char *contents, uint32_t *Version, uint32_t *Count, c
EMF+ manual 2.2.1.9, Microsoft name: EmfPlusStringFormat Object
*/
-int U_PMF_STRINGFORMAT_get(const char *contents, U_PMF_STRINGFORMAT *Sfs, const char **Data){
- if(!contents || !Sfs || !Data){ return(0); }
+int U_PMF_STRINGFORMAT_get(const char *contents, U_PMF_STRINGFORMAT *Sfs, const char **Data, const char *blimit){
+ if(!contents || !Sfs || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_STRINGFORMAT), blimit))return(0);
U_PMF_SERIAL_get(&contents, Sfs, 4, 15, U_LE);
*Data = contents;
return(1);
@@ -5578,8 +5640,9 @@ int U_PMF_STRINGFORMAT_get(const char *contents, U_PMF_STRINGFORMAT *Sfs, const
EMF+ manual 2.2.2.1, Microsoft name: EmfPlusARGB Object
*/
-int U_PMF_ARGB_get(const char *contents, uint8_t *Blue, uint8_t *Green, uint8_t *Red, uint8_t *Alpha){
- if(!contents || !Blue || !Green || !Red || !Alpha){ return(0); }
+int U_PMF_ARGB_get(const char *contents, uint8_t *Blue, uint8_t *Green, uint8_t *Red, uint8_t *Alpha, const char *blimit){
+ if(!contents || !Blue || !Green || !Red || !Alpha || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_ARGB), blimit))return(0);
U_PMF_SERIAL_get(&contents, Blue, 1, 1, U_XE);
U_PMF_SERIAL_get(&contents, Green, 1, 1, U_XE);
U_PMF_SERIAL_get(&contents, Red, 1, 1, U_XE);
@@ -5595,11 +5658,14 @@ int U_PMF_ARGB_get(const char *contents, uint8_t *Blue, uint8_t *Green, uint8_t
\param Data pointer to variable part
EMF+ manual 2.2.2.2, Microsoft name: EmfPlusBitmap Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_BITMAP_get(const char *contents, U_PMF_BITMAP *Bs, const char **Data){
- if(!contents || !Bs || !Data){ return(0); }
- U_PMF_SERIAL_get(&contents, Bs, 4, 5, U_LE);
- U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
+int U_PMF_BITMAP_get(const char *contents, U_PMF_BITMAP *Bs, const char **Data, const char *blimit){
+ if(!contents || !Bs || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_BITMAP), blimit))return(0);
+ U_PMF_SERIAL_get(&contents, Bs, 4, 5, U_LE); // width, height, stride, pixelformat, type
+ U_PMF_PTRSAV_SHIFT(Data, &contents, 0); // bitmapdata
return(1);
}
@@ -5612,11 +5678,16 @@ int U_PMF_BITMAP_get(const char *contents, U_PMF_BITMAP *Bs, const char **Data){
\param Data An array of bytes, meaning depends on fields in U_PMF_BITMAP object and the PixelFormat enumeration.
EMF+ manual 2.2.2.3, Microsoft name: EmfPlusBitmapData Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_BITMAPDATA_get(const char *contents, U_PMF_PALETTE *Ps, const char **Colors, const char **Data){
- if(!contents || !Ps || !Colors || !Data ){ return(0); }
+int U_PMF_BITMAPDATA_get(const char *contents, U_PMF_PALETTE *Ps, const char **Colors, const char **Data, const char *blimit){
+ if(!contents || !Ps || !Colors || !Data || !blimit){ return(0); }
+ /* this structure is entirely optional */
+ if(IS_MEM_UNSAFE(contents, 4*2, blimit))return(0);
U_PMF_SERIAL_get(&contents, Ps, 4, 2, U_LE);
U_PMF_PTRSAV_SHIFT(Colors, &contents, Ps->Elements * sizeof(U_PMF_ARGB));
+ /* difficult to know how big the actual bitmap will be, just return the pointer to it untested */
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
return(1);
}
@@ -5627,13 +5698,15 @@ int U_PMF_BITMAPDATA_get(const char *contents, U_PMF_PALETTE *Ps, const char **C
\param contents Record from which to extract data
\param Elements Number of members in Positions and Colors
\param Positions Caller must free. Pointer to memory holding positions along gradient line.
- \param Colors Caller must NOT free memory ,Pointer to memory holding colors at positions on gradient line.
+ \param Colors Caller must NOT free memory, Pointer to memory holding colors at positions on gradient line.
EMF+ manual 2.2.2.4, Microsoft name: EmfPlusBlendColors Object
*/
-int U_PMF_BLENDCOLORS_get(const char *contents, uint32_t *Elements, U_FLOAT **Positions, const char **Colors){
- if(!contents || !Positions || !Colors){ return(0); }
+int U_PMF_BLENDCOLORS_get(const char *contents, uint32_t *Elements, U_FLOAT **Positions, const char **Colors, const char *blimit){
+ if(!contents || !Positions || !Colors || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_BLENDCOLORS), blimit))return(0);
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
+ if(IS_MEM_UNSAFE(contents, *Elements * 4, blimit))return(0);
if(!U_PMF_SERIAL_array_copy_get(&contents, (void **)Positions, 4, *Elements, U_LE,1)){ return(0); }
U_PMF_PTRSAV_SHIFT(Colors, &contents, 0);
return(1);
@@ -5649,9 +5722,11 @@ int U_PMF_BLENDCOLORS_get(const char *contents, uint32_t *Elements, U_FLOAT **Po
EMF+ manual 2.2.2.5, Microsoft name: EmfPlusBlendFactors Object
*/
-int U_PMF_BLENDFACTORS_get(const char *contents, uint32_t *Elements, U_FLOAT **Positions, U_FLOAT **Factors){
- if(!contents || !Elements || !Positions || !Factors){ return(0); }
+int U_PMF_BLENDFACTORS_get(const char *contents, uint32_t *Elements, U_FLOAT **Positions, U_FLOAT **Factors, const char *blimit){
+ if(!contents || !Elements || !Positions || !Factors || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_BLENDFACTORS), blimit))return(0);
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
+ if(IS_MEM_UNSAFE(contents, *Elements * 4 * 2, blimit))return(0);
if(!U_PMF_SERIAL_array_copy_get(&contents, (void **)Positions, 4, *Elements, U_LE, 1)){ return(0); }
if(!U_PMF_SERIAL_array_copy_get(&contents, (void **)Factors, 4, *Elements, U_LE, 1)){
free(*Positions);
@@ -5668,9 +5743,12 @@ int U_PMF_BLENDFACTORS_get(const char *contents, uint32_t *Elements, U_FLOAT **P
\param Data boundary of the brush
EMF+ manual 2.2.2.6, Microsoft name: EmfPlusBoundaryPathData Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_BOUNDARYPATHDATA_get(const char *contents, int32_t *Size, const char **Data){
- if(!contents || !Size || !Data){ return(0); }
+int U_PMF_BOUNDARYPATHDATA_get(const char *contents, int32_t *Size, const char **Data, const char *blimit){
+ if(!contents || !Size || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_BOUNDARYPATHDATA), blimit))return(0);
U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE);
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
return(1);
@@ -5680,14 +5758,16 @@ int U_PMF_BOUNDARYPATHDATA_get(const char *contents, int32_t *Size, const char *
\brief Get data from a U_PMF_BOUNDARYPOINTDATA object
\return 1 on success, 0 on error
\param contents Record from which to extract data
- \param Elements Members in POints
+ \param Elements Members in Points
\param Points Caller must free. Pointer to memory holding points along gradient line. Boundary of the brush.
EMF+ manual 2.2.2.7, Microsoft name: EmfPlusBoundaryPointData Object
*/
-int U_PMF_BOUNDARYPOINTDATA_get(const char *contents, int32_t *Elements, U_PMF_POINTF **Points){
- if(!contents || !Elements || !Points){ return(0); }
+int U_PMF_BOUNDARYPOINTDATA_get(const char *contents, int32_t *Elements, U_PMF_POINTF **Points, const char *blimit){
+ if(!contents || !Elements || !Points || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_BOUNDARYPOINTDATA), blimit))return(0);
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
+ if(IS_MEM_UNSAFE(contents, *Elements * 2, blimit))return(0);
if(!U_PMF_SERIAL_array_copy_get(&contents, (void **)Points, 4, *Elements * 2, U_LE, 1)){ return(0); }
return(1);
}
@@ -5701,8 +5781,9 @@ int U_PMF_BOUNDARYPOINTDATA_get(const char *contents, int32_t *Elements, U_PMF_P
EMF+ manual 2.2.2.8, Microsoft name: EmfPlusCharacterRange Object
*/
-int U_PMF_CHARACTERRANGE_get(const char *contents, int32_t *First, int32_t *Length){
- if(!contents || !First || !Length){ return(0); }
+int U_PMF_CHARACTERRANGE_get(const char *contents, int32_t *First, int32_t *Length, const char *blimit){
+ if(!contents || !First || !Length || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_CHARACTERRANGE), blimit))return(0);
U_PMF_SERIAL_get(&contents, First, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Length, 4, 1, U_LE);
return(1);
@@ -5717,9 +5798,11 @@ int U_PMF_CHARACTERRANGE_get(const char *contents, int32_t *First, int32_t *Leng
EMF+ manual 2.2.2.9, Microsoft name: EmfPlusCompoundLineData Object
*/
-int U_PMF_COMPOUNDLINEDATA_get(const char *contents, int32_t *Elements, U_FLOAT **Widths){
- if(!contents || !Elements || !Widths){ return(0); }
+int U_PMF_COMPOUNDLINEDATA_get(const char *contents, int32_t *Elements, U_FLOAT **Widths, const char *blimit){
+ if(!contents || !Elements || !Widths || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_COMPOUNDLINEDATA), blimit))return(0);
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
+ if(IS_MEM_UNSAFE(contents, *Elements * sizeof(U_FLOAT), blimit))return(0);
*Widths = (U_FLOAT *)malloc(*Elements * sizeof(U_FLOAT));
if(!*Widths){ return(0); }
U_PMF_SERIAL_get(&contents, *Widths, 4, *Elements, U_LE);
@@ -5736,9 +5819,12 @@ int U_PMF_COMPOUNDLINEDATA_get(const char *contents, int32_t *Elements, U_FLOAT
This function does not do anything useful, but it is included so that all objects have a corresponding _get().
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_COMPRESSEDIMAGE_get(const char *contents, const char **Data){
- if(!contents || !Data){ return(0); }
+int U_PMF_COMPRESSEDIMAGE_get(const char *contents, const char **Data, const char *blimit){
+ if(!contents || !Data || !blimit){ return(0); }
+ if(contents >= blimit)return(0);
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
return(1);
}
@@ -5751,9 +5837,12 @@ int U_PMF_COMPRESSEDIMAGE_get(const char *contents, const char **Data){
\param Data Description of linecap
EMF+ manual 2.2.2.11, Microsoft name: EmfPlusCustomEndCapData Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_CUSTOMENDCAPDATA_get(const char *contents, int32_t *Size, const char **Data){
- if(!contents || !Size || !Data){ return(0); }
+int U_PMF_CUSTOMENDCAPDATA_get(const char *contents, int32_t *Size, const char **Data, const char *blimit){
+ if(!contents || !Size || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_CUSTOMENDCAPDATA), blimit))return(0);
U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE);
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
return(1);
@@ -5767,8 +5856,9 @@ int U_PMF_CUSTOMENDCAPDATA_get(const char *contents, int32_t *Size, const char *
EMF+ manual 2.2.2.12, Microsoft name: EmfPlusCustomLineCapArrowData Object
*/
-int U_PMF_CUSTOMLINECAPARROWDATA_get(const char *contents, U_PMF_CUSTOMLINECAPARROWDATA *Ccad){
- if(!contents || !Ccad){ return(0); }
+int U_PMF_CUSTOMLINECAPARROWDATA_get(const char *contents, U_PMF_CUSTOMLINECAPARROWDATA *Ccad, const char *blimit){
+ if(!contents || !Ccad || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_CUSTOMLINECAPARROWDATA), blimit))return(0);
U_PMF_SERIAL_get(&contents, Ccad, 4, 13, U_LE);
return(1);
}
@@ -5781,9 +5871,12 @@ int U_PMF_CUSTOMLINECAPARROWDATA_get(const char *contents, U_PMF_CUSTOMLINECAPAR
\param Data variable part of U_PMF_CUSTOMLINECAPDATA
EMF+ manual 2.2.2.13, Microsoft name: EmfPlusCustomLineCapData Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_CUSTOMLINECAPDATA_get(const char *contents, U_PMF_CUSTOMLINECAPDATA *Clcd, const char **Data){
- if(!contents || !Clcd){ return(0); }
+int U_PMF_CUSTOMLINECAPDATA_get(const char *contents, U_PMF_CUSTOMLINECAPDATA *Clcd, const char **Data, const char *blimit){
+ if(!contents || !Clcd || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_CUSTOMLINECAPDATA), blimit))return(0);
U_PMF_SERIAL_get(&contents, Clcd, 4, 12, U_LE);
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
return(1);
@@ -5798,14 +5891,19 @@ int U_PMF_CUSTOMLINECAPDATA_get(const char *contents, U_PMF_CUSTOMLINECAPDATA *C
\param LineData Path to stroke (optional)
EMF+ manual 2.2.2.14, Microsoft name: EmfPlusCustomLineCapOptionalData Object
+
+ Caller must check LineData for possible memory access violations.
*/
-int U_PMF_CUSTOMLINECAPOPTIONALDATA_get(const char *contents, uint32_t Flags, const char **FillData, const char **LineData){
+int U_PMF_CUSTOMLINECAPOPTIONALDATA_get(const char *contents, uint32_t Flags, const char **FillData, const char **LineData, const char *blimit){
uint32_t length;
int status = 1;
- if(!contents){ return(0); }
+ if(!contents || !*FillData || !*LineData || !blimit){ return(0); }
+ /* this structure is entirely optional */
if(Flags & U_CLCD_FillPath){
if(!FillData){ return(0); }
+ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
U_PMF_SERIAL_get(&contents, &length, 4, 1, U_LE);
+ if(IS_MEM_UNSAFE(contents, length, blimit))return(0);
contents -= 4; /* undo the unneeded shift from preceding */
U_PMF_PTRSAV_SHIFT(FillData, &contents, 4 + length);
status += 2;
@@ -5814,6 +5912,10 @@ int U_PMF_CUSTOMLINECAPOPTIONALDATA_get(const char *contents, uint32_t Flags, co
if(Flags & U_CLCD_LinePath){
if(!LineData){ return(0); }
+ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ U_PMF_SERIAL_get(&contents, &length, 4, 1, U_LE);
+ if(IS_MEM_UNSAFE(contents, length, blimit))return(0);
+ contents -= 4; /* undo the unneeded shift from preceding */
U_PMF_PTRSAV_SHIFT(LineData, &contents, 0);
status += 4;
}
@@ -5829,9 +5931,12 @@ int U_PMF_CUSTOMLINECAPOPTIONALDATA_get(const char *contents, uint32_t Flags, co
\param Data Description of linecap
EMF+ manual 2.2.2.15, Microsoft name: EmfPlusCustomStartCapData Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_CUSTOMSTARTCAPDATA_get(const char *contents, int32_t *Size, const char **Data){
- if(!contents || !Size || !Data){ return(0); }
+int U_PMF_CUSTOMSTARTCAPDATA_get(const char *contents, int32_t *Size, const char **Data, const char *blimit){
+ if(!contents || !Size || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_CUSTOMSTARTCAPDATA), blimit))return(0);
U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE);
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
return(1);
@@ -5846,9 +5951,11 @@ int U_PMF_CUSTOMSTARTCAPDATA_get(const char *contents, int32_t *Size, const char
EMF+ manual 2.2.2.16, Microsoft name: EmfPlusDashedLineData Object
*/
-int U_PMF_DASHEDLINEDATA_get(const char *contents, int32_t *Elements, U_FLOAT **Lengths){
- if(!contents || !Elements || !Lengths){ return(0); }
+int U_PMF_DASHEDLINEDATA_get(const char *contents, int32_t *Elements, U_FLOAT **Lengths, const char *blimit){
+ if(!contents || !Elements || !Lengths || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_DASHEDLINEDATA), blimit))return(0);
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
+ if(IS_MEM_UNSAFE(contents, *Elements * sizeof(U_FLOAT), blimit))return(0);
*Lengths = (U_FLOAT *)malloc(*Elements * sizeof(U_FLOAT));
if(!*Lengths){ return(0); }
U_PMF_SERIAL_get(&contents, *Lengths, 4, *Elements, U_LE);
@@ -5863,9 +5970,12 @@ int U_PMF_DASHEDLINEDATA_get(const char *contents, int32_t *Elements, U_FLOAT **
\param Data Path specification
EMF+ manual 2.2.2.17, Microsoft name: EmfPlusFillPath Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_FILLPATHOBJ_get(const char *contents, int32_t *Size, const char **Data){
- if(!contents || !Size || !Data){ return(0); }
+int U_PMF_FILLPATHOBJ_get(const char *contents, int32_t *Size, const char **Data, const char *blimit){
+ if(!contents || !Size || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_FILLPATHO), blimit))return(0);
U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE);
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
return(1);
@@ -5881,8 +5991,9 @@ int U_PMF_FILLPATHOBJ_get(const char *contents, int32_t *Size, const char **Data
EMF+ manual 2.2.2.18, Microsoft name: EmfPlusFocusScaleData Object
*/
-int U_PMF_FOCUSSCALEDATA_get(const char *contents, uint32_t *Count, U_FLOAT *ScaleX, U_FLOAT *ScaleY){
- if(!contents || !Count || !ScaleX || !ScaleY){ return(0); }
+int U_PMF_FOCUSSCALEDATA_get(const char *contents, uint32_t *Count, U_FLOAT *ScaleX, U_FLOAT *ScaleY, const char *blimit){
+ if(!contents || !Count || !ScaleX || !ScaleY || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_FOCUSSCALEDATA), blimit))return(0);
U_PMF_SERIAL_get(&contents, Count, 4, 1, U_LE);
if(*Count != 2){ return(0); }
U_PMF_SERIAL_get(&contents, ScaleX, 4, 1, U_LE);
@@ -5899,9 +6010,10 @@ int U_PMF_FOCUSSCALEDATA_get(const char *contents, uint32_t *Count, U_FLOAT *Sca
EMF+ manual 2.2.2.19, Microsoft name: EmfPlusGraphicsVersion Object
*/
-int U_PMF_GRAPHICSVERSION_get(const char *contents, int *Signature, int *GrfVersion){
- if(!contents || !Signature || !GrfVersion){ return(0); }
+int U_PMF_GRAPHICSVERSION_get(const char *contents, int *Signature, int *GrfVersion, const char *blimit){
uint32_t tmp;
+ if(!contents || !Signature || !GrfVersion || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_GRAPHICSVERSION), blimit))return(0);
memcpy(&tmp, contents, 4);
*Signature = tmp >> 12;
*GrfVersion = tmp & U_GFVR_MASKLO;
@@ -5918,8 +6030,9 @@ int U_PMF_GRAPHICSVERSION_get(const char *contents, int *Signature, int *GrfVers
EMF+ manual 2.2.2.20, Microsoft name: EmfPlusHatchBrushData Object
*/
-int U_PMF_HATCHBRUSHDATA_get(const char *contents, uint32_t *Style, U_PMF_ARGB *Foreground, U_PMF_ARGB *Background){
- if(!contents || !Style || !Foreground || !Background){ return(0); }
+int U_PMF_HATCHBRUSHDATA_get(const char *contents, uint32_t *Style, U_PMF_ARGB *Foreground, U_PMF_ARGB *Background, const char *blimit){
+ if(!contents || !Style || !Foreground || !Background || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_HATCHBRUSHDATA), blimit))return(0);
U_PMF_SERIAL_get(&contents, Style, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Foreground, 4, 1, U_XE);
U_PMF_SERIAL_get(&contents, Background, 4, 1, U_XE);
@@ -5931,12 +6044,14 @@ int U_PMF_HATCHBRUSHDATA_get(const char *contents, uint32_t *Style, U_PMF_ARGB *
\return 1 on success, 0 on error
\param contents Record from which to extract data
\param Value 7 bit signed integer (stored in an integer)
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.21, Microsoft name: EmfPlusInteger7 Object
*/
-int U_PMF_INTEGER7_get(const char **contents, U_FLOAT *Value){
- if(!contents || !*contents || !Value){ return(0); }
+int U_PMF_INTEGER7_get(const char **contents, U_FLOAT *Value, const char *blimit){
uint8_t tmp;
+ if(!contents || !*contents || !Value || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(*contents, 1, blimit))return(0); /* past end of buffer */
if(**contents & U_TEST_INT7)return(0); /* this bit must be 0 in this object type */
U_PMF_SERIAL_get(contents, &tmp, 1, 1, U_XE);
if(tmp & U_SIGN_INT7){
@@ -5954,12 +6069,14 @@ int U_PMF_INTEGER7_get(const char **contents, U_FLOAT *Value){
\return 1 on success, 0 on error
\param contents Record from which to extract data
\param Value 15 bit signed integer (stored in an integer)
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.22, Microsoft name: EmfPlusInteger15 Object
*/
-int U_PMF_INTEGER15_get(const char **contents, U_FLOAT *Value){
- if(!contents || !*contents || !Value){ return(0); }
+int U_PMF_INTEGER15_get(const char **contents, U_FLOAT *Value, const char *blimit){
+ if(!contents || !*contents || !Value || !blimit){ return(0); }
uint16_t tmp;
+ if(IS_MEM_UNSAFE(*contents, 2, blimit))return(0); /* past end of buffer */
if(!(**contents & U_TEST_INT7))return(0); /* this bit must be 1 in this object type */
U_PMF_SERIAL_get(contents, &tmp, 2, 1, U_BE);
tmp &= U_MASK_INT15; /* drop the 7/15 flag from the most significant bit */
@@ -6000,11 +6117,15 @@ int U_PMF_LANGUAGEIDENTIFIER_get(U_PMF_LANGUAGEIDENTIFIER LId, int *SubLId, int
\param contents Record from which to extract data
\param Lgbd U_PMF_LINEARGRADIENTBRUSHDATA structure, with no variable part
\param Data variable part of U_PMF_LINEARGRADIENTBRUSHDATA
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.24, Microsoft name: EmfPlusLinearGradientBrushData Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_LINEARGRADIENTBRUSHDATA_get(const char *contents, U_PMF_LINEARGRADIENTBRUSHDATA *Lgbd, const char **Data){
- if(!contents || !Lgbd || !Data){ return(0); }
+int U_PMF_LINEARGRADIENTBRUSHDATA_get(const char *contents, U_PMF_LINEARGRADIENTBRUSHDATA *Lgbd, const char **Data, const char *blimit){
+ if(!contents || !Lgbd || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_LINEARGRADIENTBRUSHDATA), blimit))return(0);
U_PMF_SERIAL_get(&contents, Lgbd, 4, 6, U_LE); /* Flags, WrapMode, RectF*/
U_PMF_SERIAL_get(&contents, &(Lgbd->StartColor), 4, 4, U_XE); /* StartColor, EndColor, Reserved1 & 2 */
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
@@ -6020,27 +6141,42 @@ int U_PMF_LINEARGRADIENTBRUSHDATA_get(const char *contents, U_PMF_LINEARGRADIENT
\param Bc U_PMF_BLENDCOLORS object or NULL
\param BfH U_PMF_BLENDFACTORS (H) object or NULL
\param BfV U_PMF_BLENDFACTORS (V) object or NULL (WARNING, GDI+ defines this field but does not render it. DO NOT USE.)
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.25, Microsoft name: EmfPlusLinearGradientBrushOptionalData Object
+
*/
int U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_get(const char *contents, uint32_t Flags, U_PMF_TRANSFORMMATRIX *Tm,
- const char **Bc, const char **BfH, const char **BfV){
+ const char **Bc, const char **BfH, const char **BfV, const char *blimit){
uint32_t Elements;
- if(!contents || !Tm|| !Bc || !BfH || !BfV){ return(0); }
+ if(!contents || !Tm|| !Bc || !BfH || !BfV || !blimit){ return(0); }
+ /* all of the fields are optional! */
*Bc = *BfH = *BfV = NULL;
- if(Flags & U_BD_Transform)U_PMF_SERIAL_get(&contents, Tm, 4, 6, U_LE);
+ if(Flags & U_BD_Transform){
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_ROTMATRIX), blimit))return(0);
+ U_PMF_SERIAL_get(&contents, Tm, 4, 6, U_LE);
+ }
if(Flags & U_BD_PresetColors){
+ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ U_PMF_SERIAL_get(&contents, &Elements, 4, 1, U_LE); /* starts with a 4 byte count*/
+ if(IS_MEM_UNSAFE(contents, Elements * ( sizeof(U_FLOAT) + sizeof(U_PMF_ARGB)), blimit))return(0);
+ contents-=4; /* back up to the front of the count, as it is part of the data field */
U_PMF_PTRSAV_SHIFT(Bc, &contents, 0);
}
else if(Flags & U_BD_BlendFactorsH){
U_PMF_SERIAL_get(&contents, &Elements, 4, 1, U_LE); /* starts with a 4 byte count*/
+ if(IS_MEM_UNSAFE(contents, Elements * 2 * sizeof(U_FLOAT), blimit))return(0);
contents-=4; /* back up to the front of the count, as it is part of the data field */
- U_PMF_PTRSAV_SHIFT(BfH, &contents, 4 + 8*Elements); /* 4 byte count + 2 * 4bytes * Elements */
+ U_PMF_PTRSAV_SHIFT(BfH, &contents, 4 + (Elements * 2 * sizeof(U_FLOAT))); /* 4 byte count + 2 * 4bytes * Elements */
if(Flags & U_BD_BlendFactorsV){
+ if(IS_MEM_UNSAFE(contents, Elements * 2 * sizeof(U_FLOAT), blimit))return(0);
U_PMF_PTRSAV_SHIFT(BfV, &contents, 0);
}
}
else if(Flags & U_BD_BlendFactorsV){
+ U_PMF_SERIAL_get(&contents, &Elements, 4, 1, U_LE); /* starts with a 4 byte count*/
+ if(IS_MEM_UNSAFE(contents, Elements * 2 * sizeof(U_FLOAT), blimit))return(0);
+ contents-=4; /* back up to the front of the count, as it is part of the data field */
U_PMF_PTRSAV_SHIFT(BfV, &contents, 0);
}
return(1);
@@ -6052,11 +6188,15 @@ int U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_get(const char *contents, uint32_t Fla
\param contents Record from which to extract data
\param Size Bytes in Data
\param Data Outline path
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.26, Microsoft name: EmfPlusLinePath Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_LINEPATH_get(const char *contents, int32_t *Size, const char **Data){
- if(!contents || !Size || !Data){ return(0); }
+int U_PMF_LINEPATH_get(const char *contents, int32_t *Size, const char **Data, const char *blimit){
+ if(!contents || !Size || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_LINEPATH), blimit))return(0);
U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE);
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
return(1);
@@ -6069,11 +6209,15 @@ int U_PMF_LINEPATH_get(const char *contents, int32_t *Size, const char **Data){
\param Type
\param Size Bytes in Data
\param Data Various types of data, like an EMF metafile, WMF metafile, another EMF+ metafile
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.27, Microsoft name: EmfPlusMetafile Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_METAFILE_get(const char *contents, uint32_t *Type, uint32_t *Size, const char **Data){
- if(!contents || !Type || !Size || !Data){ return(0); }
+int U_PMF_METAFILE_get(const char *contents, uint32_t *Type, uint32_t *Size, const char **Data, const char *blimit){
+ if(!contents || !Type || !Size || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_METAFILE), blimit))return(0);
U_PMF_SERIAL_get(&contents, &Type, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, &Size, 4, 1, U_LE);
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
@@ -6087,13 +6231,16 @@ int U_PMF_METAFILE_get(const char *contents, uint32_t *Type, uint32_t *Size, con
\param Flags PaletteStyle flags
\param Elements Members in the array
\param Colors Palette data (array of colors)
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.28, Microsoft name: EmfPlusPalette Object
*/
-int U_PMF_PALETTE_get(const char *contents, uint32_t *Flags, uint32_t *Elements, const char **Colors){
- if(!contents || !Flags || !Elements || !Colors){ return(0); }
+int U_PMF_PALETTE_get(const char *contents, uint32_t *Flags, uint32_t *Elements, const char **Colors, const char *blimit){
+ if(!contents || !Flags || !Elements || !Colors || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_PALETTE), blimit))return(0);
U_PMF_SERIAL_get(&contents, &Flags, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, &Elements, 4, 1, U_LE);
+ if(IS_MEM_UNSAFE(contents, *Elements*sizeof(U_RGBQUAD), blimit))return(0);
U_PMF_PTRSAV_SHIFT(Colors, &contents, 0);
return(1);
@@ -6107,21 +6254,32 @@ int U_PMF_PALETTE_get(const char *contents, uint32_t *Flags, uint32_t *Elements,
\param Gradient variable part of U_PMF_LINEARGRADIENTBRUSHDATA, Color Gradient with Elements members
\param Boundary variable part of U_PMF_LINEARGRADIENTBRUSHDATA, U_PMF_BOUNDARYPATHDATA object if BrushDataPath bit set in Flag, else U_PMF_BOUNDARYPOINTDATA object
\param Data variable part of U_PMF_LINEARGRADIENTBRUSHDATA, exact composition depends on Flags
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.29, Microsoft name: EmfPlusPathGradientBrushData Object
+
+ Caller must check Data for possible memory access violations.
+
*/
-int U_PMF_PATHGRADIENTBRUSHDATA_get(const char *contents, U_PMF_PATHGRADIENTBRUSHDATA *Pgbd, const char **Gradient, const char **Boundary, const char **Data){
- if(!contents || !Pgbd || !Gradient || !Boundary || !Data){ return(0); }
+int U_PMF_PATHGRADIENTBRUSHDATA_get(const char *contents, U_PMF_PATHGRADIENTBRUSHDATA *Pgbd, const char **Gradient,
+ const char **Boundary, const char **Data, const char *blimit){
+ if(!contents || !Pgbd || !Gradient || !Boundary || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_PATHGRADIENTBRUSHDATA), blimit))return(0);
uint32_t Size;
U_PMF_SERIAL_get(&contents, Pgbd, 4, 2, U_LE); /* Flags and WrapMode*/
U_PMF_SERIAL_get(&contents, &(Pgbd->CenterColor), 4, 1, U_XE);
U_PMF_SERIAL_get(&contents, &(Pgbd->Center), 4, 3, U_LE); /* Center and Elements */
+ if(IS_MEM_UNSAFE(contents, Pgbd->Elements * sizeof(U_PMF_ARGB), blimit))return(0);
U_PMF_PTRSAV_SHIFT(Gradient, &contents, Pgbd->Elements * sizeof(U_PMF_ARGB));
U_PMF_PTRSAV_SHIFT(Boundary, &contents, 0);
U_PMF_SERIAL_get(&contents, &Size, 4, 1, U_LE); /* The first 4 bytes of the Boundary are always a size */
if(Pgbd->Flags & U_BD_Path){ contents += Size; } // U_PMF_BOUNDARYPATHDATA
else { contents += Size*2*sizeof(U_FLOAT); } // U_PMF_BOUNDARYPOINTDATA
- U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
+ if(Pgbd->Flags & (U_BD_Transform |U_BD_PresetColors | U_BD_BlendFactorsH| U_BD_FocusScales)){ // optional data present
+ if(contents >= blimit)return(0); // the size is variable but this must still hold
+ U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
+ }
+ else { *Data = NULL; } // no optional data present
return(1);
}
@@ -6133,15 +6291,34 @@ int U_PMF_PATHGRADIENTBRUSHDATA_get(const char *contents, U_PMF_PATHGRADIENTBRUS
\param Matrix Transformation matrix
\param Pattern Blend Pattern
\param Data Focus scales for the brush
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.30, Microsoft name: EmfPlusPathGradientBrushOptionalData Object
*/
-int U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_get(const char *contents, uint32_t Flags, U_PMF_TRANSFORMMATRIX *Matrix, const char **Pattern, const char **Data){
- if(!contents || !Flags || !Matrix || !Pattern || !Data){ return(0); }
- U_PMF_SERIAL_get(&contents, &Flags, 4, 1, U_LE);
- U_PMF_SERIAL_get(&contents, Matrix, 4, 6, U_LE);
- U_PMF_PTRSAV_COND(Data, contents, (Flags & (U_BD_PresetColors | U_BD_BlendFactorsH)));
- U_PMF_PTRSAV_COND(Data, contents, (Flags & U_BD_FocusScales));
+int U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_get(const char *contents, uint32_t Flags, U_PMF_TRANSFORMMATRIX *Matrix,
+ const char **Pattern, const char **Data, const char *blimit){
+ int varsize;
+ if(!contents || !Flags || !Matrix || !Pattern || !Data || !blimit){ return(0); }
+ /* this structure is entirely optional */
+ if(Flags & U_BD_Transform){
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_TRANSFORMMATRIX), blimit))return(0);
+ U_PMF_SERIAL_get(&contents, Matrix, 4, 6, U_LE);
+ }
+ if(Flags & (U_BD_PresetColors | U_BD_BlendFactorsH)){
+ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ uint32_t Elements;
+ U_PMF_SERIAL_get(&contents, &Elements, 4, 1, U_LE);
+ contents -= 4;
+ varsize=(Elements * 4 * (Flags & U_BD_BlendFactorsH ? 2 :1));
+ if(IS_MEM_UNSAFE(contents, varsize, blimit))return(0);
+ U_PMF_PTRSAV_SHIFT(Pattern, &contents, varsize);
+ }
+ else { *Pattern=NULL; }
+ if(Flags & U_BD_FocusScales){
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_FOCUSSCALEDATA), blimit))return(0);
+ U_PMF_PTRSAV_SHIFT(Data, &contents, sizeof(U_PMF_FOCUSSCALEDATA));
+ }
+ else { *Data=NULL; }
return(1);
}
@@ -6151,14 +6328,16 @@ int U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_get(const char *contents, uint32_t Flags
\param contents Record from which to extract data
\param Flags PathPointType flags
\param Type PathPointType enumeration
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.31, Microsoft name: EmfPlusPathPointType Object
Note: order of 4bit fields appears to be shown in the LE column, not as
documented in the BE column.
*/
-int U_PMF_PATHPOINTTYPE_get(const char *contents, int *Flags, int *Type){
- if(!contents || !Flags || !Type){ return(0); }
+int U_PMF_PATHPOINTTYPE_get(const char *contents, int *Flags, int *Type, const char *blimit){
+ if(!contents || !Flags || !Type || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, 1, blimit))return(0);
uint8_t tmp;
memcpy(&tmp, contents, 1);
*Flags =(tmp & U_PTP_MASK) >> U_PTP_SHIFT;
@@ -6172,13 +6351,15 @@ int U_PMF_PATHPOINTTYPE_get(const char *contents, int *Flags, int *Type){
\param contents Record from which to extract data
\param Bezier Set: Bezier curve, Clear: straight line
\param RL Run Length
- \param Ppt PathPointType enumeration
+ \param Ppt PathPointType enumeration
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.32, Microsoft name: EmfPlusPathPointTypeRLE Object
*/
-int U_PMF_PATHPOINTTYPERLE_get(const char *contents, int *Bezier, int *RL, int *Ppt){
- if(!contents || !Bezier || !RL || !Ppt){ return(0); }
+int U_PMF_PATHPOINTTYPERLE_get(const char *contents, int *Bezier, int *RL, int *Ppt, const char *blimit){
+ if(!contents || !Bezier || !RL || !Ppt || !blimit){ return(0); }
uint16_t tmp;
+ if(IS_MEM_UNSAFE(contents, 2, blimit))return(0);
U_PMF_SERIAL_get(&contents, &tmp, 2, 1, U_LE);
*Bezier = tmp & U_PPF_BZ;
*RL = (tmp >> U_FF_SHFT_RL) & U_FF_MASK_RL;
@@ -6194,14 +6375,17 @@ int U_PMF_PATHPOINTTYPERLE_get(const char *contents, int *Bezier, int *RL, int *
\param Unit UnitType enumeration
\param Width Width in units set by Unit
\param Data Optional pen data, exact composition depends on Flags
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.33, Microsoft name: EmfPlusPenData Object
*/
-int U_PMF_PENDATA_get(const char *contents, uint32_t *Flags, uint32_t *Unit, U_FLOAT *Width, const char **Data){
- if(!contents || !Flags || !Unit || !Width || !Data){ return(0); }
+int U_PMF_PENDATA_get(const char *contents, uint32_t *Flags, uint32_t *Unit, U_FLOAT *Width, const char **Data, const char *blimit){
+ if(!contents || !Flags || !Unit || !Width || !Data || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, 3*4, blimit))return(0);
U_PMF_SERIAL_get(&contents, Flags, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Unit, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Width, 4, 1, U_LE);
+ if(contents >= blimit)return(0); // variable data will extend farther, but this much at least must be true
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
return(1);
}
@@ -6224,6 +6408,7 @@ int U_PMF_PENDATA_get(const char *contents, uint32_t *Flags, uint32_t *Unit, U_F
\param CmpndLineData Compount Line (parallel lines drawn instead of one)
\param CSCapData Custom start cap
\param CECapData Custom end cap
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.34, Microsoft name: EmfPlusPenOptionalData Object
@@ -6245,26 +6430,56 @@ int U_PMF_PENOPTIONALDATA_get(
int32_t *Alignment,
const char **CmpndLineData,
const char **CSCapData,
- const char **CECapData){
+ const char **CECapData,
+ const char *blimit){
if(!contents ||
!Flags || !Matrix || !StartCap || !EndCap ||
!Join || !MiterLimit || !Style || !DLCap ||
!DLOffset || !DLData || !Alignment || !CmpndLineData ||
- !CSCapData || !CECapData){ return(0); }
-
- if(Flags & U_PD_Transform){ U_PMF_SERIAL_get(&contents, Matrix, 4, 6, U_LE); }
- if(Flags & U_PD_StartCap){ U_PMF_SERIAL_get(&contents, StartCap, 4, 1, U_LE); }
- if(Flags & U_PD_EndCap){ U_PMF_SERIAL_get(&contents, EndCap, 4, 1, U_LE); }
- if(Flags & U_PD_Join){ U_PMF_SERIAL_get(&contents, Join, 4, 1, U_LE); }
- if(Flags & U_PD_MiterLimit){ U_PMF_SERIAL_get(&contents, MiterLimit, 4, 1, U_LE); }
- if(Flags & U_PD_LineStyle){ U_PMF_SERIAL_get(&contents, Style, 4, 1, U_LE); }
- if(Flags & U_PD_DLCap){ U_PMF_SERIAL_get(&contents, DLCap, 4, 1, U_LE); }
- if(Flags & U_PD_DLOffset){ U_PMF_SERIAL_get(&contents, DLOffset, 4, 1, U_LE); }
- if(Flags & U_PD_DLData){ U_PMF_PTRSAV_SHIFT( DLData, &contents, U_PMF_LEN_FLOATDATA(contents)); }
- if(Flags & U_PD_NonCenter){ U_PMF_SERIAL_get(&contents, Alignment, 4, 1, U_LE); }
- if(Flags & U_PD_CLData){ U_PMF_PTRSAV_SHIFT( CmpndLineData, &contents, U_PMF_LEN_FLOATDATA(contents)); }
- if(Flags & U_PD_CustomStartCap){ U_PMF_PTRSAV_SHIFT( CSCapData, &contents, U_PMF_LEN_BYTEDATA(contents)); }
- if(Flags & U_PD_CustomEndCap){ U_PMF_PTRSAV_SHIFT( CECapData, &contents, U_PMF_LEN_BYTEDATA(contents)); }
+ !CSCapData || !CECapData || !blimit){ return(0); }
+
+ if(Flags & U_PD_Transform){ if(IS_MEM_UNSAFE(contents, 4*6, blimit))return(0);
+ U_PMF_SERIAL_get(&contents, Matrix, 4, 6, U_LE);
+ }
+ if(Flags & U_PD_StartCap){ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ U_PMF_SERIAL_get(&contents, StartCap, 4, 1, U_LE);
+ }
+ if(Flags & U_PD_EndCap){ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ U_PMF_SERIAL_get(&contents, EndCap, 4, 1, U_LE);
+ }
+ if(Flags & U_PD_Join){ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ U_PMF_SERIAL_get(&contents, Join, 4, 1, U_LE);
+ }
+ if(Flags & U_PD_MiterLimit){ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ U_PMF_SERIAL_get(&contents, MiterLimit, 4, 1, U_LE);
+ }
+ if(Flags & U_PD_LineStyle){ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ U_PMF_SERIAL_get(&contents, Style, 4, 1, U_LE);
+ }
+ if(Flags & U_PD_DLCap){ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ U_PMF_SERIAL_get(&contents, DLCap, 4, 1, U_LE);
+ }
+ if(Flags & U_PD_DLOffset){ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ U_PMF_SERIAL_get(&contents, DLOffset, 4, 1, U_LE);
+ }
+ if(Flags & U_PD_DLData){ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ if(IS_MEM_UNSAFE(contents, U_PMF_LEN_FLOATDATA(contents), blimit))return(0);
+ U_PMF_PTRSAV_SHIFT( DLData, &contents, U_PMF_LEN_FLOATDATA(contents));
+ }
+ if(Flags & U_PD_NonCenter){ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ U_PMF_SERIAL_get(&contents, Alignment, 4, 1, U_LE); }
+ if(Flags & U_PD_CLData){ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ if(IS_MEM_UNSAFE(contents, U_PMF_LEN_FLOATDATA(contents), blimit))return(0);
+ U_PMF_PTRSAV_SHIFT( CmpndLineData, &contents, U_PMF_LEN_FLOATDATA(contents));
+ }
+ if(Flags & U_PD_CustomStartCap){ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ if(IS_MEM_UNSAFE(contents, U_PMF_LEN_BYTEDATA(contents), blimit))return(0);
+ U_PMF_PTRSAV_SHIFT( CSCapData, &contents, U_PMF_LEN_BYTEDATA(contents));
+ }
+ if(Flags & U_PD_CustomEndCap){ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
+ if(IS_MEM_UNSAFE(contents, U_PMF_LEN_BYTEDATA(contents), blimit))return(0);
+ U_PMF_PTRSAV_SHIFT( CECapData, &contents, U_PMF_LEN_BYTEDATA(contents));
+ }
return(1);
}
@@ -6274,12 +6489,14 @@ int U_PMF_PENOPTIONALDATA_get(
\param contents Record from which to extract data. On return position is offset by sizeof(U_PMF_POINT).
\param X X coordinate
\param Y Y coordinate
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.35, Microsoft name: EmfPlusPoint Object
*/
-int U_PMF_POINT_get(const char **contents, U_FLOAT *X, U_FLOAT *Y){
- if(!contents || !X || !Y){ return(0); }
+int U_PMF_POINT_get(const char **contents, U_FLOAT *X, U_FLOAT *Y, const char *blimit){
+ if(!contents || !X || !Y || !blimit){ return(0); }
int16_t tmp;
+ if(IS_MEM_UNSAFE(*contents, 2*2, blimit))return(0);
U_PMF_SERIAL_get(contents, &tmp, 2, 1, U_LE); *X = tmp;
U_PMF_SERIAL_get(contents, &tmp, 2, 1, U_LE); *Y = tmp;
return(1);
@@ -6291,11 +6508,13 @@ int U_PMF_POINT_get(const char **contents, U_FLOAT *X, U_FLOAT *Y){
\param contents Record from which to extract data. On return position is offset by sizeof(U_PMF_POINTF).
\param X X coordinate
\param Y Y coordinate
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.36, Microsoft name: EmfPlusPointF Object
*/
-int U_PMF_POINTF_get(const char **contents, U_FLOAT *X, U_FLOAT *Y){
- if(!contents || !X || !Y){ return(0); }
+int U_PMF_POINTF_get(const char **contents, U_FLOAT *X, U_FLOAT *Y, const char *blimit){
+ if(!contents || !X || !Y || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(*contents, 4*2, blimit))return(0);
U_PMF_SERIAL_get(contents, X, 4, 1, U_LE);
U_PMF_SERIAL_get(contents, Y, 4, 1, U_LE);
return(1);
@@ -6307,19 +6526,20 @@ int U_PMF_POINTF_get(const char **contents, U_FLOAT *X, U_FLOAT *Y){
\param contents Record from which to extract data. On return position is offset by returned size.
\param X X coordinate
\param Y Y coordinate
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.37, Microsoft name: EmfPlusPointR Object
*/
-int U_PMF_POINTR_get(const char **contents, U_FLOAT *X, U_FLOAT *Y){
- if(!contents || !*contents | !X || !Y){ return(0); }
+int U_PMF_POINTR_get(const char **contents, U_FLOAT *X, U_FLOAT *Y, const char *blimit){
+ if(!contents || !*contents | !X || !Y || !blimit){ return(0); }
int size=0;
- if( U_PMF_INTEGER7_get( contents, X)){ size +=1; }
- else if(U_PMF_INTEGER15_get(contents, X)){ size +=2; }
+ if( U_PMF_INTEGER7_get( contents, X, blimit)){ size +=1; }
+ else if(U_PMF_INTEGER15_get(contents, X, blimit)){ size +=2; }
else { return(0); }
- if( U_PMF_INTEGER7_get( contents, Y)){ size +=1; }
- else if(U_PMF_INTEGER15_get(contents, Y)){ size +=2; }
+ if( U_PMF_INTEGER7_get( contents, Y, blimit)){ size +=1; }
+ else if(U_PMF_INTEGER15_get(contents, Y, blimit)){ size +=2; }
else { return(0); }
return(size);
@@ -6332,31 +6552,38 @@ int U_PMF_POINTR_get(const char **contents, U_FLOAT *X, U_FLOAT *Y){
\param Flags Record flags (bits U_PPF_C and U_PPF_P are referenced)
\param Elements Number of points to retrieve.
\param Points Caller must free. Array of U_PMF_POINTF coordinates.
+ \param blimit one byte past the end of data
+
+ This function should never be called directly by end user code.
*/
-int U_PMF_VARPOINTS_get(const char **contents, uint16_t Flags, int Elements, U_PMF_POINTF **Points){
+int U_PMF_VARPOINTS_get(const char *contents, uint16_t Flags, int Elements, U_PMF_POINTF **Points, const char *blimit){
int status = 0;
- if(!contents || !*contents || !Points || !Elements){ return(status); }
+ if(!contents || !Points || !Elements || !blimit){ return(status); }
U_PMF_POINTF *pts = (U_PMF_POINTF *)malloc(Elements * sizeof(U_PMF_POINTF));
if(!pts){ return(status); }
*Points = pts;
U_FLOAT XF, YF;
U_FLOAT XFS, YFS;
- for(XFS = YFS = 0.0; Elements; Elements--, pts++){
- if(Flags & U_PPF_P){
- if(!U_PMF_POINTR_get(contents, &XF, &YF))break; /* this should never happen */
+ if(Flags & U_PPF_P){
+ for(XFS = YFS = 0.0; Elements; Elements--, pts++){
+ if(!U_PMF_POINTR_get(&contents, &XF, &YF, blimit))return(0); /* this should never happen */
XFS += XF; /* position relative to previous point, first point is always 0,0 */
YFS += YF;
pts->X = XFS;
pts->Y = YFS;
}
- else if(Flags & U_PPF_C){
- if(!U_PMF_POINT_get(contents, &XF, &XF))break; /* this should never happen */
+ }
+ else if(Flags & U_PPF_C){
+ for(XFS = YFS = 0.0; Elements; Elements--, pts++){
+ if(!U_PMF_POINT_get(&contents, &XF, &XF, blimit))break; /* this should never happen */
pts->X = XF;
pts->Y = YF;
}
- else {
- (void) U_PMF_POINTF_get(contents, &(pts->X), &(pts->Y));
+ }
+ else {
+ for(XFS = YFS = 0.0; Elements; Elements--, pts++){
+ (void) U_PMF_POINTF_get(&contents, &(pts->X), &(pts->Y), blimit);
}
}
if(Elements){ /* some error in the preceding */
@@ -6377,11 +6604,13 @@ int U_PMF_VARPOINTS_get(const char **contents, uint16_t Flags, int Elements, U_P
\param Y UL Y value
\param Width Width
\param Height Height
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.38, Microsoft name: EmfPlusRect Object
*/
-int U_PMF_RECT_get(const char **contents, int16_t *X, int16_t *Y, int16_t *Width, int16_t *Height){
+int U_PMF_RECT_get(const char **contents, int16_t *X, int16_t *Y, int16_t *Width, int16_t *Height, const char *blimit){
if(!contents || !X || !Y|| !Width || !Height){ return(0); }
+ if(IS_MEM_UNSAFE(*contents, 2*4, blimit))return(0);
U_PMF_SERIAL_get(contents, X, 2, 1, U_LE);
U_PMF_SERIAL_get(contents, Y, 2, 1, U_LE);
U_PMF_SERIAL_get(contents, Width, 2, 1, U_LE);
@@ -6397,11 +6626,13 @@ int U_PMF_RECT_get(const char **contents, int16_t *X, int16_t *Y, int16_t *Width
\param Y UL Y value
\param Width Width
\param Height Height
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.39, Microsoft name: EmfPlusRectF Object
*/
-int U_PMF_RECTF_get(const char **contents, U_FLOAT *X, U_FLOAT *Y, U_FLOAT *Width, U_FLOAT *Height){
+int U_PMF_RECTF_get(const char **contents, U_FLOAT *X, U_FLOAT *Y, U_FLOAT *Width, U_FLOAT *Height, const char *blimit){
if(!contents || !X || !Y|| !Width || !Height){ return(0); }
+ if(IS_MEM_UNSAFE(*contents, 4*4, blimit))return(0);
U_PMF_SERIAL_get(contents, X, 4, 1, U_LE);
U_PMF_SERIAL_get(contents, Y, 4, 1, U_LE);
U_PMF_SERIAL_get(contents, Width, 4, 1, U_LE);
@@ -6416,13 +6647,14 @@ int U_PMF_RECTF_get(const char **contents, U_FLOAT *X, U_FLOAT *Y, U_FLOAT *Widt
\param Flags Record flags (bit U_PPF_C is referenced)
\param Elements Number of rects to retrieve.
\param Rects Caller must free. Array of U_PMF_RECTF coordinates.
+ \param blimit one byte past the end of data
Rects in record may be either U_PMF_RECT or U_PMF_RECTF, but this function always
returns U_PMF_RECTF
*/
-int U_PMF_VARRECTS_get(const char **contents, uint16_t Flags, int Elements, U_PMF_RECTF **Rects){
+int U_PMF_VARRECTS_get(const char **contents, uint16_t Flags, int Elements, U_PMF_RECTF **Rects, const char *blimit){
int16_t X16, Y16, Width, Height;
- if(!contents || !*contents || !Rects){ return(0); }
+ if(!contents || !*contents || !Rects || !blimit){ return(0); }
U_PMF_RECTF *rts = (U_PMF_RECTF *)malloc(Elements * sizeof(U_PMF_RECTF));
if(!rts){
*Rects = NULL;
@@ -6430,16 +6662,28 @@ int U_PMF_VARRECTS_get(const char **contents, uint16_t Flags, int Elements, U_PM
}
*Rects = rts;
+ if(Flags & U_PPF_C){
+ if(IS_MEM_UNSAFE(*contents, Elements*sizeof(U_PMF_RECT), blimit)){
+ free(rts);
+ return(0);
+ }
+ }
+ else {
+ if(IS_MEM_UNSAFE(*contents, Elements*sizeof(U_PMF_RECT), blimit)){
+ free(rts);
+ return(0);
+ }
+ }
for(; Elements; Elements--, rts++){
if(Flags & U_PPF_C){
- (void) U_PMF_RECT_get(contents, &X16, &Y16, &Width, &Height);
+ (void) U_PMF_RECT_get(contents, &X16, &Y16, &Width, &Height, blimit);
rts->X = X16;
rts->Y = Y16;
rts->Width = Width;
rts->Height = Height;
}
else {
- (void) U_PMF_RECTF_get(contents, &(rts->X), &(rts->Y), &(rts->Width), &(rts->Height));
+ (void) U_PMF_RECTF_get(contents, &(rts->X), &(rts->Y), &(rts->Width), &(rts->Height), blimit);
}
}
return(1);
@@ -6451,13 +6695,18 @@ int U_PMF_VARRECTS_get(const char **contents, uint16_t Flags, int Elements, U_PM
\param contents Record from which to extract data
\param Type RegionNodeDataType
\param Data Depending on Type: U_PMF_REGIONNODEPATH, U_PMF_RECTF, or U_PMF_REGIONNODECHILDNODES
-
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.40, Microsoft name: EmfPlusRegionNode Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_REGIONNODE_get(const char *contents, uint32_t *Type, const char **Data){
- if(!contents || !Type|| !Data){ return(0); }
+int U_PMF_REGIONNODE_get(const char *contents, uint32_t *Type, const char **Data, const char *blimit){
+ if(!contents || !Type || !Data || !blimit){ return(0); }
+ /* Important! This only checks the constant part, the caller must check that returned data doesn't exceed blimit */
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_REGIONNODE), blimit))return(0);
U_PMF_SERIAL_get(&contents, Type, 4, 1, U_LE);
+ if(contents >= blimit)return(0); // returned Data is variable size, this much at least must be true
U_PMF_PTRSAV_COND(Data, contents, !(*Type == U_RNDT_Empty || *Type == U_RNDT_Infinite ));
return(1);
}
@@ -6481,12 +6730,16 @@ int U_PMF_REGIONNODE_get(const char *contents, uint32_t *Type, const char **Data
\param contents Record from which to extract data
\param Size Bytes in Data
\param Data Boundary of region node
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.42, Microsoft name: EmfPlusRegionNodePath Object
*/
-int U_PMF_REGIONNODEPATH_get(const char *contents, int32_t *Size, const char **Data){
- if(!contents || !Size || !Data){ return(0); }
+int U_PMF_REGIONNODEPATH_get(const char *contents, int32_t *Size, const char **Data, const char *blimit){
+ if(!contents || !Size || !Data || !blimit){ return(0); }
+ /* Important! This only checks the constant part, the caller must check that returned data doesn't exceed blimit */
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_REGIONNODEPATH), blimit))return(0);
U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE);
+ if(contents >= blimit)return(0); // returned Data is variable size, this much at least must be true
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
return(1);
}
@@ -6496,11 +6749,13 @@ int U_PMF_REGIONNODEPATH_get(const char *contents, int32_t *Size, const char **D
\return 1 on success, 0 on error
\param contents Record from which to extract data
\param Color Color of brush
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.43, Microsoft name: EmfPlusSolidBrushData Object
*/
-int U_PMF_SOLIDBRUSHDATA_get(const char *contents, U_PMF_ARGB *Color){
- if(!contents || !Color){ return(0); }
+int U_PMF_SOLIDBRUSHDATA_get(const char *contents, U_PMF_ARGB *Color, const char *blimit){
+ if(!contents || !Color || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_SOLIDBRUSHDATA), blimit))return(0);
U_PMF_SERIAL_get(&contents, Color, 4, 1, U_XE);
return(1);
}
@@ -6513,12 +6768,14 @@ int U_PMF_SOLIDBRUSHDATA_get(const char *contents, U_PMF_ARGB *Color){
\param RangeCount Entries in CharRange array
\param TabStops Array of tabstop locations
\param CharRange Array of character ranges in the text
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.44, Microsoft name: EmfPlusStringFormatData Object
*/
int U_PMF_STRINGFORMATDATA_get(const char *contents, uint32_t TabStopCount, uint32_t RangeCount,
- const U_FLOAT **TabStops, const U_PMF_CHARACTERRANGE **CharRange){
- if(!contents || !TabStops|| !CharRange){ return(0); }
+ const U_FLOAT **TabStops, const U_PMF_CHARACTERRANGE **CharRange, const char *blimit){
+ if(!contents || !TabStops|| !CharRange || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, (TabStopCount + 2*RangeCount)*4, blimit))return(0);
*TabStops = NULL;
if(TabStopCount > 0){ U_PMF_SERIAL_get(&contents, TabStops, 4, TabStopCount, U_LE); }
*CharRange = NULL;
@@ -6533,13 +6790,19 @@ int U_PMF_STRINGFORMATDATA_get(const char *contents, uint32_t TabStopCount, uint
\param Flags BrushData flags
\param WrapMode WrapMode enumeration
\param Data Optional texture data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.45, Microsoft name: EmfPlusTextureBrushData Object
+
+ Caller must check Data for possible memory access violations.
*/
-int U_PMF_TEXTUREBRUSHDATA_get(const char *contents, uint32_t *Flags, int32_t *WrapMode, const char **Data){
- if(!contents || !Flags || !WrapMode || !Data){ return(0); }
+int U_PMF_TEXTUREBRUSHDATA_get(const char *contents, uint32_t *Flags, int32_t *WrapMode, const char **Data, const char *blimit){
+ if(!contents || !Flags || !WrapMode || !Data || !blimit){ return(0); }
+ /* Important! This only checks the constant part, the caller must check that returned data doesn't exceed blimit */
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_TEXTUREBRUSHDATA), blimit))return(0);
U_PMF_SERIAL_get(&contents, Flags, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, WrapMode, 4, 1, U_LE);
+ if(contents >= blimit)return(0); // returned Data is variable size, this much at least must be true
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
return(1);
}
@@ -6549,16 +6812,25 @@ int U_PMF_TEXTUREBRUSHDATA_get(const char *contents, uint32_t *Flags, int32_t *W
\return 1 on success, 0 on error
\param contents Record from which to extract data
\param HasImage True if this object has an Image
- \param Matrix Transformation matrix, present if Flag BrushDataTransform is set.
+ \param Matrix Transformation matrix, NULL if Flag BrushDataTransform is not set.
\param Image Image that contains the texture.
-
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.46, Microsoft name: EmfPlusTextureBrushOptionalData Object
+
+ Caller must check Image for possible memory access violations.
*/
-int U_PMF_TEXTUREBRUSHOPTIONALDATA_get(const char *contents, int HasImage, U_PMF_TRANSFORMMATRIX *Matrix, const char **Image){
- if(!contents || !Matrix || !Image){ return(0); }
- U_PMF_SERIAL_get(&contents, Matrix, 4, 6, U_LE);
- U_PMF_PTRSAV_COND(Image, contents, HasImage);
+int U_PMF_TEXTUREBRUSHOPTIONALDATA_get(const char *contents, int HasImage, U_PMF_TRANSFORMMATRIX *Matrix,
+ const char **Image, const char *blimit){
+ if(!contents || !Image || !blimit){ return(0); }
+ if(Matrix){
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_TRANSFORMMATRIX), blimit))return(0);
+ U_PMF_SERIAL_get(&contents, Matrix, 4, 6, U_LE);
+ }
+ if(HasImage){
+ if(contents >= blimit)return(0); // returned Data is variable size, this much at least must be true
+ U_PMF_PTRSAV_COND(Image, contents, HasImage);
+ }
return(1);
}
@@ -6567,11 +6839,13 @@ int U_PMF_TEXTUREBRUSHOPTIONALDATA_get(const char *contents, int HasImage, U_PMF
\return 1 on success, 0 on error
\param contents Record from which to extract data
\param Matrix Transformation matrix, present if Flag BrushDataTransform is set.
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.47, Microsoft name: EmfPlusTransformMatrix Object
*/
-int U_PMF_TRANSFORMMATRIX_get(const char *contents, U_PMF_TRANSFORMMATRIX *Matrix){
- if(!contents || !Matrix){ return(0); }
+int U_PMF_TRANSFORMMATRIX_get(const char *contents, U_PMF_TRANSFORMMATRIX *Matrix, const char *blimit){
+ if(!contents || !Matrix || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_TRANSFORMMATRIX), blimit))return(0);
U_PMF_SERIAL_get(&contents, Matrix, 4, 6, U_LE);
return(1);
}
@@ -6582,11 +6856,13 @@ int U_PMF_TRANSFORMMATRIX_get(const char *contents, U_PMF_TRANSFORMMATRIX *Matri
\param contents Record from which to extract data
\param Radius Blur radius in pixels
\param ExpandEdge 1: expand bitmap by Radius; 0: bitmap size unchanged
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.1, Microsoft name: BlurEffect Object
*/
-int U_PMF_IE_BLUR_get(const char *contents, U_FLOAT *Radius, uint32_t *ExpandEdge){
- if(!contents || !Radius || !ExpandEdge){ return(0); }
+int U_PMF_IE_BLUR_get(const char *contents, U_FLOAT *Radius, uint32_t *ExpandEdge, const char *blimit){
+ if(!contents || !Radius || !ExpandEdge || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_IE_BLUR), blimit))return(0);
U_PMF_SERIAL_get(&contents, Radius, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, ExpandEdge, 4, 1, U_LE);
return(1);
@@ -6598,11 +6874,13 @@ int U_PMF_IE_BLUR_get(const char *contents, U_FLOAT *Radius, uint32_t *ExpandEdg
\param contents Record from which to extract data
\param Brightness -255 to 255, 0 is unchanged, positive increases, negative decreases
\param Contrast -100 to 100, 0 is unchanged, positive increases, negative decreases
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.2, Microsoft name: BrightnessContrastEffect Object
*/
-int U_PMF_IE_BRIGHTNESSCONTRAST_get(const char *contents, int32_t *Brightness, int32_t *Contrast){
- if(!contents || !Brightness || !Contrast){ return(0); }
+int U_PMF_IE_BRIGHTNESSCONTRAST_get(const char *contents, int32_t *Brightness, int32_t *Contrast, const char *blimit){
+ if(!contents || !Brightness || !Contrast || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_IE_BRIGHTNESSCONTRAST), blimit))return(0);
U_PMF_SERIAL_get(&contents, Brightness, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Contrast, 4, 1, U_LE);
return(1);
@@ -6615,11 +6893,13 @@ int U_PMF_IE_BRIGHTNESSCONTRAST_get(const char *contents, int32_t *Brightness, i
\param CyanRed -100 to 100, 0 is unchanged, positive increases Red & decreases Cyan, negative is opposite
\param MagentaGreen -100 to 100, 0 is unchanged, positive increases Green & decreases Magenta, negative is opposite
\param YellowBlue -100 to 100, 0 is unchanged, positive increases Blue & decreases Yellow, negative is opposite
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.3, Microsoft name: ColorBalanceEffect Object
*/
-int U_PMF_IE_COLORBALANCE_get(const char *contents, int32_t *CyanRed, int32_t *MagentaGreen, int32_t *YellowBlue){
- if(!contents || !CyanRed || !MagentaGreen || !YellowBlue){ return(0); }
+int U_PMF_IE_COLORBALANCE_get(const char *contents, int32_t *CyanRed, int32_t *MagentaGreen, int32_t *YellowBlue, const char *blimit){
+ if(!contents || !CyanRed || !MagentaGreen || !YellowBlue || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_IE_COLORBALANCE), blimit))return(0);
U_PMF_SERIAL_get(&contents, CyanRed, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, MagentaGreen, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, YellowBlue, 4, 1, U_LE);
@@ -6634,11 +6914,13 @@ int U_PMF_IE_COLORBALANCE_get(const char *contents, int32_t *CyanRed, int32_t *M
\param Adjust CurveAdjustment enumeration
\param Channel CurveChannel enumeration
\param Intensity adjustment to apply. "Adjust" determines what field this is and range values.
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.4, Microsoft name: ColorCurveEffect Object
*/
-int U_PMF_IE_COLORCURVE_get(const char *contents, uint32_t *Adjust, uint32_t *Channel, int32_t *Intensity){
- if(!contents || !Adjust || !Channel || !Intensity){ return(0); }
+int U_PMF_IE_COLORCURVE_get(const char *contents, uint32_t *Adjust, uint32_t *Channel, int32_t *Intensity, const char *blimit){
+ if(!contents || !Adjust || !Channel || !Intensity || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_IE_COLORCURVE), blimit))return(0);
U_PMF_SERIAL_get(&contents, Adjust, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Channel, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Intensity, 4, 1, U_LE);
@@ -6653,12 +6935,14 @@ int U_PMF_IE_COLORCURVE_get(const char *contents, uint32_t *Adjust, uint32_t *Ch
\param GLUT Green color lookup table
\param RLUT Red color lookup table
\param ALUT Alpha color lookup table
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.5, Microsoft name: ColorLookupTableEffect Object
*/
int U_PMF_IE_COLORLOOKUPTABLE_get(const char *contents,
- const uint8_t **BLUT, const uint8_t **GLUT, const uint8_t **RLUT, const uint8_t **ALUT){
- if(!contents || !BLUT || !GLUT || !RLUT || !ALUT){ return(0); }
+ const uint8_t **BLUT, const uint8_t **GLUT, const uint8_t **RLUT, const uint8_t **ALUT, const char *blimit){
+ if(!contents || !BLUT || !GLUT || !RLUT || !ALUT || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_IE_COLORLOOKUPTABLE) + 4 * 256, blimit))return(0);
U_PMF_PTRSAV_SHIFT((const char **)BLUT, &contents, 256);
U_PMF_PTRSAV_SHIFT((const char **)GLUT, &contents, 256);
U_PMF_PTRSAV_SHIFT((const char **)RLUT, &contents, 256);
@@ -6671,11 +6955,14 @@ int U_PMF_IE_COLORLOOKUPTABLE_get(const char *contents,
\return 1 on success, 0 on error
\param contents Record from which to extract data
\param Matrix 5 x 5 color transformation matrix, First 4 rows are [{4 multiplier values},0.0] for R,G,B,A, last Row is [{4 color translation valuess}, 1.0]
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.6, Microsoft name: ColorMatrixEffect Object
*/
-int U_PMF_IE_COLORMATRIX_get(const char *contents, U_PMF_IE_COLORMATRIX *Matrix){
- if(!contents || !Matrix){ return(0); }
+int U_PMF_IE_COLORMATRIX_get(const char *contents, U_PMF_IE_COLORMATRIX *Matrix, const char *blimit){
+ if(!contents || !Matrix || !blimit){ return(0); }
+ /* Important! This only checks the constant part, the caller must check that returned data doesn't exceed blimit */
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_IE_COLORMATRIX), blimit))return(0);
U_PMF_SERIAL_get(&contents, Matrix, 4, 5*5, U_LE);
return(1);
}
@@ -6687,11 +6974,13 @@ int U_PMF_IE_COLORMATRIX_get(const char *contents, U_PMF_IE_COLORMATRIX *Matrix)
\param Hue -180 to 180, 0 is unchanged
\param Saturation -100 to 100, 0 is unchanged
\param Lightness -100 to 100, 0 is unchanged
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.7, Microsoft name: HueSaturationLightnessEffect Object
*/
-int U_PMF_IE_HUESATURATIONLIGHTNESS_get(const char *contents, int32_t *Hue, int32_t *Saturation, int32_t *Lightness){
- if(!contents || !Hue || !Saturation || !Lightness){ return(0); }
+int U_PMF_IE_HUESATURATIONLIGHTNESS_get(const char *contents, int32_t *Hue, int32_t *Saturation, int32_t *Lightness, const char *blimit){
+ if(!contents || !Hue || !Saturation || !Lightness || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_IE_HUESATURATIONLIGHTNESS), blimit))return(0);
U_PMF_SERIAL_get(&contents, Hue, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Saturation, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Lightness, 4, 1, U_LE);
@@ -6705,11 +6994,13 @@ int U_PMF_IE_HUESATURATIONLIGHTNESS_get(const char *contents, int32_t *Hue, int3
\param Highlight 0 to 100, 100 is unchanged
\param Midtone -100 to 100, 0 is unchanged
\param Shadow 0 to 100, 0 is unchanged
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.8, Microsoft name: LevelsEffect Object
*/
-int U_PMF_IE_LEVELS_get(const char *contents, int32_t *Highlight, int32_t *Midtone, int32_t *Shadow){
- if(!contents || !Highlight || !Midtone || !Shadow){ return(0); }
+int U_PMF_IE_LEVELS_get(const char *contents, int32_t *Highlight, int32_t *Midtone, int32_t *Shadow, const char *blimit){
+ if(!contents || !Highlight || !Midtone || !Shadow || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_IE_LEVELS), blimit))return(0);
U_PMF_SERIAL_get(&contents, Highlight, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Midtone, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Shadow, 4, 1, U_LE);
@@ -6722,12 +7013,15 @@ int U_PMF_IE_LEVELS_get(const char *contents, int32_t *Highlight, int32_t *Midto
\param contents Record from which to extract data
\param Elements Number of members in Rects
\param Rects Caller must free. Pointer to memory holding an array of U_RECTL.
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.9, Microsoft name: RedEyeCorrectionEffect Object
*/
-int U_PMF_IE_REDEYECORRECTION_get(const char *contents, int32_t *Elements, U_RECTL **Rects){
- if(!contents || !Elements || !Rects){ return(0); }
+int U_PMF_IE_REDEYECORRECTION_get(const char *contents, int32_t *Elements, U_RECTL **Rects, const char *blimit){
+ if(!contents || !Elements || !Rects || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_IE_REDEYECORRECTION), blimit))return(0);
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
+ if(IS_MEM_UNSAFE(contents, *Elements * 4, blimit))return(0);
*Rects = (U_RECTL *) malloc(*Elements * sizeof(U_RECTL));
if(!*Rects){ return(0); }
U_PMF_SERIAL_get(&contents, *Rects, 4, *Elements * 4, U_LE);
@@ -6740,11 +7034,13 @@ int U_PMF_IE_REDEYECORRECTION_get(const char *contents, int32_t *Elements, U_REC
\param contents Record from which to extract data
\param Radius Sharpening radius in pixels
\param Sharpen 0 to 100, 0 is unchanged
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.10, Microsoft name: SharpenEffect Object
*/
-int U_PMF_IE_SHARPEN_get(const char *contents, U_FLOAT *Radius, int32_t *Sharpen){
- if(!contents || !Radius || !Sharpen){ return(0); }
+int U_PMF_IE_SHARPEN_get(const char *contents, U_FLOAT *Radius, int32_t *Sharpen, const char *blimit){
+ if(!contents || !Radius || !Sharpen || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_IE_SHARPEN), blimit))return(0);
U_PMF_SERIAL_get(&contents, Radius, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Sharpen, 4, 1, U_LE);
return(1);
@@ -6756,16 +7052,51 @@ int U_PMF_IE_SHARPEN_get(const char *contents, U_FLOAT *Radius, int32_t *Sharpen
\param contents Record from which to extract data
\param Hue -180 to 180, [positive==clockwise] rotation in degrees starting from blue
\param Amount -100 [add black] to 100[add white], 0 is unchanged. Change in hue on specified axis
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.11, Microsoft name: TintEffect Object
*/
-int U_PMF_IE_TINT_get(const char *contents, int32_t *Hue, int32_t *Amount){
- if(!contents || !Hue || !Amount){ return(0); }
+int U_PMF_IE_TINT_get(const char *contents, int32_t *Hue, int32_t *Amount, const char *blimit){
+ if(!contents || !Hue || !Amount || !blimit){ return(0); }
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_IE_TINT), blimit))return(0);
U_PMF_SERIAL_get(&contents, Hue, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Amount, 4, 1, U_LE);
return(1);
}
+/*
+
+ end of U_PMF_*_get() functions
+ =====================================================================================
+ start of U_PMR_*_get() functions
+
+ These functions all assume that the size field in the common EMF+ header has already
+ been checked, so that the extent the record claims exists in the data read in for the file.
+ Consequently none of them takes a blimit parameter. They generate a new one from the
+ header size field and contents if needed.
+
+*/
+
+int U_PMR_common_stack_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *StackID){
+ if(!contents || !StackID){ return(0); }
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_RESTORE))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ U_PMF_SERIAL_get(&contents, StackID, 4, 1, U_LE);
+ return(1);
+}
+
+/* for records that have a type but no associated flag bits or data */
+int U_PMR_common_header_get(const char *contents, U_PMF_CMN_HDR *Header){
+ /* memory access safe, only uses the common header */
+ if(!contents){ return(0); }
+ U_PMF_CMN_HDR_get(&contents, Header);
+ return(1);
+}
+
/**
\brief Get data from a U_PMR_OFFSETCLIP record
\return 1 on success, 0 on error
@@ -6779,7 +7110,12 @@ int U_PMF_IE_TINT_get(const char *contents, int32_t *Hue, int32_t *Amount){
int U_PMR_OFFSETCLIP_get(const char *contents, U_PMF_CMN_HDR *Header,
U_FLOAT *dX, U_FLOAT *dY){
if(!contents){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_OFFSETCLIP))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
U_PMF_SERIAL_get(&contents, dX, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, dY, 4, 1, U_LE);
return(1);
@@ -6812,10 +7148,14 @@ int U_PMR_RESETCLIP_get(const char *contents, U_PMF_CMN_HDR *Header){
int U_PMR_SETCLIPPATH_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *PathID, int *CMenum){
if(!contents || !PathID || !CMenum){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *CMenum = (Flags >> U_FF_SHFT_CM4) & U_FF_MASK_CM4;
- *PathID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_SETCLIPPATH))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *CMenum = (lclHeader.Flags >> U_FF_SHFT_CM4) & U_FF_MASK_CM4;
+ *PathID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
return(1);
}
@@ -6833,9 +7173,13 @@ int U_PMR_SETCLIPRECT_get(const char *contents, U_PMF_CMN_HDR *Header,
int *CMenum,
U_PMF_RECTF *Rect){
if(!contents || !CMenum || !Rect ){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *CMenum = (Flags >> U_FF_SHFT_CM4) & U_FF_MASK_CM4;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_SETCLIPRECT))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *CMenum = (lclHeader.Flags >> U_FF_SHFT_CM4) & U_FF_MASK_CM4;
U_PMF_SERIAL_get(&contents, Rect, 4, 4, U_LE);
return(1);
}
@@ -6853,10 +7197,14 @@ int U_PMR_SETCLIPRECT_get(const char *contents, U_PMF_CMN_HDR *Header,
int U_PMR_SETCLIPREGION_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *PathID, int *CMenum){
if(!contents || !PathID || !CMenum){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *CMenum = (Flags >> U_FF_SHFT_CM4) & U_FF_MASK_CM4;
- *PathID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_SETCLIPREGION))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *CMenum = (lclHeader.Flags >> U_FF_SHFT_CM4) & U_FF_MASK_CM4;
+ *PathID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
return(1);
}
@@ -6868,11 +7216,18 @@ int U_PMR_SETCLIPREGION_get(const char *contents, U_PMF_CMN_HDR *Header,
\param Data Private data, may be anything
EMF+ manual 2.3.2.1, Microsoft name: EmfPlusComment Record, Index 0x03
+
+ Caller must check Data for possible memory access violations.
*/
int U_PMR_COMMENT_get(const char *contents, U_PMF_CMN_HDR *Header,
const char **Data){
if(!contents || !Data){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_COMMENT))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
return(1);
}
@@ -6922,9 +7277,13 @@ int U_PMR_HEADER_get(const char *contents, U_PMF_CMN_HDR *Header,
U_PMF_GRAPHICSVERSION *Version, int *IsDual, int *IsVideo, uint32_t *LogicalDpiX, uint32_t *LogicalDpiY){
if(!contents || !Version || !IsDual || !IsVideo || !LogicalDpiX || !LogicalDpiY){ return(0); }
uint32_t tmp;
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *IsDual = (Flags & U_PPF_DM ? 1 : 0 );
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_HEADER))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *IsDual = (lclHeader.Flags & U_PPF_DM ? 1 : 0 );
U_PMF_SERIAL_get(&contents, Version, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, &tmp, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, LogicalDpiX, 4, 1, U_LE);
@@ -6945,7 +7304,12 @@ int U_PMR_HEADER_get(const char *contents, U_PMF_CMN_HDR *Header,
int U_PMR_CLEAR_get(const char *contents, U_PMF_CMN_HDR *Header,
U_PMF_ARGB *Color){
if(!contents || !Color){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_CLEAR))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
U_PMF_SERIAL_get(&contents, Color, 4, 1, U_LE);
return(1);
}
@@ -6968,16 +7332,26 @@ int U_PMR_DRAWARC_get(const char *contents, U_PMF_CMN_HDR *Header,
U_FLOAT *Start, U_FLOAT *Sweep,
U_PMF_RECTF *Rect){
if(!contents || !PenID || !ctype || !Start || !Sweep || !Rect){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- *PenID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWARC))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
+ *PenID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, Start, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Sweep, 4, 1, U_LE);
- U_PMF_SERIAL_get(&contents, Rect, 4, 4, U_LE);
+ U_PMF_RECTF *Rects = NULL;
+ if(!U_PMF_VARRECTS_get(&contents, lclHeader.Flags, 1, &Rects, blimit))return(0);
+ memcpy(Rect,Rects,sizeof(U_PMF_RECTF));
+ free(Rects);
return(1);
}
+
/**
\brief Get data from a U_PMR_DRAWBEZIERS record
\return 1 on success, 0 on error
@@ -6996,14 +7370,20 @@ int U_PMR_DRAWBEZIERS_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *Elements,
U_PMF_POINTF **Points){
if(!contents || !PenID || !ctype || !RelAbs || !Elements || !Points){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- *RelAbs = (Flags & U_PPF_P ? 1 : 0 );
- *PenID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWBEZIERS))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
+ *RelAbs = (lclHeader.Flags & U_PPF_P ? 1 : 0 );
+ *PenID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
- U_PMF_VARPOINTS_get(&contents, Flags, *Elements, Points);
- return(1);
+ int status = U_PMF_VARPOINTS_get(contents, lclHeader.Flags, *Elements, Points, blimit );
+ return(status);
}
/**
@@ -7025,14 +7405,20 @@ int U_PMR_DRAWCLOSEDCURVE_get(const char *contents, U_PMF_CMN_HDR *Header,
U_FLOAT *Tension, uint32_t *Elements,
U_PMF_POINTF **Points){
if(!contents || !PenID || !ctype || !RelAbs || !Tension || !Elements || !Points){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- *RelAbs = (Flags & U_PPF_P ? 1 : 0 );
- *PenID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWCLOSEDCURVE))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
+ *RelAbs = (lclHeader.Flags & U_PPF_P ? 1 : 0 );
+ *PenID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, Tension, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
- U_PMF_VARPOINTS_get(&contents, Flags, *Elements, Points);
+ U_PMF_VARPOINTS_get(contents, lclHeader.Flags, *Elements, Points, blimit);
return(1);
}
@@ -7056,15 +7442,21 @@ int U_PMR_DRAWCURVE_get(const char *contents, U_PMF_CMN_HDR *Header,
U_FLOAT *Tension, uint32_t *Offset, uint32_t *NSegs, uint32_t *Elements,
U_PMF_POINTF **Points){
if(!contents || !PenID || !ctype || !Tension || !Offset || !NSegs || !Elements || !Points){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- *PenID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWCURVE))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
+ *PenID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, Tension, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Offset, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, NSegs, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
- U_PMF_VARPOINTS_get(&contents, Flags, *Elements, Points);
+ U_PMF_VARPOINTS_get(contents, lclHeader.Flags, *Elements, Points, blimit);
return(1);
}
@@ -7092,15 +7484,22 @@ int U_PMR_DRAWDRIVERSTRING_get(const char *contents, U_PMF_CMN_HDR *Header,
uint16_t **Glyphs, U_PMF_POINTF **Points, U_PMF_TRANSFORMMATRIX **Matrix){
if(!contents || !FontID || !btype || !Tension || !BrushID ||
!DSOFlags || !HasMatrix || !Elements || !Glyphs || !Points || !Matrix){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *btype = (Flags & U_PPF_B ? 1 : 0 );
- *FontID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWDRIVERSTRING))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *btype = (lclHeader.Flags & U_PPF_B ? 1 : 0 );
+ *FontID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, Tension, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, BrushID, 4, 1, (*btype ? U_XE : U_LE)); /* color is not byte swapped, ID integer is */
U_PMF_SERIAL_get(&contents, DSOFlags, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, HasMatrix, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
+ if(IS_MEM_UNSAFE(contents, *Elements*2 + *Elements*2*4 + 24, blimit))return(0);
if(!U_PMF_SERIAL_array_copy_get(&contents, (void **)Glyphs, 2, *Elements, U_LE, (*DSOFlags & U_DSO_CmapLookup))){ return(0); }
if(!U_PMF_SERIAL_array_copy_get(&contents, (void **)Points, 4, *Elements *2, U_LE, (*DSOFlags & U_DSO_RealizedAdvance))){ return(0); }
if(!U_PMF_SERIAL_array_copy_get(&contents, (void **)Matrix, 4, 6, U_LE, (*HasMatrix))){ return(0); }
@@ -7122,10 +7521,14 @@ int U_PMR_DRAWELLIPSE_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *PenID, int *ctype,
U_PMF_RECTF *Rect){
if(!contents || !PenID || !ctype || !Rect){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- *PenID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWELLIPSE))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
+ *PenID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, Rect, 4, 4, U_LE);
return(1);
}
@@ -7149,10 +7552,14 @@ int U_PMR_DRAWIMAGE_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *ImgAttrID, int32_t *SrcUnit, U_PMF_RECTF *SrcRect,
U_PMF_RECTF *DstRect){
if(!contents || !ImgID || !ctype || !ImgAttrID || !SrcUnit || !SrcRect || !DstRect){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- *ImgID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWIMAGE))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
+ *ImgID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, ImgAttrID, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, SrcUnit, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, SrcRect, 4, 4, U_LE);
@@ -7182,17 +7589,23 @@ int U_PMR_DRAWIMAGEPOINTS_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *ImgAttrID, int32_t *SrcUnit, U_PMF_RECTF *SrcRect, uint32_t *Elements,
U_PMF_POINTF **Points){
if(!contents || !ImgID || !ctype || !etype || !RelAbs || !ImgAttrID || !SrcUnit || !Elements || !Points){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- *etype = (Flags & U_PPF_E ? 1 : 0 );
- *RelAbs = (Flags & U_PPF_P ? 1 : 0 );
- *ImgID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWIMAGEPOINTS))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
+ *etype = (lclHeader.Flags & U_PPF_E ? 1 : 0 );
+ *RelAbs = (lclHeader.Flags & U_PPF_P ? 1 : 0 );
+ *ImgID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, ImgAttrID, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, SrcUnit, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, SrcRect, 4, 4, U_LE);
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
- U_PMF_VARPOINTS_get(&contents, Flags, *Elements, Points);
+ U_PMF_VARPOINTS_get(contents, lclHeader.Flags, *Elements, Points, blimit);
return(1);
}
@@ -7215,14 +7628,20 @@ int U_PMR_DRAWLINES_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *Elements,
U_PMF_POINTF **Points){
if(!contents || !PenID || !ctype || !dtype || !RelAbs || !Elements || !Points){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- *dtype = (Flags & U_PPF_D ? 1 : 0 );
- *RelAbs = (Flags & U_PPF_P ? 1 : 0 );
- *PenID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWLINES))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
+ *dtype = (lclHeader.Flags & U_PPF_D ? 1 : 0 );
+ *RelAbs = (lclHeader.Flags & U_PPF_P ? 1 : 0 );
+ *PenID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
- U_PMF_VARPOINTS_get(&contents, Flags, *Elements, Points);
+ U_PMF_VARPOINTS_get(contents, lclHeader.Flags, *Elements, Points, blimit);
return(1);
}
@@ -7239,9 +7658,13 @@ int U_PMR_DRAWLINES_get(const char *contents, U_PMF_CMN_HDR *Header,
int U_PMR_DRAWPATH_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *PathID, uint32_t *PenID){
if(!contents || !PathID || !PenID){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *PathID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWPATH))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *PathID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, PenID, 4, 1, U_LE);
return(1);
}
@@ -7264,13 +7687,22 @@ int U_PMR_DRAWPIE_get(const char *contents, U_PMF_CMN_HDR *Header,
U_FLOAT *Start, U_FLOAT *Sweep,
U_PMF_RECTF *Rect){
if(!contents || !PenID || !ctype || !Start || !Sweep || !Rect){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- *PenID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWPIE))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
+ *PenID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, Start, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Sweep, 4, 1, U_LE);
- U_PMF_SERIAL_get(&contents, Rect, 4, 4, U_LE);
+ U_PMF_RECTF *Rects = NULL;
+ if(!U_PMF_VARRECTS_get(&contents, lclHeader.Flags, 1, &Rects, blimit))return(0);
+ memcpy(Rect,Rects,sizeof(U_PMF_RECTF));
+ free(Rects);
return(1);
}
@@ -7294,12 +7726,18 @@ int U_PMR_DRAWRECTS_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *Elements,
U_PMF_RECTF **Rects){
if(!contents || !PenID || !Elements || !Rects){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *PenID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWPIE))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *PenID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
- U_PMF_VARRECTS_get(&contents, Flags, *Elements, Rects);
+ U_PMF_VARRECTS_get(&contents, lclHeader.Flags, *Elements, Rects, blimit);
return(1);
}
@@ -7323,14 +7761,21 @@ int U_PMR_DRAWSTRING_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *BrushID, uint32_t *FormatID, uint32_t *Elements, U_PMF_RECTF *Rect,
uint16_t **String){
if(!contents || !FontID || !btype || !BrushID || !FormatID || !Elements || !String){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *btype = (Flags & U_PPF_B ? 1 : 0 );
- *FontID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWPIE))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *btype = (lclHeader.Flags & U_PPF_B ? 1 : 0 );
+ *FontID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, BrushID, 4, 1, (*btype ? U_XE : U_LE)); /* color is not byte swapped, ID integer is */
U_PMF_SERIAL_get(&contents, FormatID, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Rect, 4, 4, U_LE);
+ if(IS_MEM_UNSAFE(contents, *Elements * 2, blimit))return(0);
if(!U_PMF_SERIAL_array_copy_get(&contents, (void **)String, 2, *Elements, U_XE, 1)){ return(0); }
return(1);
}
@@ -7356,16 +7801,22 @@ int U_PMR_FILLCLOSEDCURVE_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *BrushID, U_FLOAT *Tension, uint32_t *Elements,
U_PMF_POINTF **Points){
if(!contents || !btype || !ctype || !ftype || !RelAbs || !BrushID || !Tension || !Elements || !Points){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *btype = (Flags & U_PPF_B ? 1 : 0 );
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- *ftype = (Flags & U_PPF_F ? 1 : 0 );
- *RelAbs = (Flags & U_PPF_P ? 1 : 0 );
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWLINES))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *btype = (lclHeader.Flags & U_PPF_B ? 1 : 0 );
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
+ *ftype = (lclHeader.Flags & U_PPF_F ? 1 : 0 );
+ *RelAbs = (lclHeader.Flags & U_PPF_P ? 1 : 0 );
U_PMF_SERIAL_get(&contents, BrushID, 4, 1, (*btype ? U_XE : U_LE)); /* color is not byte swapped, ID integer is */
U_PMF_SERIAL_get(&contents, Tension, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
- U_PMF_VARPOINTS_get(&contents, Flags, *Elements, Points);
+ U_PMF_VARPOINTS_get(contents, lclHeader.Flags, *Elements, Points, blimit);
return(1);
}
@@ -7386,10 +7837,14 @@ int U_PMR_FILLELLIPSE_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *BrushID,
U_PMF_RECTF *Rect){
if(!contents || !btype || !ctype || !BrushID || !Rect){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *btype = (Flags & U_PPF_B ? 1 : 0 );
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_FILLELLIPSE))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *btype = (lclHeader.Flags & U_PPF_B ? 1 : 0 );
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
U_PMF_SERIAL_get(&contents, BrushID, 4, 1, (*btype ? U_XE : U_LE)); /* color is not byte swapped, ID integer is */
U_PMF_SERIAL_get(&contents, Rect, 4, 4, U_LE);
return(1);
@@ -7412,10 +7867,14 @@ int U_PMR_FILLPATH_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *PathID, int *btype,
uint32_t *BrushID){
if(!contents || !PathID || !btype || !BrushID){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *btype = (Flags & U_PPF_B ? 1 : 0 );
- *PathID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_FILLPATH))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *btype = (lclHeader.Flags & U_PPF_B ? 1 : 0 );
+ *PathID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, BrushID, 4, 1, (*btype ? U_XE : U_LE)); /* color is not byte swapped, ID integer is */
return(1);
}
@@ -7439,14 +7898,23 @@ int U_PMR_FILLPIE_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *BrushID, U_FLOAT *Start, U_FLOAT *Sweep,
U_PMF_RECTF *Rect){
if(!contents || !btype || !ctype || !BrushID || !Start || !Sweep || !Rect){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *btype = (Flags & U_PPF_B ? 1 : 0 );
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_FILLPIE))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *btype = (lclHeader.Flags & U_PPF_B ? 1 : 0 );
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
U_PMF_SERIAL_get(&contents, BrushID, 4, 1, (*btype ? U_XE : U_LE)); /* color is not byte swapped, ID integer is */
U_PMF_SERIAL_get(&contents, Start, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Sweep, 4, 1, U_LE);
- U_PMF_SERIAL_get(&contents, Rect, 4, 4, U_LE);
+ U_PMF_RECTF *Rects = NULL;
+ if(!U_PMF_VARRECTS_get(&contents, lclHeader.Flags, 1, &Rects, blimit))return(0);
+ memcpy(Rect,Rects,sizeof(U_PMF_RECTF));
+ free(Rects);
return(1);
}
@@ -7469,14 +7937,20 @@ int U_PMR_FILLPOLYGON_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *BrushID, uint32_t *Elements,
U_PMF_POINTF **Points){
if(!contents || !btype || !ctype || !RelAbs || !BrushID || !Elements || !Points){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *btype = (Flags & U_PPF_B ? 1 : 0 );
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- *RelAbs = (Flags & U_PPF_R ? 1 : 0 );
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_DRAWLINES))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *btype = (lclHeader.Flags & U_PPF_B ? 1 : 0 );
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
+ *RelAbs = (lclHeader.Flags & U_PPF_R ? 1 : 0 );
U_PMF_SERIAL_get(&contents, BrushID, 4, 1, (*btype ? U_XE : U_LE)); /* color is not byte swapped, ID integer is */
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
- U_PMF_VARPOINTS_get(&contents, Flags, *Elements, Points);
+ U_PMF_VARPOINTS_get(contents, lclHeader.Flags, *Elements, Points, blimit);
return(1);
}
@@ -7505,13 +7979,19 @@ int U_PMR_FILLRECTS_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *BrushID, uint32_t *Elements,
U_PMF_RECTF **Rects){
if(!contents || !btype || !ctype || !BrushID || !Elements || !Rects){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *btype = (Flags & U_PPF_B ? 1 : 0 );
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_FILLRECTS))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *btype = (lclHeader.Flags & U_PPF_B ? 1 : 0 );
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
U_PMF_SERIAL_get(&contents, BrushID, 4, 1, (*btype ? U_XE : U_LE)); /* color is not byte swapped, ID integer is */
U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE);
- U_PMF_VARRECTS_get(&contents, Flags, *Elements, Rects);
+ U_PMF_VARRECTS_get(&contents, lclHeader.Flags, *Elements, Rects, blimit);
/* correct btype, if necessary, for invalid EMF+ input */
if((*BrushID > 63) & !*btype)*btype=1;
return(1);
@@ -7534,11 +8014,15 @@ int U_PMR_FILLREGION_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *RgnID, int *btype, int *ctype,
uint32_t *BrushID){
if(!contents || !RgnID || !btype || !ctype || !BrushID){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *btype = (Flags & U_PPF_B ? 1 : 0 );
- *ctype = (Flags & U_PPF_C ? 1 : 0 );
- *RgnID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_FILLREGION))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *btype = (lclHeader.Flags & U_PPF_B ? 1 : 0 );
+ *ctype = (lclHeader.Flags & U_PPF_C ? 1 : 0 );
+ *RgnID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
U_PMF_SERIAL_get(&contents, BrushID, 4, 1, (*btype ? U_XE : U_LE)); /* color is not byte swapped, ID integer is */
return(1);
}
@@ -7556,6 +8040,8 @@ int U_PMR_FILLREGION_get(const char *contents, U_PMF_CMN_HDR *Header,
EMF+ manual 2.3.5.1, Microsoft name: EmfPlusObject Record, Index 0x13
+ Caller must check Data for possible memory access violations.
+
OTHER NOTES:
All objects are to be stored in the same table and retrieved by index.
Documentation indicates that this table contains only 64 slots, although the index
@@ -7585,11 +8071,15 @@ int U_PMR_OBJECT_get(const char *contents, U_PMF_CMN_HDR *Header,
uint32_t *ObjID, int *otype, int *ntype, uint32_t *TSize,
const char **Data){
if(!contents || !ObjID || !otype || !ntype || !Data){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *ntype = (Flags & U_PPF_N ? 1 : 0 );
- *ObjID = (Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
- *otype = (Flags >> U_FF_SHFT_OT) & U_FF_MASK_OT;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_OBJECT))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *ntype = (lclHeader.Flags & U_PPF_N ? 1 : 0 );
+ *ObjID = (lclHeader.Flags >> U_FF_SHFT_OID8) & U_FF_MASK_OID8;
+ *otype = (lclHeader.Flags >> U_FF_SHFT_OT) & U_FF_MASK_OT;
if(*ntype){ U_PMF_SERIAL_get(&contents, TSize, 4, 1, U_LE); }
else { *TSize = 0; }
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
@@ -7606,12 +8096,19 @@ int U_PMR_OBJECT_get(const char *contents, U_PMF_CMN_HDR *Header,
\param Data "Serialized image effects parameter block". One of the ImageEffects objects.
EMF+ manual 2.3.5.2, Microsoft name: EmfPlusSerializableObject Record, Index 0x38
+
+ Caller must check Data for possible memory access violations.
*/
int U_PMR_SERIALIZABLEOBJECT_get(const char *contents, U_PMF_CMN_HDR *Header,
uint8_t *GUID, uint32_t *Size,
const char **Data){
if(!contents || !GUID || !Size || !Data){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_SERIALIZABLEOBJECT))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
U_PMF_SERIAL_get(&contents, GUID, 1, 16, U_XE);
U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE);
U_PMF_PTRSAV_SHIFT(Data, &contents, 0);
@@ -7631,10 +8128,14 @@ int U_PMR_SERIALIZABLEOBJECT_get(const char *contents, U_PMF_CMN_HDR *Header,
int U_PMR_SETANTIALIASMODE_get(const char *contents, U_PMF_CMN_HDR *Header,
int *SMenum, int *aatype){
if(!contents || !SMenum || !aatype){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *aatype = (Flags & U_PPF_AA ? 1 : 0 );
- *SMenum = (Flags >> U_FF_SHFT_AA) & U_FF_MASK_AA;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_SETANTIALIASMODE))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *aatype = (lclHeader.Flags & U_PPF_AA ? 1 : 0 );
+ *SMenum = (lclHeader.Flags >> U_FF_SHFT_AA) & U_FF_MASK_AA;
return(1);
}
@@ -7649,6 +8150,7 @@ int U_PMR_SETANTIALIASMODE_get(const char *contents, U_PMF_CMN_HDR *Header,
*/
int U_PMR_SETCOMPOSITINGMODE_get(const char *contents, U_PMF_CMN_HDR *Header,
int *CMenum){
+ /* memory access safe, only uses the common header */
if(!contents || !CMenum){ return(0); }
uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
*CMenum = (Flags >> U_FF_SHFT_CM) & U_FF_MASK_CM;
@@ -7667,6 +8169,7 @@ int U_PMR_SETCOMPOSITINGMODE_get(const char *contents, U_PMF_CMN_HDR *Header,
*/
int U_PMR_SETCOMPOSITINGQUALITY_get(const char *contents, U_PMF_CMN_HDR *Header,
int *CQenum){
+ /* memory access safe, only uses the common header */
if(!contents || !CQenum){ return(0); }
uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
*CQenum = (Flags >> U_FF_SHFT_CQ) & U_FF_MASK_CQ;
@@ -7685,6 +8188,7 @@ int U_PMR_SETCOMPOSITINGQUALITY_get(const char *contents, U_PMF_CMN_HDR *Header,
*/
int U_PMR_SETINTERPOLATIONMODE_get(const char *contents, U_PMF_CMN_HDR *Header,
int *IMenum){
+ /* memory access safe, only uses the common header */
if(!contents || !IMenum){ return(0); }
uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
*IMenum = (Flags >> U_FF_SHFT_IM) & U_FF_MASK_IM;
@@ -7703,6 +8207,7 @@ int U_PMR_SETINTERPOLATIONMODE_get(const char *contents, U_PMF_CMN_HDR *Header,
*/
int U_PMR_SETPIXELOFFSETMODE_get(const char *contents, U_PMF_CMN_HDR *Header,
int *POMenum){
+ /* memory access safe, only uses the common header */
if(!contents || !POMenum){ return(0); }
uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
*POMenum = (Flags >> U_FF_SHFT_PxOffM) & U_FF_MASK_PxOffM;
@@ -7723,7 +8228,12 @@ int U_PMR_SETPIXELOFFSETMODE_get(const char *contents, U_PMF_CMN_HDR *Header,
int U_PMR_SETRENDERINGORIGIN_get(const char *contents, U_PMF_CMN_HDR *Header,
int32_t *X, int32_t *Y){
if(!contents || !X || !Y){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ if(!U_PMF_CMN_HDR_get(&contents, &lclHeader))return(0);
+ if(lclHeader.Size < sizeof(U_PMF_SETRENDERINGORIGIN))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
U_PMF_SERIAL_get(&contents, X, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Y, 4, 1, U_LE);
return(1);
@@ -7740,6 +8250,7 @@ int U_PMR_SETRENDERINGORIGIN_get(const char *contents, U_PMF_CMN_HDR *Header,
*/
int U_PMR_SETTEXTCONTRAST_get(const char *contents, U_PMF_CMN_HDR *Header,
int *TGC){
+ /* memory access safe, only uses the common header */
if(!contents || !TGC){ return(0); }
uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
*TGC = (Flags >> U_FF_SHFT_TGC) & U_FF_MASK_TGC;
@@ -7758,6 +8269,7 @@ int U_PMR_SETTEXTCONTRAST_get(const char *contents, U_PMF_CMN_HDR *Header,
*/
int U_PMR_SETTEXTRENDERINGHINT_get(const char *contents, U_PMF_CMN_HDR *Header,
int *TRHenum){
+ /* memory access safe, only uses the common header */
if(!contents || !TRHenum){ return(0); }
uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
*TRHenum = (Flags >> U_FF_SHFT_TRH) & U_FF_MASK_TRH;
@@ -7781,9 +8293,13 @@ int U_PMR_BEGINCONTAINER_get(const char *contents, U_PMF_CMN_HDR *Header,
int *UTenum,
U_PMF_RECTF *DstRect, U_PMF_RECTF *SrcRect, uint32_t *StackID){
if(!contents || !UTenum || !DstRect || !SrcRect || !StackID){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *UTenum = (Flags >> U_FF_SHFT_UT) & U_FF_MASK_UT;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_SETCLIPREGION))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *UTenum = (lclHeader.Flags >> U_FF_SHFT_UT) & U_FF_MASK_UT;
U_PMF_SERIAL_get(&contents, DstRect, 4, 4, U_LE);
U_PMF_SERIAL_get(&contents, SrcRect, 4, 4, U_LE);
U_PMF_SERIAL_get(&contents, StackID, 4, 1, U_LE);
@@ -7800,10 +8316,7 @@ int U_PMR_BEGINCONTAINER_get(const char *contents, U_PMF_CMN_HDR *Header,
EMF+ manual 2.3.7.2, Microsoft name: EmfPlusBeginContainerNoParams Record, Index 0x28
*/
int U_PMR_BEGINCONTAINERNOPARAMS_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *StackID){
- if(!contents || !StackID){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
- U_PMF_SERIAL_get(&contents, StackID, 4, 1, U_LE);
- return(1);
+ return(U_PMR_common_stack_get(contents, Header, StackID));
}
/**
@@ -7815,12 +8328,8 @@ int U_PMR_BEGINCONTAINERNOPARAMS_get(const char *contents, U_PMF_CMN_HDR *Header
EMF+ manual 2.3.7.3, Microsoft name: EmfPlusEndContainer Record, Index 0x29
*/
-int U_PMR_ENDCONTAINER_get(const char *contents, U_PMF_CMN_HDR *Header,
- uint32_t *StackID){
- if(!contents || !StackID){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
- U_PMF_SERIAL_get(&contents, StackID, 4, 1, U_LE);
- return(1);
+int U_PMR_ENDCONTAINER_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *StackID){
+ return(U_PMR_common_stack_get(contents, Header, StackID));
}
/**
@@ -7833,10 +8342,7 @@ int U_PMR_ENDCONTAINER_get(const char *contents, U_PMF_CMN_HDR *Header,
EMF+ manual 2.3.7.4, Microsoft name: EmfPlusRestore Record, Index 0x26
*/
int U_PMR_RESTORE_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *StackID){
- if(!contents || !StackID){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
- U_PMF_SERIAL_get(&contents, StackID, 4, 1, U_LE);
- return(1);
+ return(U_PMR_common_stack_get(contents, Header, StackID));
}
/**
@@ -7849,10 +8355,7 @@ int U_PMR_RESTORE_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *Sta
EMF+ manual 2.3.7.5, Microsoft name: EmfPlusSave Record, Index 0x25
*/
int U_PMR_SAVE_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *StackID){
- if(!contents || !StackID){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
- U_PMF_SERIAL_get(&contents, StackID, 4, 1, U_LE);
- return(1);
+ return(U_PMR_common_stack_get(contents, Header, StackID));
}
/**
@@ -7870,11 +8373,17 @@ int U_PMR_SETTSCLIP_get(const char *contents, U_PMF_CMN_HDR *Header,
int *ctype, uint32_t *Elements,
U_PMF_RECTF **Rects){
if(!contents || !ctype || !Elements || !Rects){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *ctype = (Flags & U_PPF_K ? 1 : 0 );
- *Elements = (Flags >> U_FF_SHFT_TSC) & U_FF_MASK_TSC;
- U_PMF_CMN_HDR_get(&contents, Header);
- U_PMF_VARRECTS_get(&contents, Flags, *Elements, Rects);
+
+ const char *blimit = contents;
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_SETTSCLIP))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+ blimit += lclHeader.Size;
+
+ *ctype = (lclHeader.Flags & U_PPF_K ? 1 : 0 );
+ *Elements = (lclHeader.Flags >> U_FF_SHFT_TSC) & U_FF_MASK_TSC;
+ U_PMF_VARRECTS_get(&contents, lclHeader.Flags, *Elements, Rects, blimit);
return(1);
}
@@ -7898,6 +8407,8 @@ int U_PMR_SETTSCLIP_get(const char *contents, U_PMF_CMN_HDR *Header,
\param Data Palette (optional)
EMF+ manual 2.3.8.2, Microsoft name: EmfPlusSetTSGraphics Record, Index 0x39
+
+ Caller must check Data for possible memory access violations.
*/
int U_PMR_SETTSGRAPHICS_get(const char *contents, U_PMF_CMN_HDR *Header,
int *vgatype, int *pptype,
@@ -7909,10 +8420,14 @@ int U_PMR_SETTSGRAPHICS_get(const char *contents, U_PMF_CMN_HDR *Header,
!AntiAliasMode || !TextRenderHint || !CompositingMode || !CompositingQuality ||
!RenderOriginX || !RenderOriginY || !TextContrast || !FilterType ||
!PixelOffset || !WorldToDevice || !Data){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *vgatype = (Flags & U_PPF_VGA ? 1 : 0 );
- *pptype = (Flags & U_PPF_PP ? 1 : 0 );
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_SETTSGRAPHICS))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *vgatype = (lclHeader.Flags & U_PPF_VGA ? 1 : 0 );
+ *pptype = (lclHeader.Flags & U_PPF_PP ? 1 : 0 );
U_PMF_SERIAL_get(&contents, AntiAliasMode, 1, 1, U_XE);
U_PMF_SERIAL_get(&contents, TextRenderHint, 1, 1, U_XE);
U_PMF_SERIAL_get(&contents, CompositingMode, 1, 1, U_XE);
@@ -7940,9 +8455,13 @@ int U_PMR_MULTIPLYWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header
int *xmtype,
U_PMF_TRANSFORMMATRIX *Matrix){
if(!contents || !xmtype || !Matrix){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *xmtype = (Flags & U_PPF_XM ? 1 : 0 );
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_MULTIPLYWORLDTRANSFORM))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *xmtype = (lclHeader.Flags & U_PPF_XM ? 1 : 0 );
U_PMF_SERIAL_get(&contents, Matrix, 4, 6, U_LE);
return(1);
}
@@ -7956,9 +8475,7 @@ int U_PMR_MULTIPLYWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header
EMF+ manual 2.3.9.2, Microsoft name: EmfPlusResetWorldTransform Record, Index 0x2B
*/
int U_PMR_RESETWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header){
- if(!contents){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
- return(1);
+ return( U_PMR_common_header_get(contents,Header));
}
/**
@@ -7975,9 +8492,13 @@ int U_PMR_ROTATEWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header,
int *xmtype,
U_FLOAT *Angle){
if(!contents || !xmtype || !Angle){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *xmtype = (Flags & U_PPF_XM ? 1 : 0 );
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_ROTATEWORLDTRANSFORM))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *xmtype = (lclHeader.Flags & U_PPF_XM ? 1 : 0 );
U_PMF_SERIAL_get(&contents, Angle, 4, 1, U_LE);
return(1);
}
@@ -7997,9 +8518,13 @@ int U_PMR_SCALEWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header,
int *xmtype,
U_FLOAT *Sx, U_FLOAT *Sy){
if(!contents || !xmtype || !Sx || !Sy){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *xmtype = (Flags & U_PPF_XM ? 1 : 0 );
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_SCALEWORLDTRANSFORM))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *xmtype = (lclHeader.Flags & U_PPF_XM ? 1 : 0 );
U_PMF_SERIAL_get(&contents, Sx, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Sy, 4, 1, U_LE);
return(1);
@@ -8019,9 +8544,13 @@ int U_PMR_SETPAGETRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header,
int *PUenum,
U_FLOAT *Scale){
if(!contents || !PUenum || !Scale){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *PUenum = (Flags >> U_FF_SHFT_PU) & U_FF_MASK_PU;
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_SETPAGETRANSFORM))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *PUenum = (lclHeader.Flags >> U_FF_SHFT_PU) & U_FF_MASK_PU;
U_PMF_SERIAL_get(&contents, Scale, 4, 1, U_LE);
return(1);
}
@@ -8038,7 +8567,12 @@ int U_PMR_SETPAGETRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header,
int U_PMR_SETWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header,
U_PMF_TRANSFORMMATRIX *Matrix){
if(!contents || !Matrix){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_SETWORLDTRANSFORM))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
U_PMF_SERIAL_get(&contents, Matrix, 4, 6, U_LE);
return(1);
}
@@ -8058,9 +8592,13 @@ int U_PMR_TRANSLATEWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Heade
int *xmtype,
U_FLOAT *Dx, U_FLOAT *Dy){
if(!contents || !xmtype || !Dx || !Dy){ return(0); }
- uint16_t Flags = U_PMF_HEADERFLAGS_get(contents);
- *xmtype = (Flags & U_PPF_XM ? 1 : 0 );
- U_PMF_CMN_HDR_get(&contents, Header);
+
+ U_PMF_CMN_HDR lclHeader;
+ U_PMF_CMN_HDR_get(&contents, &lclHeader);
+ if(lclHeader.Size < sizeof(U_PMF_TRANSLATEWORLDTRANSFORM))return(0);
+ if(Header){ memcpy(Header,&lclHeader,sizeof(U_PMF_CMN_HDR)); }
+
+ *xmtype = (lclHeader.Flags & U_PPF_XM ? 1 : 0 );
U_PMF_SERIAL_get(&contents, Dx, 4, 1, U_LE);
U_PMF_SERIAL_get(&contents, Dy, 4, 1, U_LE);
return(1);
@@ -8079,9 +8617,7 @@ int U_PMR_TRANSLATEWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Heade
the path by using the current pen, and fills its interior by using the current brush."
*/
int U_PMR_STROKEFILLPATH_get(const char *contents, U_PMF_CMN_HDR *Header){
- if(!contents){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
- return(1);
+ return( U_PMR_common_header_get(contents,Header));
}
/**
@@ -8093,9 +8629,7 @@ int U_PMR_STROKEFILLPATH_get(const char *contents, U_PMF_CMN_HDR *Header){
EMF+ manual mentioned in 2.1.1.1, reserved, not otherwise documented, Microsoft name: EmfPlusMultiFormatStart Record, Index 0x05
*/
int U_PMR_MULTIFORMATSTART_get(const char *contents, U_PMF_CMN_HDR *Header){
- if(!contents){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
- return(1);
+ return( U_PMR_common_header_get(contents,Header));
}
/**
@@ -8107,9 +8641,7 @@ int U_PMR_MULTIFORMATSTART_get(const char *contents, U_PMF_CMN_HDR *Header){
EMF+ manual mentioned in 2.1.1.1, reserved, not otherwise documented, Microsoft name: EmfPlusMultiFormatSection Record, Index 0x06
*/
int U_PMR_MULTIFORMATSECTION_get(const char *contents, U_PMF_CMN_HDR *Header){
- if(!contents){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
- return(1);
+ return( U_PMR_common_header_get(contents,Header));
}
/**
@@ -8121,9 +8653,7 @@ int U_PMR_MULTIFORMATSECTION_get(const char *contents, U_PMF_CMN_HDR *Header){
EMF+ manual mentioned in 2.1.1.1, reserved, not otherwise documented, Microsoft name: EmfPlusMultiFormatEnd Record, Index 0x06
*/
int U_PMR_MULTIFORMATEND_get(const char *contents, U_PMF_CMN_HDR *Header){
- if(!contents){ return(0); }
- U_PMF_CMN_HDR_get(&contents, Header);
- return(1);
+ return( U_PMR_common_header_get(contents,Header));
}
diff --git a/src/libuemf/upmf.h b/src/libuemf/upmf.h
index 27ac94a89..dbda02ba7 100644
--- a/src/libuemf/upmf.h
+++ b/src/libuemf/upmf.h
@@ -27,11 +27,11 @@
/*
File: upmf.h
-Version: 0.0.2
-Date: 04-NOV-2013
+Version: 0.0.4
+Date: 17-MAR-2015
Author: David Mathog, Biology Division, Caltech
email: mathog@caltech.edu
-Copyright: 2013 David Mathog and California Institute of Technology (Caltech)
+Copyright: 2015 David Mathog and California Institute of Technology (Caltech)
*/
#ifndef _UPMF_
@@ -1805,9 +1805,8 @@ typedef struct {
/** @brief EMF+ manual 2.2.2.25, Microsoft name: EmfPlusLinearGradientBrushOptionalData Object
For U_PMF_LINEARGRADIENTBRUSHDATA data field
*/
-typedef struct {
- U_PMF_ROTMATRIX Matrix; //!< Rotation matrix, Manuals says that this should be Transformation matrix, but last two values are missing
-/* variable part of object, not part of structure.
+/* Entire object is variable and not part of a structure! U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA
+ U_PMF_ROTMATRIX Matrix; //!< Rotation matrix, Manuals says that this should be Transformation matrix, but last two values are missing
(various) pattern; //!< Presence and meaning depend on Flags field, see below
Flag values
@@ -1818,7 +1817,6 @@ typedef struct {
0 0 1 U_PMF_BLENDFACTORS
0 1 1 U_PMF_BLENDFACTORS, U_PMF_BLENDFACTORS
*/
-} U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA;
/** @brief EMF+ manual 2.2.2.26, Microsoft name: EmfPlusLinePath Object */
typedef struct {
@@ -1888,7 +1886,10 @@ typedef struct {
Bitfields in the FILE (LITTLE endian here, manual uses BIG endian) are:
bits 4-7 PathPointType flags
bits 0-3 PathPointType enumeration
+ @{
*/
+typedef uint8_t U_PMF_PATHPOINTTYPE; //!< EMF+ manual 2.2.2.31, Microsoft name: EmfPlusPathPointType Object
+/** @} */
/** \defgroup U_PMF_PPTYPERLE PMF Run Length Encoded Path Point Types
@brief EMF+ manual 2.2.2.32, Microsoft name: EmfPlusPathPointTypeRLE Object
@@ -2838,6 +2839,7 @@ void U_PMF_MEMCPY_DSTSHIFT(char **Dst, const void *Src, size_t Size);
void U_PMF_REPCPY_DSTSHIFT(char **Dst, const void *Src, size_t Size, size_t Reps);
void U_PMF_PTRSAV_SHIFT(const char **Dst, const char **Src, size_t Size);
uint16_t U_PMF_HEADERFLAGS_get(const char *contents);
+int U_PMF_RECORD_SIZE_get(const char *contents);
int U_PMF_CMN_HDR_get(const char **contents, U_PMF_CMN_HDR *Header);
int U_OID_To_OT(uint32_t OID);
int U_OID_To_BT(uint32_t OID);
@@ -3035,77 +3037,77 @@ U_PSEUDO_OBJ *U_PMR_STROKEFILLPATH_set(void);
/* EMF+ prototypes (objects_get) */
-int U_PMF_BRUSH_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data);
-int U_PMF_CUSTOMLINECAP_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data);
-int U_PMF_FONT_get(const char *contents, uint32_t *Version, U_FLOAT *EmSize, uint32_t *SizeUnit, int32_t *FSFlags, uint32_t *Length, const char **Data);
-int U_PMF_IMAGE_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data);
-int U_PMF_IMAGEATTRIBUTES_get(const char *contents, uint32_t *Version, uint32_t *WrapMode, uint32_t *ClampColor, uint32_t *ObjectClamp);
-int U_PMF_PATH_get(const char *contents, uint32_t *Version, uint32_t *Count, uint16_t *Flags, const char **Points, const char **Types);
-int U_PMF_PEN_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **PenData, const char **Brush);
-int U_PMF_REGION_get(const char *contents, uint32_t *Version, uint32_t *Count, const char **Nodes);
-int U_PMF_STRINGFORMAT_get(const char *contents, U_PMF_STRINGFORMAT *Sfs, const char **Data);
-int U_PMF_ARGB_get(const char *contents, uint8_t *Blue, uint8_t *Green, uint8_t *Red, uint8_t *Alpha);
-int U_PMF_BITMAP_get(const char *contents, U_PMF_BITMAP *Bs, const char **Data);
-int U_PMF_BITMAPDATA_get(const char *contents, U_PMF_PALETTE *Ps, const char **Colors, const char **Data);
-int U_PMF_BLENDCOLORS_get(const char *contents, uint32_t *Elements, U_FLOAT **Positions, const char **Colors);
-int U_PMF_BLENDFACTORS_get(const char *contents, uint32_t *Elements, U_FLOAT **Positions, U_FLOAT **Factors);
-int U_PMF_BOUNDARYPATHDATA_get(const char *contents, int32_t *Size, const char **Data);
-int U_PMF_BOUNDARYPOINTDATA_get(const char *contents, int32_t *Elements, U_PMF_POINTF **Points);
-int U_PMF_CHARACTERRANGE_get(const char *contents, int32_t *First, int32_t *Length);
-int U_PMF_COMPOUNDLINEDATA_get(const char *contents, int32_t *Elements, U_FLOAT **Widths);
-int U_PMF_COMPRESSEDIMAGE_get(const char *contents, const char **Data);
-int U_PMF_CUSTOMENDCAPDATA_get(const char *contents, int32_t *Size, const char **Data);
-int U_PMF_CUSTOMLINECAPARROWDATA_get(const char *contents, U_PMF_CUSTOMLINECAPARROWDATA *Ccad);
-int U_PMF_CUSTOMLINECAPDATA_get(const char *contents, U_PMF_CUSTOMLINECAPDATA *Clcd, const char **Data);
-int U_PMF_CUSTOMLINECAPOPTIONALDATA_get(const char *contents, uint32_t Flags, const char **FillData, const char **LineData);
-int U_PMF_CUSTOMSTARTCAPDATA_get(const char *contents, int32_t *Size, const char **Data);
-int U_PMF_DASHEDLINEDATA_get(const char *contents, int32_t *Elements, U_FLOAT **Lengths);
-int U_PMF_FILLPATHOBJ_get(const char *contents, int32_t *Size, const char **Data);
-int U_PMF_FOCUSSCALEDATA_get(const char *contents, uint32_t *Count, U_FLOAT *ScaleX, U_FLOAT *ScaleY);
-int U_PMF_GRAPHICSVERSION_get(const char *contents, int *Signature, int *GrfVersion);
-int U_PMF_HATCHBRUSHDATA_get(const char *contents, uint32_t *Style, U_PMF_ARGB *Foreground, U_PMF_ARGB *Background);
-int U_PMF_INTEGER7_get(const char **contents, U_FLOAT *Value);
-int U_PMF_INTEGER15_get(const char **contents, U_FLOAT *Value);
+int U_PMF_BRUSH_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data, const char *blimit);
+int U_PMF_CUSTOMLINECAP_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data, const char *blimit);
+int U_PMF_FONT_get(const char *contents, uint32_t *Version, U_FLOAT *EmSize, uint32_t *SizeUnit, int32_t *FSFlags, uint32_t *Length, const char **Data, const char *blimit);
+int U_PMF_IMAGE_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data, const char *blimit);
+int U_PMF_IMAGEATTRIBUTES_get(const char *contents, uint32_t *Version, uint32_t *WrapMode, uint32_t *ClampColor, uint32_t *ObjectClamp, const char *blimit);
+int U_PMF_PATH_get(const char *contents, uint32_t *Version, uint32_t *Count, uint16_t *Flags, const char **Points, const char **Types, const char *blimit);
+int U_PMF_PEN_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **PenData, const char **Brush, const char *blimit);
+int U_PMF_REGION_get(const char *contents, uint32_t *Version, uint32_t *Count, const char **Nodes, const char *blimit);
+int U_PMF_STRINGFORMAT_get(const char *contents, U_PMF_STRINGFORMAT *Sfs, const char **Data, const char *blimit);
+int U_PMF_ARGB_get(const char *contents, uint8_t *Blue, uint8_t *Green, uint8_t *Red, uint8_t *Alpha, const char *blimit);
+int U_PMF_BITMAP_get(const char *contents, U_PMF_BITMAP *Bs, const char **Data, const char *blimit);
+int U_PMF_BITMAPDATA_get(const char *contents, U_PMF_PALETTE *Ps, const char **Colors, const char **Data, const char *blimit);
+int U_PMF_BLENDCOLORS_get(const char *contents, uint32_t *Elements, U_FLOAT **Positions, const char **Colors, const char *blimit);
+int U_PMF_BLENDFACTORS_get(const char *contents, uint32_t *Elements, U_FLOAT **Positions, U_FLOAT **Factors, const char *blimit);
+int U_PMF_BOUNDARYPATHDATA_get(const char *contents, int32_t *Size, const char **Data, const char *blimit);
+int U_PMF_BOUNDARYPOINTDATA_get(const char *contents, int32_t *Elements, U_PMF_POINTF **Points, const char *blimit);
+int U_PMF_CHARACTERRANGE_get(const char *contents, int32_t *First, int32_t *Length, const char *blimit);
+int U_PMF_COMPOUNDLINEDATA_get(const char *contents, int32_t *Elements, U_FLOAT **Widths, const char *blimit);
+int U_PMF_COMPRESSEDIMAGE_get(const char *contents, const char **Data, const char *blimit);
+int U_PMF_CUSTOMENDCAPDATA_get(const char *contents, int32_t *Size, const char **Data, const char *blimit);
+int U_PMF_CUSTOMLINECAPARROWDATA_get(const char *contents, U_PMF_CUSTOMLINECAPARROWDATA *Ccad, const char *blimit);
+int U_PMF_CUSTOMLINECAPDATA_get(const char *contents, U_PMF_CUSTOMLINECAPDATA *Clcd, const char **Data, const char *blimit);
+int U_PMF_CUSTOMLINECAPOPTIONALDATA_get(const char *contents, uint32_t Flags, const char **FillData, const char **LineData, const char *blimit);
+int U_PMF_CUSTOMSTARTCAPDATA_get(const char *contents, int32_t *Size, const char **Data, const char *blimit);
+int U_PMF_DASHEDLINEDATA_get(const char *contents, int32_t *Elements, U_FLOAT **Lengths, const char *blimit);
+int U_PMF_FILLPATHOBJ_get(const char *contents, int32_t *Size, const char **Data, const char *blimit);
+int U_PMF_FOCUSSCALEDATA_get(const char *contents, uint32_t *Count, U_FLOAT *ScaleX, U_FLOAT *ScaleY, const char *blimit);
+int U_PMF_GRAPHICSVERSION_get(const char *contents, int *Signature, int *GrfVersion, const char *blimit);
+int U_PMF_HATCHBRUSHDATA_get(const char *contents, uint32_t *Style, U_PMF_ARGB *Foreground, U_PMF_ARGB *Background, const char *blimit);
+int U_PMF_INTEGER7_get(const char **contents, U_FLOAT *Value, const char *blimit);
+int U_PMF_INTEGER15_get(const char **contents, U_FLOAT *Value, const char *blimit);
int U_PMF_LANGUAGEIDENTIFIER_get(U_PMF_LANGUAGEIDENTIFIER LId, int *SubLId, int *PriLId);
-int U_PMF_LINEARGRADIENTBRUSHDATA_get(const char *contents, U_PMF_LINEARGRADIENTBRUSHDATA *Lgbd, const char **Data);
-int U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_get(const char *contents, uint32_t Flags, U_PMF_TRANSFORMMATRIX *Tm, const char **Bc, const char **BfH, const char **BfV);
-int U_PMF_LINEPATH_get(const char *contents, int32_t *Size, const char **Data);
-int U_PMF_METAFILE_get(const char *contents, uint32_t *Type, uint32_t *Size, const char **Data);
-int U_PMF_PALETTE_get(const char *contents, uint32_t *Flags, uint32_t *Elements, const char **Data);
-int U_PMF_PATHGRADIENTBRUSHDATA_get(const char *contents, U_PMF_PATHGRADIENTBRUSHDATA *Pgbd, const char **Gradient, const char **Boundary, const char **Data);
-int U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_get(const char *contents, uint32_t Flags, U_PMF_TRANSFORMMATRIX *Matrix, const char **Pattern, const char **Data);
-int U_PMF_PATHPOINTTYPE_get(const char *contents, int *Flags, int *Type);
-int U_PMF_PATHPOINTTYPERLE_get(const char *contents, int *Bezier, int *RL, int *Ppt);
-int U_PMF_PENDATA_get(const char *contents, uint32_t *Flags, uint32_t *Unit, U_FLOAT *Width, const char **Data);
+int U_PMF_LINEARGRADIENTBRUSHDATA_get(const char *contents, U_PMF_LINEARGRADIENTBRUSHDATA *Lgbd, const char **Data, const char *blimit);
+int U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_get(const char *contents, uint32_t Flags, U_PMF_TRANSFORMMATRIX *Tm, const char **Bc, const char **BfH, const char **BfV, const char *blimit);
+int U_PMF_LINEPATH_get(const char *contents, int32_t *Size, const char **Data, const char *blimit);
+int U_PMF_METAFILE_get(const char *contents, uint32_t *Type, uint32_t *Size, const char **Data, const char *blimit);
+int U_PMF_PALETTE_get(const char *contents, uint32_t *Flags, uint32_t *Elements, const char **Data, const char *blimit);
+int U_PMF_PATHGRADIENTBRUSHDATA_get(const char *contents, U_PMF_PATHGRADIENTBRUSHDATA *Pgbd, const char **Gradient, const char **Boundary, const char **Data, const char *blimit);
+int U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_get(const char *contents, uint32_t Flags, U_PMF_TRANSFORMMATRIX *Matrix, const char **Pattern, const char **Data, const char *blimit);
+int U_PMF_PATHPOINTTYPE_get(const char *contents, int *Flags, int *Type, const char *blimit);
+int U_PMF_PATHPOINTTYPERLE_get(const char *contents, int *Bezier, int *RL, int *Ppt, const char *blimit);
+int U_PMF_PENDATA_get(const char *contents, uint32_t *Flags, uint32_t *Unit, U_FLOAT *Width, const char **Data, const char *blimit);
int U_PMF_PENOPTIONALDATA_get(const char *contents, uint32_t Flags, U_PMF_TRANSFORMMATRIX *Matrix,
int32_t *StartCap, int32_t *EndCap, uint32_t *Join, U_FLOAT *MiterLimit, int32_t *Style, int32_t *DLCap, U_FLOAT *DLOffset,
- const char **DLData, int32_t *Alignment, const char **CmpndLineData, const char **CSCapData, const char **CECapData);
-int U_PMF_POINT_get(const char **contents, U_FLOAT *X, U_FLOAT *Y);
-int U_PMF_POINTF_get(const char **contents, U_FLOAT *X, U_FLOAT *Y);
-int U_PMF_POINTR_get(const char **contents, U_FLOAT *X, U_FLOAT *Y);
-int U_PMF_RECT_get(const char **contents, int16_t *X, int16_t *Y, int16_t *Width, int16_t *Height);
-int U_PMF_RECTF_get(const char **contents, U_FLOAT *X, U_FLOAT *Y, U_FLOAT *Width, U_FLOAT *Height);
-int U_PMF_REGIONNODE_get(const char *contents, uint32_t *Type, const char **Data);
+ const char **DLData, int32_t *Alignment, const char **CmpndLineData, const char **CSCapData, const char **CECapData, const char *blimit);
+int U_PMF_POINT_get(const char **contents, U_FLOAT *X, U_FLOAT *Y, const char *blimit);
+int U_PMF_POINTF_get(const char **contents, U_FLOAT *X, U_FLOAT *Y, const char *blimit);
+int U_PMF_POINTR_get(const char **contents, U_FLOAT *X, U_FLOAT *Y, const char *blimit);
+int U_PMF_RECT_get(const char **contents, int16_t *X, int16_t *Y, int16_t *Width, int16_t *Height, const char *blimit);
+int U_PMF_RECTF_get(const char **contents, U_FLOAT *X, U_FLOAT *Y, U_FLOAT *Width, U_FLOAT *Height, const char *blimit);
+int U_PMF_REGIONNODE_get(const char *contents, uint32_t *Type, const char **Data, const char *blimit);
/* There is no U_PMF_REGIONNODECHILDNODES_get, see the note in upmf.c */
-int U_PMF_REGIONNODEPATH_get(const char *contents, int32_t *Size, const char **Data);
-int U_PMF_SOLIDBRUSHDATA_get(const char *contents, U_PMF_ARGB *Color);
+int U_PMF_REGIONNODEPATH_get(const char *contents, int32_t *Size, const char **Data, const char *blimit);
+int U_PMF_SOLIDBRUSHDATA_get(const char *contents, U_PMF_ARGB *Color, const char *blimit);
int U_PMF_STRINGFORMATDATA_get(const char *contents, uint32_t TabStopCount, uint32_t RangeCount,
- const U_FLOAT **TabStops, const U_PMF_CHARACTERRANGE **CharRange);
-int U_PMF_TEXTUREBRUSHDATA_get(const char *contents, uint32_t *Flags, int32_t *WrapMode, const char **Data);
-int U_PMF_TEXTUREBRUSHOPTIONALDATA_get(const char *contents, int HasImage, U_PMF_TRANSFORMMATRIX *Matrix, const char **Image);
-int U_PMF_TRANSFORMMATRIX_get(const char *contents, U_PMF_TRANSFORMMATRIX *Matrix);
-int U_PMF_IE_BLUR_get(const char *contents, U_FLOAT *Radius, uint32_t *ExpandEdge);
-int U_PMF_IE_BRIGHTNESSCONTRAST_get(const char *contents, int32_t *Brightness, int32_t *Contrast);
-int U_PMF_IE_COLORBALANCE_get(const char *contents, int32_t *CyanRed, int32_t *MagentaGreen, int32_t *YellowBlue);
-int U_PMF_IE_COLORCURVE_get(const char *contents, uint32_t *Adjust, uint32_t *Channel, int32_t *Intensity);
+ const U_FLOAT **TabStops, const U_PMF_CHARACTERRANGE **CharRange, const char *blimit);
+int U_PMF_TEXTUREBRUSHDATA_get(const char *contents, uint32_t *Flags, int32_t *WrapMode, const char **Data, const char *blimit);
+int U_PMF_TEXTUREBRUSHOPTIONALDATA_get(const char *contents, int HasImage, U_PMF_TRANSFORMMATRIX *Matrix, const char **Image, const char *blimit);
+int U_PMF_TRANSFORMMATRIX_get(const char *contents, U_PMF_TRANSFORMMATRIX *Matrix, const char *blimit);
+int U_PMF_IE_BLUR_get(const char *contents, U_FLOAT *Radius, uint32_t *ExpandEdge, const char *blimit);
+int U_PMF_IE_BRIGHTNESSCONTRAST_get(const char *contents, int32_t *Brightness, int32_t *Contrast, const char *blimit);
+int U_PMF_IE_COLORBALANCE_get(const char *contents, int32_t *CyanRed, int32_t *MagentaGreen, int32_t *YellowBlue, const char *blimit);
+int U_PMF_IE_COLORCURVE_get(const char *contents, uint32_t *Adjust, uint32_t *Channel, int32_t *Intensity, const char *blimit);
int U_PMF_IE_COLORLOOKUPTABLE_get(const char *contents,
- const uint8_t **BLUT, const uint8_t **GLUT, const uint8_t **RLUT, const uint8_t **ALUT);
-int U_PMF_IE_COLORMATRIX_get(const char *contents, U_PMF_IE_COLORMATRIX *Matrix);
-int U_PMF_IE_HUESATURATIONLIGHTNESS_get(const char *contents, int32_t *Hue, int32_t *Saturation, int32_t *Lightness);
-int U_PMF_IE_LEVELS_get(const char *contents, int32_t *Highlight, int32_t *Midtone, int32_t *Shadow);
-int U_PMF_IE_REDEYECORRECTION_get(const char *contents, int32_t *Elements, U_RECTL **Rects);
-int U_PMF_IE_SHARPEN_get(const char *contents, U_FLOAT *Radius, int32_t *Sharpen);
-int U_PMF_IE_TINT_get(const char *contents, int32_t *Hue, int32_t *Amount);
+ const uint8_t **BLUT, const uint8_t **GLUT, const uint8_t **RLUT, const uint8_t **ALUT, const char *blimit);
+int U_PMF_IE_COLORMATRIX_get(const char *contents, U_PMF_IE_COLORMATRIX *Matrix, const char *blimit);
+int U_PMF_IE_HUESATURATIONLIGHTNESS_get(const char *contents, int32_t *Hue, int32_t *Saturation, int32_t *Lightness, const char *blimit);
+int U_PMF_IE_LEVELS_get(const char *contents, int32_t *Highlight, int32_t *Midtone, int32_t *Shadow, const char *blimit);
+int U_PMF_IE_REDEYECORRECTION_get(const char *contents, int32_t *Elements, U_RECTL **Rects, const char *blimit);
+int U_PMF_IE_SHARPEN_get(const char *contents, U_FLOAT *Radius, int32_t *Sharpen, const char *blimit);
+int U_PMF_IE_TINT_get(const char *contents, int32_t *Hue, int32_t *Amount, const char *blimit);
/* EMF+ prototypes (records_get) */
diff --git a/src/libuemf/upmf_print.c b/src/libuemf/upmf_print.c
index 13bbfade8..7d9598b0d 100644
--- a/src/libuemf/upmf_print.c
+++ b/src/libuemf/upmf_print.c
@@ -6,11 +6,11 @@
/*
File: upmf_print.c
-Version: 0.0.3
-Date: 24-MAR-2014
+Version: 0.0.5
+Date: 24-MAR-2015
Author: David Mathog, Biology Division, Caltech
email: mathog@caltech.edu
-Copyright: 2014 David Mathog and California Institute of Technology (Caltech)
+Copyright: 2015 David Mathog and California Institute of Technology (Caltech)
*/
/* compiler options:
@@ -30,6 +30,7 @@ extern "C" {
#include <string.h>
#include "upmf_print.h"
#include "uemf_print.h"
+#include "uemf_safe.h"
//! \cond
@@ -49,7 +50,7 @@ int U_PMR_NODATAREC_print(const char *contents){
/*
this function is not visible in the API. Common routine used by many functions that draw points.
*/
-void U_PMF_VARPOINTS_print(const char **contents, int Flags, uint32_t Elements){
+void U_PMF_VARPOINTS_print(const char **contents, int Flags, uint32_t Elements, const char *blimit){
unsigned int i;
U_FLOAT Xpos, Ypos;
@@ -58,9 +59,9 @@ void U_PMF_VARPOINTS_print(const char **contents, int Flags, uint32_t Elements){
else { printf(" + Points(Float):"); }
for(Xpos = Ypos = i = 0; i<Elements; i++){
printf(" %d:",i);
- if( Flags & U_PPF_P){ (void) U_PMF_POINTR_print(contents, &Xpos, &Ypos); }
- else if(Flags & U_PPF_C){ (void) U_PMF_POINT_print(contents); }
- else { (void) U_PMF_POINTF_print(contents); }
+ if( Flags & U_PPF_P){ (void) U_PMF_POINTR_print(contents, &Xpos, &Ypos, blimit); }
+ else if(Flags & U_PPF_C){ (void) U_PMF_POINT_print(contents, blimit); }
+ else { (void) U_PMF_POINTF_print(contents, blimit); }
}
#if 0
int residual;
@@ -120,16 +121,23 @@ int U_PMF_VARBRUSHID_print(int btype, uint32_t BrushID){
\brief Print any EMF+ record
\returns record length for a normal record, 0 for EMREOF or , -1 for a bad record
\param contents pointer to a buffer holding this EMF+ record
- \param blimit one byte past the end of data of this EMF+ record
+ \param blimit one byte after this EMF+ record
\param recnum EMF number of this record in contents
- \param off Offset from the beginning of the EMF+ file.
+ \param off Offset from the beginning of the EMF+ file to the start of this record.
*/
int U_pmf_onerec_print(const char *contents, const char *blimit, int recnum, int off){
int status;
+ int rstatus;
static U_OBJ_ACCUM ObjCont={NULL,0,0,0,0}; /* for keeping track of object continuation. These may
be split across multiple EMF Comment records */
U_PMF_CMN_HDR Header;
const char *contemp = contents;
+
+ /* Check that COMMON header data in record can be touched without an access violation. If it cannot be
+ this is either a corrupt EMF or one engineered to cause a buffer overflow. Pointer math
+ could wrap so check both sides of the range.
+ */
+ if(IS_MEM_UNSAFE(contents, sizeof(U_PMF_CMN_HDR), blimit))return(-1);
if(!U_PMF_CMN_HDR_get(&contemp, &Header)){return(-1);}
int type = Header.Type & U_PMR_TYPE_MASK; /* strip the U_PMR_RECFLAG bit, leaving the indexable part */
@@ -142,67 +150,72 @@ int U_pmf_onerec_print(const char *contents, const char *blimit, int recnum, int
U_PMR_OBJECT_print(contents, blimit, &ObjCont, 1);
}
+ /* Check that the record size is OK, abort if not. */
+ if(Header.Size < sizeof(U_PMF_CMN_HDR) ||
+ IS_MEM_UNSAFE(contents, Header.Size, blimit))return(-1);
+
switch(type){
- case (U_PMR_HEADER): U_PMR_HEADER_print(contents); break;
- case (U_PMR_ENDOFFILE): U_PMR_ENDOFFILE_print(contents);
- U_OA_release(&ObjCont); break;
- case (U_PMR_COMMENT): U_PMR_COMMENT_print(contents); break;
- case (U_PMR_GETDC): U_PMR_GETDC_print(contents); break;
- case (U_PMR_MULTIFORMATSTART): U_PMR_MULTIFORMATSTART_print(contents); break;
- case (U_PMR_MULTIFORMATSECTION): U_PMR_MULTIFORMATSECTION_print(contents); break;
- case (U_PMR_MULTIFORMATEND): U_PMR_MULTIFORMATEND_print(contents); break;
- case (U_PMR_OBJECT): U_PMR_OBJECT_print(contents,blimit,&ObjCont,0); break;
- case (U_PMR_CLEAR): U_PMR_CLEAR_print(contents); break;
- case (U_PMR_FILLRECTS): U_PMR_FILLRECTS_print(contents, blimit); break;
- case (U_PMR_DRAWRECTS): U_PMR_DRAWRECTS_print(contents, blimit); break;
- case (U_PMR_FILLPOLYGON): U_PMR_FILLPOLYGON_print(contents); break;
- case (U_PMR_DRAWLINES): U_PMR_DRAWLINES_print(contents); break;
- case (U_PMR_FILLELLIPSE): U_PMR_FILLELLIPSE_print(contents); break;
- case (U_PMR_DRAWELLIPSE): U_PMR_DRAWELLIPSE_print(contents); break;
- case (U_PMR_FILLPIE): U_PMR_FILLPIE_print(contents); break;
- case (U_PMR_DRAWPIE): U_PMR_DRAWPIE_print(contents); break;
- case (U_PMR_DRAWARC): U_PMR_DRAWARC_print(contents); break;
- case (U_PMR_FILLREGION): U_PMR_FILLREGION_print(contents); break;
- case (U_PMR_FILLPATH): U_PMR_FILLPATH_print(contents); break;
- case (U_PMR_DRAWPATH): U_PMR_DRAWPATH_print(contents); break;
- case (U_PMR_FILLCLOSEDCURVE): U_PMR_FILLCLOSEDCURVE_print(contents); break;
- case (U_PMR_DRAWCLOSEDCURVE): U_PMR_DRAWCLOSEDCURVE_print(contents); break;
- case (U_PMR_DRAWCURVE): U_PMR_DRAWCURVE_print(contents); break;
- case (U_PMR_DRAWBEZIERS): U_PMR_DRAWBEZIERS_print(contents); break;
- case (U_PMR_DRAWIMAGE): U_PMR_DRAWIMAGE_print(contents); break;
- case (U_PMR_DRAWIMAGEPOINTS): U_PMR_DRAWIMAGEPOINTS_print(contents); break;
- case (U_PMR_DRAWSTRING): U_PMR_DRAWSTRING_print(contents); break;
- case (U_PMR_SETRENDERINGORIGIN): U_PMR_SETRENDERINGORIGIN_print(contents); break;
- case (U_PMR_SETANTIALIASMODE): U_PMR_SETANTIALIASMODE_print(contents); break;
- case (U_PMR_SETTEXTRENDERINGHINT): U_PMR_SETTEXTRENDERINGHINT_print(contents); break;
- case (U_PMR_SETTEXTCONTRAST): U_PMR_SETTEXTCONTRAST_print(contents); break;
- case (U_PMR_SETINTERPOLATIONMODE): U_PMR_SETINTERPOLATIONMODE_print(contents); break;
- case (U_PMR_SETPIXELOFFSETMODE): U_PMR_SETPIXELOFFSETMODE_print(contents); break;
- case (U_PMR_SETCOMPOSITINGMODE): U_PMR_SETCOMPOSITINGMODE_print(contents); break;
- case (U_PMR_SETCOMPOSITINGQUALITY): U_PMR_SETCOMPOSITINGQUALITY_print(contents); break;
- case (U_PMR_SAVE): U_PMR_SAVE_print(contents); break;
- case (U_PMR_RESTORE): U_PMR_RESTORE_print(contents); break;
- case (U_PMR_BEGINCONTAINER): U_PMR_BEGINCONTAINER_print(contents); break;
- case (U_PMR_BEGINCONTAINERNOPARAMS): U_PMR_BEGINCONTAINERNOPARAMS_print(contents); break;
- case (U_PMR_ENDCONTAINER): U_PMR_ENDCONTAINER_print(contents); break;
- case (U_PMR_SETWORLDTRANSFORM): U_PMR_SETWORLDTRANSFORM_print(contents); break;
- case (U_PMR_RESETWORLDTRANSFORM): U_PMR_RESETWORLDTRANSFORM_print(contents); break;
- case (U_PMR_MULTIPLYWORLDTRANSFORM): U_PMR_MULTIPLYWORLDTRANSFORM_print(contents); break;
- case (U_PMR_TRANSLATEWORLDTRANSFORM): U_PMR_TRANSLATEWORLDTRANSFORM_print(contents); break;
- case (U_PMR_SCALEWORLDTRANSFORM): U_PMR_SCALEWORLDTRANSFORM_print(contents); break;
- case (U_PMR_ROTATEWORLDTRANSFORM): U_PMR_ROTATEWORLDTRANSFORM_print(contents); break;
- case (U_PMR_SETPAGETRANSFORM): U_PMR_SETPAGETRANSFORM_print(contents); break;
- case (U_PMR_RESETCLIP): U_PMR_RESETCLIP_print(contents); break;
- case (U_PMR_SETCLIPRECT): U_PMR_SETCLIPRECT_print(contents); break;
- case (U_PMR_SETCLIPPATH): U_PMR_SETCLIPPATH_print(contents); break;
- case (U_PMR_SETCLIPREGION): U_PMR_SETCLIPREGION_print(contents); break;
- case (U_PMR_OFFSETCLIP): U_PMR_OFFSETCLIP_print(contents); break;
- case (U_PMR_DRAWDRIVERSTRING): U_PMR_DRAWDRIVERSTRING_print(contents); break;
- case (U_PMR_STROKEFILLPATH): U_PMR_STROKEFILLPATH_print(contents); break;
- case (U_PMR_SERIALIZABLEOBJECT): U_PMR_SERIALIZABLEOBJECT_print(contents); break;
- case (U_PMR_SETTSGRAPHICS): U_PMR_SETTSGRAPHICS_print(contents); break;
- case (U_PMR_SETTSCLIP): U_PMR_SETTSCLIP_print(contents); break;
- }
+ case (U_PMR_HEADER): rstatus = U_PMR_HEADER_print(contents); break;
+ case (U_PMR_ENDOFFILE): rstatus = U_PMR_ENDOFFILE_print(contents);
+ U_OA_release(&ObjCont); break;
+ case (U_PMR_COMMENT): rstatus = U_PMR_COMMENT_print(contents); break;
+ case (U_PMR_GETDC): rstatus = U_PMR_GETDC_print(contents); break;
+ case (U_PMR_MULTIFORMATSTART): rstatus = U_PMR_MULTIFORMATSTART_print(contents); break;
+ case (U_PMR_MULTIFORMATSECTION): rstatus = U_PMR_MULTIFORMATSECTION_print(contents); break;
+ case (U_PMR_MULTIFORMATEND): rstatus = U_PMR_MULTIFORMATEND_print(contents); break;
+ case (U_PMR_OBJECT): rstatus = U_PMR_OBJECT_print(contents,blimit,&ObjCont,0); break;
+ case (U_PMR_CLEAR): rstatus = U_PMR_CLEAR_print(contents); break;
+ case (U_PMR_FILLRECTS): rstatus = U_PMR_FILLRECTS_print(contents); break;
+ case (U_PMR_DRAWRECTS): rstatus = U_PMR_DRAWRECTS_print(contents); break;
+ case (U_PMR_FILLPOLYGON): rstatus = U_PMR_FILLPOLYGON_print(contents); break;
+ case (U_PMR_DRAWLINES): rstatus = U_PMR_DRAWLINES_print(contents); break;
+ case (U_PMR_FILLELLIPSE): rstatus = U_PMR_FILLELLIPSE_print(contents); break;
+ case (U_PMR_DRAWELLIPSE): rstatus = U_PMR_DRAWELLIPSE_print(contents); break;
+ case (U_PMR_FILLPIE): rstatus = U_PMR_FILLPIE_print(contents); break;
+ case (U_PMR_DRAWPIE): rstatus = U_PMR_DRAWPIE_print(contents); break;
+ case (U_PMR_DRAWARC): rstatus = U_PMR_DRAWARC_print(contents); break;
+ case (U_PMR_FILLREGION): rstatus = U_PMR_FILLREGION_print(contents); break;
+ case (U_PMR_FILLPATH): rstatus = U_PMR_FILLPATH_print(contents); break;
+ case (U_PMR_DRAWPATH): rstatus = U_PMR_DRAWPATH_print(contents); break;
+ case (U_PMR_FILLCLOSEDCURVE): rstatus = U_PMR_FILLCLOSEDCURVE_print(contents); break;
+ case (U_PMR_DRAWCLOSEDCURVE): rstatus = U_PMR_DRAWCLOSEDCURVE_print(contents); break;
+ case (U_PMR_DRAWCURVE): rstatus = U_PMR_DRAWCURVE_print(contents); break;
+ case (U_PMR_DRAWBEZIERS): rstatus = U_PMR_DRAWBEZIERS_print(contents); break;
+ case (U_PMR_DRAWIMAGE): rstatus = U_PMR_DRAWIMAGE_print(contents); break;
+ case (U_PMR_DRAWIMAGEPOINTS): rstatus = U_PMR_DRAWIMAGEPOINTS_print(contents); break;
+ case (U_PMR_DRAWSTRING): rstatus = U_PMR_DRAWSTRING_print(contents); break;
+ case (U_PMR_SETRENDERINGORIGIN): rstatus = U_PMR_SETRENDERINGORIGIN_print(contents); break;
+ case (U_PMR_SETANTIALIASMODE): rstatus = U_PMR_SETANTIALIASMODE_print(contents); break;
+ case (U_PMR_SETTEXTRENDERINGHINT): rstatus = U_PMR_SETTEXTRENDERINGHINT_print(contents); break;
+ case (U_PMR_SETTEXTCONTRAST): rstatus = U_PMR_SETTEXTCONTRAST_print(contents); break;
+ case (U_PMR_SETINTERPOLATIONMODE): rstatus = U_PMR_SETINTERPOLATIONMODE_print(contents); break;
+ case (U_PMR_SETPIXELOFFSETMODE): rstatus = U_PMR_SETPIXELOFFSETMODE_print(contents); break;
+ case (U_PMR_SETCOMPOSITINGMODE): rstatus = U_PMR_SETCOMPOSITINGMODE_print(contents); break;
+ case (U_PMR_SETCOMPOSITINGQUALITY): rstatus = U_PMR_SETCOMPOSITINGQUALITY_print(contents); break;
+ case (U_PMR_SAVE): rstatus = U_PMR_SAVE_print(contents); break;
+ case (U_PMR_RESTORE): rstatus = U_PMR_RESTORE_print(contents); break;
+ case (U_PMR_BEGINCONTAINER): rstatus = U_PMR_BEGINCONTAINER_print(contents); break;
+ case (U_PMR_BEGINCONTAINERNOPARAMS): rstatus = U_PMR_BEGINCONTAINERNOPARAMS_print(contents); break;
+ case (U_PMR_ENDCONTAINER): rstatus = U_PMR_ENDCONTAINER_print(contents); break;
+ case (U_PMR_SETWORLDTRANSFORM): rstatus = U_PMR_SETWORLDTRANSFORM_print(contents); break;
+ case (U_PMR_RESETWORLDTRANSFORM): rstatus = U_PMR_RESETWORLDTRANSFORM_print(contents); break;
+ case (U_PMR_MULTIPLYWORLDTRANSFORM): rstatus = U_PMR_MULTIPLYWORLDTRANSFORM_print(contents); break;
+ case (U_PMR_TRANSLATEWORLDTRANSFORM): rstatus = U_PMR_TRANSLATEWORLDTRANSFORM_print(contents); break;
+ case (U_PMR_SCALEWORLDTRANSFORM): rstatus = U_PMR_SCALEWORLDTRANSFORM_print(contents); break;
+ case (U_PMR_ROTATEWORLDTRANSFORM): rstatus = U_PMR_ROTATEWORLDTRANSFORM_print(contents); break;
+ case (U_PMR_SETPAGETRANSFORM): rstatus = U_PMR_SETPAGETRANSFORM_print(contents); break;
+ case (U_PMR_RESETCLIP): rstatus = U_PMR_RESETCLIP_print(contents); break;
+ case (U_PMR_SETCLIPRECT): rstatus = U_PMR_SETCLIPRECT_print(contents); break;
+ case (U_PMR_SETCLIPPATH): rstatus = U_PMR_SETCLIPPATH_print(contents); break;
+ case (U_PMR_SETCLIPREGION): rstatus = U_PMR_SETCLIPREGION_print(contents); break;
+ case (U_PMR_OFFSETCLIP): rstatus = U_PMR_OFFSETCLIP_print(contents); break;
+ case (U_PMR_DRAWDRIVERSTRING): rstatus = U_PMR_DRAWDRIVERSTRING_print(contents); break;
+ case (U_PMR_STROKEFILLPATH): rstatus = U_PMR_STROKEFILLPATH_print(contents); break;
+ case (U_PMR_SERIALIZABLEOBJECT): rstatus = U_PMR_SERIALIZABLEOBJECT_print(contents); break;
+ case (U_PMR_SETTSGRAPHICS): rstatus = U_PMR_SETTSGRAPHICS_print(contents); break;
+ case (U_PMR_SETTSCLIP): rstatus = U_PMR_SETTSCLIP_print(contents); break;
+ }
+ if(!rstatus)status=-1;
return(status);
}
@@ -446,15 +459,16 @@ int U_PMF_NODETYPE_print(int Type){
\brief Print data from a U_PMF_BRUSH object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.1.1, Microsoft name: EmfPlusBrush Object
*/
-int U_PMF_BRUSH_print(const char *contents){
+int U_PMF_BRUSH_print(const char *contents, const char *blimit){
uint32_t Version, Type;
const char *Data;
- int status = U_PMF_BRUSH_get(contents, &Version, &Type, &Data);
+ int status = U_PMF_BRUSH_get(contents, &Version, &Type, &Data, blimit);
if(status){
printf(" + Brush:");
- (void) U_PMF_GRAPHICSVERSION_print((char *)&Version);
+ (void) U_PMF_GRAPHICSVERSION_memsafe_print((char *)&Version);;
printf(" Type:%X(",Type);
(void) U_PMF_BRUSHTYPEENUMERATION_print(Type);
printf(")");
@@ -464,19 +478,19 @@ int U_PMF_BRUSH_print(const char *contents){
break;
case U_BT_HatchFill:
printf("\n");
- status = U_PMF_HATCHBRUSHDATA_print(Data);
+ status = U_PMF_HATCHBRUSHDATA_print(Data, blimit);
break;
case U_BT_TextureFill:
printf("\n");
- status = U_PMF_TEXTUREBRUSHDATA_print(Data);
+ status = U_PMF_TEXTUREBRUSHDATA_print(Data, blimit);
break;
case U_BT_PathGradient:
printf("\n");
- status = U_PMF_PATHGRADIENTBRUSHDATA_print(Data);
+ status = U_PMF_PATHGRADIENTBRUSHDATA_print(Data, blimit);
break;
case U_BT_LinearGradient:
printf("\n");
- status = U_PMF_LINEARGRADIENTBRUSHDATA_print(Data);
+ status = U_PMF_LINEARGRADIENTBRUSHDATA_print(Data, blimit);
break;
default:
status = 0;
@@ -491,23 +505,24 @@ int U_PMF_BRUSH_print(const char *contents){
\return 1 on success, 0 on error
\param contents Record from which to print data
\param Which A string which is either "Start" or "End".
+ \param blimit one byte past the end of data
EMF+ manual 2.2.1.2, Microsoft name: EmfPlusCustomLineCap Object
*/
-int U_PMF_CUSTOMLINECAP_print(const char *contents, const char *Which){
+int U_PMF_CUSTOMLINECAP_print(const char *contents, const char *Which, const char *blimit){
uint32_t Version, Type;
const char *Data;
- int status = U_PMF_CUSTOMLINECAP_get(contents, &Version, &Type, &Data);
+ int status = U_PMF_CUSTOMLINECAP_get(contents, &Version, &Type, &Data, blimit);
if(status){
printf(" + %sLineCap:",Which);
- (void) U_PMF_GRAPHICSVERSION_print((char *)&Version);
+ (void) U_PMF_GRAPHICSVERSION_memsafe_print((char *)&Version);;
printf(", Type %X\n",Type);
switch(Type){
case U_CLCDT_Default:
- status = U_PMF_CUSTOMLINECAPDATA_print(Data);
+ status = U_PMF_CUSTOMLINECAPDATA_print(Data, blimit);
break;
case U_CLCDT_AdjustableArrow:
- status = U_PMF_CUSTOMLINECAPARROWDATA_print(Data);
+ status = U_PMF_CUSTOMLINECAPARROWDATA_print(Data, blimit);
break;
default:
status = 0;
@@ -520,18 +535,19 @@ int U_PMF_CUSTOMLINECAP_print(const char *contents, const char *Which){
\brief Print data from a U_PMF_FONT object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.1.3, Microsoft name: EmfPlusFont Object
*/
-int U_PMF_FONT_print(const char *contents){
+int U_PMF_FONT_print(const char *contents, const char *blimit){
uint32_t Version, SizeUnit, Length;
U_FLOAT EmSize;
int32_t FSFlags;
const char *Data;
char *string;
- int status = U_PMF_FONT_get(contents, &Version, &EmSize, &SizeUnit, &FSFlags, &Length, &Data);
+ int status = U_PMF_FONT_get(contents, &Version, &EmSize, &SizeUnit, &FSFlags, &Length, &Data, blimit);
if(status){
printf(" + Font:");
- (void) U_PMF_GRAPHICSVERSION_print((char *)&Version);
+ (void) U_PMF_GRAPHICSVERSION_memsafe_print((char *)&Version);;
printf(" EmSize:%f ", EmSize );
printf(" SizeUnit:%d ",SizeUnit);
printf(" FSFlags:%d ", FSFlags );
@@ -553,25 +569,27 @@ int U_PMF_FONT_print(const char *contents){
\brief Print data from a U_PMF_IMAGE object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
+
EMF+ manual 2.2.1.4, Microsoft name: EmfPlusImage Object
*/
-int U_PMF_IMAGE_print(const char *contents){
+int U_PMF_IMAGE_print(const char *contents, const char *blimit){
uint32_t Version, Type;
const char *Data;
- int status = U_PMF_IMAGE_get(contents, &Version, &Type, &Data);
+ int status = U_PMF_IMAGE_get(contents, &Version, &Type, &Data, blimit);
if(status){
printf(" + Image:");
- (void) U_PMF_GRAPHICSVERSION_print((char *)&Version);
+ (void) U_PMF_GRAPHICSVERSION_memsafe_print((char *)&Version);;
printf(" Type:%X\n",Type);
switch(Type){
case U_IDT_Unknown:
printf(" + Unknown Image Type\n");
break;
case U_IDT_Bitmap:
- status = U_PMF_BITMAP_print(Data);
+ status = U_PMF_BITMAP_print(Data, blimit);
break;
case U_IDT_Metafile:
- status = U_PMF_METAFILE_print(Data);
+ status = U_PMF_METAFILE_print(Data, blimit);
break;
default:
status = 0;
@@ -585,15 +603,16 @@ int U_PMF_IMAGE_print(const char *contents){
\brief Print data from a U_PMF_IMAGEATTRIBUTES object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.1.5, Microsoft name: EmfPlusImageAttributes Object
*/
-int U_PMF_IMAGEATTRIBUTES_print(const char *contents){
+int U_PMF_IMAGEATTRIBUTES_print(const char *contents, const char *blimit){
uint32_t Version, WrapMode, ClampColor, ObjectClamp;
- int status = U_PMF_IMAGEATTRIBUTES_get(contents, &Version, &WrapMode, &ClampColor, &ObjectClamp);
+ int status = U_PMF_IMAGEATTRIBUTES_get(contents, &Version, &WrapMode, &ClampColor, &ObjectClamp, blimit);
if(status){
printf(" + Image Attributes: ");
- (void) U_PMF_GRAPHICSVERSION_print((char *)&Version);
+ (void) U_PMF_GRAPHICSVERSION_memsafe_print((char *)&Version);;
printf(" WrapMode:%X", WrapMode);
printf(" ClampColor:%X", ClampColor);
printf(" ObjectClamp:%X\n", ObjectClamp);
@@ -607,20 +626,21 @@ int U_PMF_IMAGEATTRIBUTES_print(const char *contents){
\brief Print data from a U_PMF_PATH object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.1.6, Microsoft name: EmfPlusPath Object
*/
-int U_PMF_PATH_print(const char *contents){
+int U_PMF_PATH_print(const char *contents, const char *blimit){
unsigned int i, pos;
uint32_t Version, Count;
uint16_t Flags;
const char *Points;
const char *Types;
- int status = U_PMF_PATH_get(contents, &Version, &Count, &Flags, &Points, &Types);
+ int status = U_PMF_PATH_get(contents, &Version, &Count, &Flags, &Points, &Types, blimit);
if(status){
printf(" + Path: Version:%X Count:%d Flags:%X\n",Version, Count, Flags);
/* Points part */
- U_PMF_VARPOINTS_print(&Points, Flags, Count);
+ U_PMF_VARPOINTS_print(&Points, Flags, Count, blimit);
/* Types part */
printf(" + Types:");
@@ -631,12 +651,12 @@ int U_PMF_PATH_print(const char *contents){
is which type. */
if(Flags & U_PPF_R){
printf(" %u:",pos);
- pos += U_PMF_PATHPOINTTYPERLE_print(Types);
+ pos += U_PMF_PATHPOINTTYPERLE_print(Types, blimit);
Types+=2;
}
else {
printf(" %d:",i);
- (void) U_PMF_PATHPOINTTYPE_print(Types);
+ (void) U_PMF_PATHPOINTTYPE_print(Types, blimit);
Types++;
}
}
@@ -651,15 +671,15 @@ int U_PMF_PATH_print(const char *contents){
\param contents Record from which to print data
EMF+ manual 2.2.1.7, Microsoft name: EmfPlusPen Object
*/
-int U_PMF_PEN_print(const char *contents){
+int U_PMF_PEN_print(const char *contents, const char *blimit){
uint32_t Version, Type;
const char *PenData;
const char *Brush;
- int status = U_PMF_PEN_get(contents, &Version, &Type, &PenData, &Brush);
+ int status = U_PMF_PEN_get(contents, &Version, &Type, &PenData, &Brush, blimit);
if(status){
printf(" + Pen: Version:%X Type:%d\n",Version,Type);
- (void) U_PMF_PENDATA_print(PenData);
- (void) U_PMF_BRUSH_print(Brush);
+ (void) U_PMF_PENDATA_print(PenData, blimit);
+ (void) U_PMF_BRUSH_print(Brush, blimit);
}
return(status);
}
@@ -668,17 +688,19 @@ int U_PMF_PEN_print(const char *contents){
\brief Print data from a U_PMF_REGION object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
+
EMF+ manual 2.2.1.8, Microsoft name: EmfPlusRegion Object
*/
-int U_PMF_REGION_print(const char *contents){
+int U_PMF_REGION_print(const char *contents, const char *blimit){
uint32_t Version, Count;
const char *Nodes;
- int status = U_PMF_REGION_get(contents, &Version, &Count, &Nodes);
+ int status = U_PMF_REGION_get(contents, &Version, &Count, &Nodes, blimit);
if(status){
printf(" + ");
- (void) U_PMF_GRAPHICSVERSION_print((char *) &Version);
+ (void) U_PMF_GRAPHICSVERSION_memsafe_print((char *)&Version);;
printf(" ChildNodes:%d",Count);
- (void) U_PMF_REGIONNODE_print(Nodes, 1); /* 1 == top level*/
+ (void) U_PMF_REGIONNODE_print(Nodes, 1, blimit); /* 1 == top level*/
}
return(status);
}
@@ -687,12 +709,13 @@ int U_PMF_REGION_print(const char *contents){
\brief Print data from a U_PMF_STRINGFORMAT object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.1.9, Microsoft name: EmfPlusStringFormat Object
*/
-int U_PMF_STRINGFORMAT_print(const char *contents){
+int U_PMF_STRINGFORMAT_print(const char *contents, const char *blimit){
U_PMF_STRINGFORMAT Sfs;
const char *Data;
- int status = U_PMF_STRINGFORMAT_get(contents, &Sfs, &Data);
+ int status = U_PMF_STRINGFORMAT_get(contents, &Sfs, &Data, blimit);
if(status){
printf(" + StringFormat: ");
printf(" Version:%X", Sfs.Version );
@@ -710,7 +733,7 @@ int U_PMF_STRINGFORMAT_print(const char *contents){
printf(" Trimming:%X", Sfs.Trimming );
printf(" TabStopCount:%u", Sfs.TabStopCount );
printf(" RangeCount:%u", Sfs.RangeCount );
- (void) U_PMF_STRINGFORMATDATA_print(Data, Sfs.TabStopCount, Sfs.RangeCount);
+ (void) U_PMF_STRINGFORMATDATA_print(Data, Sfs.TabStopCount, Sfs.RangeCount, blimit);
}
return(status);
}
@@ -719,11 +742,13 @@ int U_PMF_STRINGFORMAT_print(const char *contents){
\brief Print data from a U_PMF_ARGB object
\return 1 on success, 0 on error
\param contents Record from which to print data
+
+ Does not accept a blimit value.
EMF+ manual 2.2.2.1, Microsoft name: EmfPlusARGB Object
*/
int U_PMF_ARGB_print(const char *contents){
uint8_t Blue, Green, Red, Alpha;
- int status = U_PMF_ARGB_get(contents, &Blue, &Green, &Red, &Alpha);
+ int status = U_PMF_ARGB_get(contents, &Blue, &Green, &Red, &Alpha, contents + sizeof(U_RGBQUAD));
if(status){
printf(" RGBA{%2.2X,%2.2X,%2.2X,%2.2X}", Red, Green, Blue, Alpha);
}
@@ -735,12 +760,13 @@ int U_PMF_ARGB_print(const char *contents){
\brief Print data from a U_PMF_BITMAP object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.2, Microsoft name: EmfPlusBitmap Object
*/
-int U_PMF_BITMAP_print(const char *contents){
+int U_PMF_BITMAP_print(const char *contents, const char *blimit){
U_PMF_BITMAP Bs;
const char *Data;
- int status = U_PMF_BITMAP_get(contents, &Bs, &Data);
+ int status = U_PMF_BITMAP_get(contents, &Bs, &Data, blimit);
if(status){
printf(" + Bitmap: Width:%d Height:%d Stride:%d\n",Bs.Width, Bs.Height, Bs.Stride);
U_PMF_PX_FMT_ENUM_print(Bs.PxFormat);
@@ -759,14 +785,15 @@ int U_PMF_BITMAP_print(const char *contents){
\brief Print data from a U_PMF_BITMAPDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.3, Microsoft name: EmfPlusBitmapData Object
*/
-int U_PMF_BITMAPDATA_print(const char *contents){
+int U_PMF_BITMAPDATA_print(const char *contents, const char *blimit){
unsigned int i;
U_PMF_PALETTE Ps;
const char *Colors;
const char *Data;
- int status = U_PMF_BITMAPDATA_get(contents, &Ps, &Colors, &Data);
+ int status = U_PMF_BITMAPDATA_get(contents, &Ps, &Colors, &Data, blimit);
if(status){
status = 0;
printf(" BMData: Flags:%X, Elements:%u Colors:", Ps.Flags, Ps.Elements);
@@ -781,14 +808,15 @@ int U_PMF_BITMAPDATA_print(const char *contents){
\brief Print data from a U_PMF_BLENDCOLORS object
\return size in bytes on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.4, Microsoft name: EmfPlusBlendColors Object
*/
-int U_PMF_BLENDCOLORS_print(const char *contents){
+int U_PMF_BLENDCOLORS_print(const char *contents, const char *blimit){
unsigned int i;
uint32_t Elements;
U_FLOAT *Positions;
const char *Colors;
- int status = U_PMF_BLENDCOLORS_get(contents, &Elements, &Positions, &Colors);
+ int status = U_PMF_BLENDCOLORS_get(contents, &Elements, &Positions, &Colors, blimit);
if(status){
printf(" + BlendColors: Entries:%d (entry,pos,color): ", Elements);
for(i=0; i<Elements; i++){
@@ -808,14 +836,15 @@ int U_PMF_BLENDCOLORS_print(const char *contents){
\return size on success, 0 on error
\param type Type of BlendFactors, usually H or V
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.5, Microsoft name: EmfPlusBlendFactors Object
*/
-int U_PMF_BLENDFACTORS_print(const char *contents, const char *type){
+int U_PMF_BLENDFACTORS_print(const char *contents, const char *type, const char *blimit){
unsigned int i;
uint32_t Elements;
U_FLOAT *Positions;
U_FLOAT *Factors;
- int status = U_PMF_BLENDFACTORS_get(contents, &Elements, &Positions, &Factors);
+ int status = U_PMF_BLENDFACTORS_get(contents, &Elements, &Positions, &Factors, blimit);
if(status){
printf(" + BlendFactors%s: Entries:%d (entry,pos,factor): ",type, Elements);
for(i=0; i<Elements; i++){
@@ -832,15 +861,16 @@ int U_PMF_BLENDFACTORS_print(const char *contents, const char *type){
\brief Print data from a U_PMF_BOUNDARYPATHDATA object
\return size on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.6, Microsoft name: EmfPlusBoundaryPathData Object
*/
-int U_PMF_BOUNDARYPATHDATA_print(const char *contents){
+int U_PMF_BOUNDARYPATHDATA_print(const char *contents, const char * blimit){
int32_t Size;
const char *Data;
- int status = U_PMF_BOUNDARYPATHDATA_get(contents, &Size, &Data);
+ int status = U_PMF_BOUNDARYPATHDATA_get(contents, &Size, &Data, blimit);
if(status){
printf(" + BoundaryPathData: Size:%d\n",Size);
- (void) U_PMF_PATH_print(Data);
+ (void) U_PMF_PATH_print(Data, blimit);
}
return(status);
}
@@ -850,12 +880,13 @@ int U_PMF_BOUNDARYPATHDATA_print(const char *contents){
\brief Print data from a U_PMF_BOUNDARYPOINTDATA object
\return size on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.7, Microsoft name: EmfPlusBoundaryPointData Object
*/
-int U_PMF_BOUNDARYPOINTDATA_print(const char *contents){
+int U_PMF_BOUNDARYPOINTDATA_print(const char *contents, const char *blimit){
int32_t Elements;
U_PMF_POINTF *Points;
- int status = U_PMF_BOUNDARYPOINTDATA_get(contents, &Elements, &Points);
+ int status = U_PMF_BOUNDARYPOINTDATA_get(contents, &Elements, &Points, blimit);
if(status){
printf(" + BoundaryPointData: Elements:%u\n",Elements);
U_PMF_VARPOINTF_S_print(Points, Elements);
@@ -868,11 +899,12 @@ int U_PMF_BOUNDARYPOINTDATA_print(const char *contents){
\brief Print data from a U_PMF_CHARACTERRANGE object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.8, Microsoft name: EmfPlusCharacterRange Object
*/
-int U_PMF_CHARACTERRANGE_print(const char *contents){
+int U_PMF_CHARACTERRANGE_print(const char *contents, const char *blimit){
int32_t First, Length;
- int status = U_PMF_CHARACTERRANGE_get(contents, &First, &Length);
+ int status = U_PMF_CHARACTERRANGE_get(contents, &First, &Length, blimit);
if(status){
printf(" {%d,%d}",First,Length);
}
@@ -882,14 +914,15 @@ int U_PMF_CHARACTERRANGE_print(const char *contents){
/**
\brief Print data from a U_PMF_DASHEDLINEDATA object
\return 1 on success, 0 on error
+ \param blimit one byte past the end of data
\param contents Record from which to print data
EMF+ manual 2.2.2.9, Microsoft name: EmfPlusCompoundLineData Object
*/
-int U_PMF_COMPOUNDLINEDATA_print(const char *contents){
+int U_PMF_COMPOUNDLINEDATA_print(const char *contents, const char *blimit){
int32_t Elements;
U_FLOAT *Widths;
U_FLOAT *hold;
- int status = U_PMF_COMPOUNDLINEDATA_get(contents, &Elements, &Widths);
+ int status = U_PMF_COMPOUNDLINEDATA_get(contents, &Elements, &Widths, blimit);
if(status){
printf(" + CompoundLineData: Elements:%u {",Elements);
Elements--;
@@ -905,13 +938,14 @@ int U_PMF_COMPOUNDLINEDATA_print(const char *contents){
\brief Print data from a U_PMF_COMPRESSEDIMAGE object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.10, Microsoft name: EmfPlusCompressedImage Object
This function does not do anything useful, but it is included so that all objects have a corresponding _get().
*/
-int U_PMF_COMPRESSEDIMAGE_print(const char *contents){
+int U_PMF_COMPRESSEDIMAGE_print(const char *contents, const char *blimit){
const char *Data;
- int status = U_PMF_COMPRESSEDIMAGE_get(contents, &Data);
+ int status = U_PMF_COMPRESSEDIMAGE_get(contents, &Data, blimit);
if(status){
printf("CompressedImage:\n");
}
@@ -922,15 +956,16 @@ int U_PMF_COMPRESSEDIMAGE_print(const char *contents){
\brief Print data from a U_PMF_CUSTOMENDCAPDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.11, Microsoft name: EmfPlusCustomEndCapData Object
*/
-int U_PMF_CUSTOMENDCAPDATA_print(const char *contents){
+int U_PMF_CUSTOMENDCAPDATA_print(const char *contents, const char *blimit){
int32_t Size;
const char *Data;
- int status = U_PMF_CUSTOMENDCAPDATA_get(contents, &Size, &Data);
+ int status = U_PMF_CUSTOMENDCAPDATA_get(contents, &Size, &Data, blimit);
if(status){
printf(" + CustomEndCap: Size:%d\n",Size);
- (void) U_PMF_CUSTOMLINECAP_print(Data, "End");
+ (void) U_PMF_CUSTOMLINECAP_print(Data, "End", blimit);
}
return(status);
}
@@ -939,11 +974,12 @@ int U_PMF_CUSTOMENDCAPDATA_print(const char *contents){
\brief Print data from a U_PMF_CUSTOMLINECAPARROWDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.12, Microsoft name: EmfPlusCustomLineCapArrowData Object
*/
-int U_PMF_CUSTOMLINECAPARROWDATA_print(const char *contents){
+int U_PMF_CUSTOMLINECAPARROWDATA_print(const char *contents, const char *blimit){
U_PMF_CUSTOMLINECAPARROWDATA Ccad;
- int status = U_PMF_CUSTOMLINECAPARROWDATA_get(contents, &Ccad);
+ int status = U_PMF_CUSTOMLINECAPARROWDATA_get(contents, &Ccad, blimit);
if(status){
printf("CustomLineCapArrowData: ");
printf(" Width:%f", Ccad.Width );
@@ -966,12 +1002,13 @@ int U_PMF_CUSTOMLINECAPARROWDATA_print(const char *contents){
\brief Print data from a U_PMF_CUSTOMLINECAPDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.13, Microsoft name: EmfPlusCustomLineCapData Object
*/
-int U_PMF_CUSTOMLINECAPDATA_print(const char *contents){
+int U_PMF_CUSTOMLINECAPDATA_print(const char *contents, const char *blimit){
U_PMF_CUSTOMLINECAPDATA Clcd;
const char *Data;
- int status = U_PMF_CUSTOMLINECAPDATA_get(contents, &Clcd, &Data);
+ int status = U_PMF_CUSTOMLINECAPDATA_get(contents, &Clcd, &Data, blimit);
if(status){
printf(" + CustomLineCapData: ");
printf(" Flags:%X", Clcd.Flags );
@@ -984,7 +1021,7 @@ int U_PMF_CUSTOMLINECAPDATA_print(const char *contents){
printf(" WidthScale:%f", Clcd.WidthScale );
printf(" FillHotSpot:{%f,%f}",Clcd.FillHotSpot[0],Clcd.FillHotSpot[1]);
printf(" LineHotSpot:{%f,%f}\n",Clcd.LineHotSpot[0],Clcd.LineHotSpot[1]);
- (void) U_PMF_CUSTOMLINECAPOPTIONALDATA_print(Data, Clcd.Flags);
+ (void) U_PMF_CUSTOMLINECAPOPTIONALDATA_print(Data, Clcd.Flags, blimit);
/* preceding line always emits an EOL */
}
return(status);
@@ -996,18 +1033,19 @@ int U_PMF_CUSTOMLINECAPDATA_print(const char *contents){
\return 1 on success, 0 on error
\param contents Record from which to print data
\param Flags CustomLineCapData Flags
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.14, Microsoft name: EmfPlusCustomLineCapOptionalData Object
*/
-int U_PMF_CUSTOMLINECAPOPTIONALDATA_print(const char *contents, uint32_t Flags){
+int U_PMF_CUSTOMLINECAPOPTIONALDATA_print(const char *contents, uint32_t Flags, const char *blimit){
const char *FillData;
const char *LineData;
- int status = U_PMF_CUSTOMLINECAPOPTIONALDATA_get(contents, Flags, &FillData, &LineData);
+ int status = U_PMF_CUSTOMLINECAPOPTIONALDATA_get(contents, Flags, &FillData, &LineData, blimit);
if(status){ /* True even if there is nothing in it! */
printf(" + CustomLineCapOptionalData:");
if(FillData || LineData){
- if(FillData){ (void) U_PMF_FILLPATHOBJ_print(FillData); }
- if(LineData){ (void) U_PMF_LINEPATH_print(LineData); }
+ if(FillData){ (void) U_PMF_FILLPATHOBJ_print(FillData, blimit); }
+ if(LineData){ (void) U_PMF_LINEPATH_print(LineData, blimit); }
}
else {
printf("None");
@@ -1021,15 +1059,16 @@ int U_PMF_CUSTOMLINECAPOPTIONALDATA_print(const char *contents, uint32_t Flags){
\brief Print data from a U_PMF_CUSTOMSTARTCAPDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.15, Microsoft name: EmfPlusCustomStartCapData Object
*/
-int U_PMF_CUSTOMSTARTCAPDATA_print(const char *contents){
+int U_PMF_CUSTOMSTARTCAPDATA_print(const char *contents, const char *blimit){
int32_t Size;
const char *Data;
- int status = U_PMF_CUSTOMSTARTCAPDATA_get(contents, &Size, &Data);
+ int status = U_PMF_CUSTOMSTARTCAPDATA_get(contents, &Size, &Data, blimit);
if(status){
printf(" + CustomStartCap: Size:%d ",Size);
- (void) U_PMF_CUSTOMLINECAP_print(Data, "Start");
+ (void) U_PMF_CUSTOMLINECAP_print(Data, "Start", blimit);
}
return(status);
}
@@ -1038,13 +1077,14 @@ int U_PMF_CUSTOMSTARTCAPDATA_print(const char *contents){
\brief Print data from a U_PMF_DASHEDLINEDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.16, Microsoft name: EmfPlusDashedLineData Object
*/
-int U_PMF_DASHEDLINEDATA_print(const char *contents){
+int U_PMF_DASHEDLINEDATA_print(const char *contents, const char *blimit){
int32_t Elements;
U_FLOAT *Lengths;
U_FLOAT *hold;
- int status = U_PMF_DASHEDLINEDATA_get(contents, &Elements, &Lengths);
+ int status = U_PMF_DASHEDLINEDATA_get(contents, &Elements, &Lengths, blimit);
if(status){
printf(" DashedLineData: Elements:%u {",Elements);
Elements--;
@@ -1059,15 +1099,16 @@ int U_PMF_DASHEDLINEDATA_print(const char *contents){
\brief Print data from a U_PMF_FILLPATHOBJ object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.17, Microsoft name: EmfPlusFillPath Object
*/
-int U_PMF_FILLPATHOBJ_print(const char *contents){
+int U_PMF_FILLPATHOBJ_print(const char *contents, const char * blimit){
int32_t Size;
const char *Data;
- int status = U_PMF_FILLPATHOBJ_get(contents, &Size, &Data);
+ int status = U_PMF_FILLPATHOBJ_get(contents, &Size, &Data, blimit);
if(status){
printf(" FillPathObj: Size:%d\n",Size);
- if(Size){ (void) U_PMF_PATH_print(Data); }
+ if(Size){ (void) U_PMF_PATH_print(Data, blimit); }
}
return(status);
}
@@ -1076,12 +1117,13 @@ int U_PMF_FILLPATHOBJ_print(const char *contents){
\brief Print data from a U_PMF_FOCUSSCALEDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.18, Microsoft name: EmfPlusFocusScaleData Object
*/
-int U_PMF_FOCUSSCALEDATA_print(const char *contents){
+int U_PMF_FOCUSSCALEDATA_print(const char *contents, const char *blimit){
uint32_t Count;
U_FLOAT ScaleX, ScaleY;
- int status = U_PMF_FOCUSSCALEDATA_get(contents, &Count, &ScaleX, &ScaleY);
+ int status = U_PMF_FOCUSSCALEDATA_get(contents, &Count, &ScaleX, &ScaleY, blimit);
if(status){
printf(" FocusScaleData: Count:%d ScaleX:%f ScaleY:%f ",Count,ScaleX,ScaleY);
}
@@ -1089,14 +1131,31 @@ int U_PMF_FOCUSSCALEDATA_print(const char *contents){
}
/**
- \brief Print data from a U_PMF_GRAPHICSVERSION_print object
+ \brief Print data from a U_PMF_GRAPHICSVERSION object already known to be memory safe
+ \return 1 on success, 0 on error
+ \param contents Record from which to print data
+ EMF+ manual 2.2.2.19, Microsoft name: EmfPlusGraphicsVersion Object
+
+ In this module the only time a U_PMF_GRAPHICSVERSION is printed is after it
+ has already been copied into a safe memory structure. This routine fakes up
+ a blimit for the general routine.
+
+*/
+int U_PMF_GRAPHICSVERSION_memsafe_print(const char *contents){
+ const char *blimit = contents + sizeof(U_PMF_GRAPHICSVERSION);
+ return(U_PMF_GRAPHICSVERSION_print(contents, blimit));
+}
+
+/**
+ \brief Print data from a U_PMF_GRAPHICSVERSION object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.19, Microsoft name: EmfPlusGraphicsVersion Object
*/
-int U_PMF_GRAPHICSVERSION_print(const char *contents){
+int U_PMF_GRAPHICSVERSION_print(const char *contents, const char *blimit){
int Signature,GrfVersion;
- int status = U_PMF_GRAPHICSVERSION_get(contents, &Signature, &GrfVersion);
+ int status = U_PMF_GRAPHICSVERSION_get(contents, &Signature, &GrfVersion, blimit);
if(status){
printf(" MetaFileSig:%X",Signature );
printf(" GraphicsVersion:%X", GrfVersion);
@@ -1106,15 +1165,16 @@ int U_PMF_GRAPHICSVERSION_print(const char *contents){
/**
- \brief Print data from a U_PMF_HATCHBRUSHDATA_print object
+ \brief Print data from a U_PMF_HATCHBRUSHDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit One byte past the last record in memory.
EMF+ manual 2.2.2.20, Microsoft name: EmfPlusHatchBrushData Object
*/
-int U_PMF_HATCHBRUSHDATA_print(const char *contents){
+int U_PMF_HATCHBRUSHDATA_print(const char *contents, const char *blimit){
uint32_t Style;
U_PMF_ARGB Foreground, Background;
- int status = U_PMF_HATCHBRUSHDATA_get(contents, &Style, &Foreground, &Background);
+ int status = U_PMF_HATCHBRUSHDATA_get(contents, &Style, &Foreground, &Background, blimit);
if(status){
printf(" + HBdata: Style:%u(",Style);
U_PMF_HATCHSTYLEENUMERATION_print(Style);
@@ -1148,12 +1208,13 @@ int U_PMF_LANGUAGEIDENTIFIER_print(U_PMF_LANGUAGEIDENTIFIER LId){
\brief Print data from a U_PMF_LINEARGRADIENTBRUSHDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit One byte past the last record in memory.
EMF+ manual 2.2.2.24, Microsoft name: EmfPlusLinearGradientBrushData Object
*/
-int U_PMF_LINEARGRADIENTBRUSHDATA_print(const char *contents){
+int U_PMF_LINEARGRADIENTBRUSHDATA_print(const char *contents, const char *blimit){
U_PMF_LINEARGRADIENTBRUSHDATA Lgbd;
const char *Data;
- int status = U_PMF_LINEARGRADIENTBRUSHDATA_get(contents, &Lgbd, &Data);
+ int status = U_PMF_LINEARGRADIENTBRUSHDATA_get(contents, &Lgbd, &Data, blimit);
if(status){
printf(" + LinearGradientBrushData: Flags:%X WrapMode:%d Rect:",Lgbd.Flags, Lgbd.WrapMode);
(void) U_PMF_RECTF_S_print(&(Lgbd.RectF));
@@ -1167,7 +1228,7 @@ int U_PMF_LINEARGRADIENTBRUSHDATA_print(const char *contents){
printf(" Reserved2:");
(void) U_PMF_ARGB_print((char *)&(Lgbd.Reserved2));
printf("\n");
- (void) U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_print(Data, Lgbd.Flags);
+ (void) U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_print(Data, Lgbd.Flags, blimit);
}
return(status);
}
@@ -1179,16 +1240,17 @@ int U_PMF_LINEARGRADIENTBRUSHDATA_print(const char *contents){
\return 1 on success, 0 on error
\param contents Record from which to print data
\param BDFlag Describes optional values in contents
+ \param blimit One byte past the last record in memory.
EMF+ manual 2.2.2.25, Microsoft name: EmfPlusLinearGradientBrushOptionalData Object
*/
-int U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_print(const char *contents, int BDFlag){
+int U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_print(const char *contents, int BDFlag, const char *blimit){
U_PMF_TRANSFORMMATRIX Tm;
const char *Bc;
const char *BfH;
const char *BfV;
int None=1;
printf(" + LinearGradientBrushOptionalData: ");
- int status = U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_get(contents, BDFlag, &Tm, &Bc, &BfH, &BfV);
+ int status = U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_get(contents, BDFlag, &Tm, &Bc, &BfH, &BfV, blimit);
if(status){
if(BDFlag & U_BD_Transform){
U_PMF_TRANSFORMMATRIX2_print(&Tm);
@@ -1196,17 +1258,17 @@ int U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_print(const char *contents, int BDFlag
}
if(Bc){
printf("\n");
- (void) U_PMF_BLENDCOLORS_print(Bc);
+ (void) U_PMF_BLENDCOLORS_print(Bc, blimit);
None=0;
}
if(BfH){
printf("\n");
- (void) U_PMF_BLENDFACTORS_print(BfH,"H");
+ (void) U_PMF_BLENDFACTORS_print(BfH,"H", blimit);
None=0;
}
if(BfV){
printf("\n");
- (void) U_PMF_BLENDFACTORS_print(BfV,"V");
+ (void) U_PMF_BLENDFACTORS_print(BfV,"V", blimit);
None=0;
}
if(None){
@@ -1220,15 +1282,16 @@ int U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_print(const char *contents, int BDFlag
\brief Print data from a U_PMF_LINEPATH object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.26, Microsoft name: EmfPlusLinePath Object
*/
-int U_PMF_LINEPATH_print(const char *contents){
+int U_PMF_LINEPATH_print(const char *contents, const char * blimit){
int32_t Size;
const char *Data;
- int status = U_PMF_LINEPATH_get(contents, &Size, &Data);
+ int status = U_PMF_LINEPATH_get(contents, &Size, &Data, blimit);
if(status){
printf(" LinePath: Size:%d\n", Size);
- (void) U_PMF_PATH_print(Data);
+ (void) U_PMF_PATH_print(Data, blimit);
}
return(status);
}
@@ -1237,13 +1300,14 @@ int U_PMF_LINEPATH_print(const char *contents){
\brief Print data from a U_PMF_METAFILE object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.27, Microsoft name: EmfPlusMetafile Object
*/
-int U_PMF_METAFILE_print(const char *contents){
+int U_PMF_METAFILE_print(const char *contents, const char * blimit){
uint32_t Type;
uint32_t Size;
const char *Data;
- int status = U_PMF_METAFILE_get(contents, &Type, &Size, &Data);
+ int status = U_PMF_METAFILE_get(contents, &Type, &Size, &Data, blimit);
if(status){
printf(" MetaFile: Type:%X Size:%d",Type, Size);
/* embedded metafiles are not handled beyond this*/
@@ -1255,14 +1319,15 @@ int U_PMF_METAFILE_print(const char *contents){
\brief Print data from a U_PMF_PALETTE object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.28, Microsoft name: EmfPlusPalette Object
*/
-int U_PMF_PALETTE_print(const char *contents){
+int U_PMF_PALETTE_print(const char *contents, const char *blimit){
unsigned int i;
uint32_t Flags;
uint32_t Elements;
const char *Data;
- int status = U_PMF_PALETTE_get(contents, &Flags, &Elements, &Data);
+ int status = U_PMF_PALETTE_get(contents, &Flags, &Elements, &Data, blimit);
if(status){
printf(" Palette: Flags:%X Elements:%u Colors:",Flags, Elements);
for(i=0; i<Elements; i++){
@@ -1278,15 +1343,16 @@ int U_PMF_PALETTE_print(const char *contents){
\brief Print data from a U_PMF_PATHGRADIENTBRUSHDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.29, Microsoft name: EmfPlusPathGradientBrushData Object
*/
-int U_PMF_PATHGRADIENTBRUSHDATA_print(const char *contents){
+int U_PMF_PATHGRADIENTBRUSHDATA_print(const char *contents, const char *blimit){
U_PMF_PATHGRADIENTBRUSHDATA Pgbd;
const char *Gradient;
const char *Boundary;
const char *Data=NULL;
unsigned int i;
- int status = U_PMF_PATHGRADIENTBRUSHDATA_get(contents, &Pgbd, &Gradient, &Boundary, &Data);
+ int status = U_PMF_PATHGRADIENTBRUSHDATA_get(contents, &Pgbd, &Gradient, &Boundary, &Data, blimit);
if(status){
printf(" + PathGradientBrushData: Flags:%X WrapMode:%d, CenterColor:",Pgbd.Flags, Pgbd.WrapMode);
(void) U_PMF_ARGB_print((char *)&(Pgbd.CenterColor));
@@ -1301,12 +1367,12 @@ int U_PMF_PATHGRADIENTBRUSHDATA_print(const char *contents){
printf("\n");
}
if(Pgbd.Flags & U_BD_Path){
- (void) U_PMF_BOUNDARYPATHDATA_print(Boundary);
+ (void) U_PMF_BOUNDARYPATHDATA_print(Boundary, blimit);
}
else {
- (void) U_PMF_BOUNDARYPOINTDATA_print(Boundary);
+ (void) U_PMF_BOUNDARYPOINTDATA_print(Boundary, blimit);
}
- (void) U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_print(Data, Pgbd.Flags);
+ (void) U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_print(Data, Pgbd.Flags, blimit);
}
return(status);
}
@@ -1316,25 +1382,26 @@ int U_PMF_PATHGRADIENTBRUSHDATA_print(const char *contents){
\return 1 on success, 0 on error
\param contents Record from which to print data
\param BDFlag Describes optional values in contents
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.30, Microsoft name: EmfPlusPathGradientBrushOptionalData Object
*/
-int U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_print(const char *contents, int BDFlag){
+int U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_print(const char *contents, int BDFlag, const char *blimit){
if(BDFlag & (U_BD_Transform | U_BD_PresetColors | U_BD_BlendFactorsH | U_BD_FocusScales)){
printf(" + PathGradientBrushOptionalData: ");
}
if(BDFlag & U_BD_Transform){
- U_PMF_TRANSFORMMATRIX_print(contents);
+ U_PMF_TRANSFORMMATRIX_print(contents, blimit);
contents += sizeof(U_PMF_TRANSFORMMATRIX);
}
if(BDFlag & U_BD_PresetColors){ /* If this is present, BlendFactorsH will not be */
- contents += U_PMF_BLENDCOLORS_print(contents);
+ contents += U_PMF_BLENDCOLORS_print(contents, blimit);
}
if(BDFlag & U_BD_BlendFactorsH){/* If this is present, U_BD_PresetColors will not be */
- contents += U_PMF_BLENDFACTORS_print(contents,"");
+ contents += U_PMF_BLENDFACTORS_print(contents,"", blimit);
}
if(BDFlag & U_BD_FocusScales){
- contents += U_PMF_BLENDFACTORS_print(contents,"");
- U_PMF_FOCUSSCALEDATA_print(contents);
+ contents += U_PMF_BLENDFACTORS_print(contents,"", blimit);
+ U_PMF_FOCUSSCALEDATA_print(contents, blimit);
}
return(1);
}
@@ -1343,11 +1410,12 @@ int U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_print(const char *contents, int BDFlag){
\brief Print data from a U_PMF_PATHPOINTTYPE object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.31, Microsoft name: EmfPlusPathPointType Object
*/
-int U_PMF_PATHPOINTTYPE_print(const char *contents){
+int U_PMF_PATHPOINTTYPE_print(const char *contents, const char *blimit){
int Flags, Type;
- int status = U_PMF_PATHPOINTTYPE_get(contents, &Flags, &Type);
+ int status = U_PMF_PATHPOINTTYPE_get(contents, &Flags, &Type, blimit);
if(status){
printf("{Flags:%X Type:",Flags);
(void) U_PMF_PATHPOINTTYPE_ENUM_print(Type);
@@ -1360,11 +1428,12 @@ int U_PMF_PATHPOINTTYPE_print(const char *contents){
\brief Print data from a U_PMF_PATHPOINTTYPERLE object
\return Number of elements in the run, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.32, Microsoft name: EmfPlusPathPointTypeRLE Object
*/
-int U_PMF_PATHPOINTTYPERLE_print(const char *contents){
+int U_PMF_PATHPOINTTYPERLE_print(const char *contents, const char *blimit){
int Bezier, Elements, Type;
- int status = U_PMF_PATHPOINTTYPERLE_get(contents, &Bezier, &Elements, &Type);
+ int status = U_PMF_PATHPOINTTYPERLE_get(contents, &Bezier, &Elements, &Type, blimit);
if(status){
status = Elements;
printf(" PathPointTypeRLE: Bezier:%c Elements:%u, Type: ",(Bezier ? 'Y' : 'N'), Elements);
@@ -1378,16 +1447,17 @@ int U_PMF_PATHPOINTTYPERLE_print(const char *contents){
\brief Print data from a U_PMF_PATHPOINTTYPERLE object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.33, Microsoft name: EmfPlusPenData Object
*/
-int U_PMF_PENDATA_print(const char *contents){
+int U_PMF_PENDATA_print(const char *contents, const char *blimit){
uint32_t Flags, Unit;
U_FLOAT Width;
const char *Data;
- int status = U_PMF_PENDATA_get(contents, &Flags, &Unit, &Width, &Data);
+ int status = U_PMF_PENDATA_get(contents, &Flags, &Unit, &Width, &Data, blimit);
if(status){
printf(" + Pendata: Flags:%X Unit:%X Width:%f",Flags, Unit, Width);
- (void) U_PMF_PENOPTIONALDATA_print(Data, Flags); /* prints a new line at end */
+ (void) U_PMF_PENOPTIONALDATA_print(Data, Flags, blimit); /* prints a new line at end */
}
return(status);
}
@@ -1398,11 +1468,12 @@ int U_PMF_PENDATA_print(const char *contents){
\brief Print data from a U_PMF_PENOPTIONALDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
\param Flags PenData Flags that determine which optionaldata fields are present in the record.
EMF+ manual 2.2.2.34, Microsoft name: EmfPlusPenOptionalData Object
*/
-int U_PMF_PENOPTIONALDATA_print(const char *contents, int Flags){
+int U_PMF_PENOPTIONALDATA_print(const char *contents, int Flags, const char *blimit){
U_PMF_TRANSFORMMATRIX Matrix;
int32_t StartCap;
int32_t EndCap;
@@ -1431,7 +1502,8 @@ int U_PMF_PENOPTIONALDATA_print(const char *contents, int Flags){
&Alignment,
&CmpndLineData,
&CSCapData,
- &CECapData);
+ &CECapData,
+ blimit);
if(status){
if(Flags & U_PD_Transform){ (void) U_PMF_TRANSFORMMATRIX2_print(&Matrix);}
if(Flags & U_PD_StartCap){ printf(" StartCap:%d", StartCap );}
@@ -1441,14 +1513,14 @@ int U_PMF_PENOPTIONALDATA_print(const char *contents, int Flags){
if(Flags & U_PD_LineStyle){ printf(" Style:%X", Style );}
if(Flags & U_PD_DLCap){ printf(" DLCap:%X", DLCap );}
if(Flags & U_PD_DLOffset){ printf(" DLOffset:%f", DLOffset );}
- if(Flags & U_PD_DLData){ (void) U_PMF_DASHEDLINEDATA_print(DLData );}
+ if(Flags & U_PD_DLData){ (void) U_PMF_DASHEDLINEDATA_print(DLData, blimit );}
if(Flags & U_PD_NonCenter){ printf(" Alignment:%d", Alignment );}
if(Flags & (U_PD_Transform | U_PD_StartCap | U_PD_EndCap |
U_PD_Join | U_PD_MiterLimit | U_PD_LineStyle |
U_PD_DLCap | U_PD_DLOffset |U_PD_DLData |U_PD_NonCenter)){ printf("\n"); }
- if(Flags & U_PD_CLData){ (void) U_PMF_COMPOUNDLINEDATA_print(CmpndLineData); }
- if(Flags & U_PD_CustomStartCap){ (void) U_PMF_CUSTOMSTARTCAPDATA_print(CSCapData); }
- if(Flags & U_PD_CustomEndCap){ (void) U_PMF_CUSTOMENDCAPDATA_print(CECapData); }
+ if(Flags & U_PD_CLData){ (void) U_PMF_COMPOUNDLINEDATA_print(CmpndLineData, blimit); }
+ if(Flags & U_PD_CustomStartCap){ (void) U_PMF_CUSTOMSTARTCAPDATA_print(CSCapData, blimit); }
+ if(Flags & U_PD_CustomEndCap){ (void) U_PMF_CUSTOMENDCAPDATA_print(CECapData, blimit); }
}
return(status);
}
@@ -1456,11 +1528,12 @@ int U_PMF_PENOPTIONALDATA_print(const char *contents, int Flags){
\brief Print data from a U_PMF_POINT object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.35, Microsoft name: EmfPlusPoint Object
*/
-int U_PMF_POINT_print(const char **contents){
+int U_PMF_POINT_print(const char **contents, const char *blimit){
U_FLOAT X, Y;
- int status = U_PMF_POINT_get(contents, &X, &Y);
+ int status = U_PMF_POINT_get(contents, &X, &Y, blimit);
if(status){
printf("{%f,%f}", X, Y);
}
@@ -1483,11 +1556,12 @@ int U_PMF_POINT_S_print(U_PMF_POINT *Point){\
\brief Print data from a U_PMF_POINTF object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.36, Microsoft name: EmfPlusPointF Object
*/
-int U_PMF_POINTF_print(const char **contents){
+int U_PMF_POINTF_print(const char **contents, const char *blimit){
U_FLOAT X, Y;
- int status = U_PMF_POINTF_get(contents, &X, &Y);
+ int status = U_PMF_POINTF_get(contents, &X, &Y, blimit);
if(status){
printf("{%f,%f}", X, Y);
}
@@ -1512,6 +1586,7 @@ int U_PMF_POINTF_S_print(U_PMF_POINTF *Point){
\param contents Pointer to next data to print
\param Xpos X coordinate for current point
\param Ypos Y coordinate for current point
+ \param blimit one byte past the end of data
On each call the next relative offset is extracted, the current
coordinates are modified with that offset, and the pointer is
@@ -1519,9 +1594,9 @@ int U_PMF_POINTF_S_print(U_PMF_POINTF *Point){
EMF+ manual 2.2.2.37, Microsoft name: EmfPlusPointR Object
*/
-int U_PMF_POINTR_print(const char **contents, U_FLOAT *Xpos, U_FLOAT *Ypos){
+int U_PMF_POINTR_print(const char **contents, U_FLOAT *Xpos, U_FLOAT *Ypos, const char *blimit){
U_FLOAT X, Y;
- int status = U_PMF_POINTR_get(contents, &X, &Y);
+ int status = U_PMF_POINTR_get(contents, &X, &Y, blimit);
*Xpos += X;
*Ypos += Y;
if(status){
@@ -1534,11 +1609,12 @@ int U_PMF_POINTR_print(const char **contents, U_FLOAT *Xpos, U_FLOAT *Ypos){
\brief Print data from a U_PMF_RECT object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.38, Microsoft name: EmfPlusRect Object
*/
-int U_PMF_RECT_print(const char **contents){
+int U_PMF_RECT_print(const char **contents, const char *blimit){
int16_t X, Y, Width, Height;
- int status = U_PMF_RECT_get(contents, &X, &Y, &Width, &Height);
+ int status = U_PMF_RECT_get(contents, &X, &Y, &Width, &Height, blimit);
if(status){
printf("{UL{%d,%d},WH{%d,%d}}", X, Y, Width, Height);
}
@@ -1560,11 +1636,12 @@ int U_PMF_RECT_S_print(U_PMF_RECT *Rect){
\brief Print data from a U_PMF_RECTF object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.39, Microsoft name: EmfPlusRectF Object
*/
-int U_PMF_RECTF_print(const char **contents){
+int U_PMF_RECTF_print(const char **contents, const char *blimit){
U_FLOAT X, Y, Width, Height;
- int status = U_PMF_RECTF_get(contents, &X, &Y, &Width, &Height);
+ int status = U_PMF_RECTF_get(contents, &X, &Y, &Width, &Height, blimit);
if(status){
printf("{UL{%f,%f},WH{%f,%f}}", X, Y, Width, Height);
}
@@ -1587,27 +1664,28 @@ int U_PMF_RECTF_S_print(U_PMF_RECTF *Rect){
\return size on success, 0 on error
\param contents Record from which to print data
\param Level Tree level. This routine is recursive and could go down many levels. 1 is the top, >1 are child nodes.
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.40, Microsoft name: EmfPlusRegionNode Object
*/
-int U_PMF_REGIONNODE_print(const char *contents, int Level){
+int U_PMF_REGIONNODE_print(const char *contents, int Level, const char *blimit){
int len=4; /* Type will always be present */
uint32_t Type;
const char *Data;
- int status = U_PMF_REGIONNODE_get(contents, &Type, &Data);
+ int status = U_PMF_REGIONNODE_get(contents, &Type, &Data, blimit);
if(status){
printf("\n + RegionNode(Level:%d) { Type:%X(",Level,Type);
U_PMF_NODETYPE_print(Type);
printf(")");
if(Type >= U_RNDT_And && Type <= U_RNDT_Complement){
- len += U_PMF_REGIONNODECHILDNODES_print(Data, Level+1);
+ len += U_PMF_REGIONNODECHILDNODES_print(Data, Level+1, blimit);
}
else if(Type == U_RNDT_Rect){
len += sizeof(U_PMF_RECTF);
- (void) U_PMF_RECTF_print(&Data);
+ (void) U_PMF_RECTF_print(&Data, blimit);
printf("\n");
}
else if(Type == U_RNDT_Path){
- len += U_PMF_REGIONNODEPATH_print(Data);
+ len += U_PMF_REGIONNODEPATH_print(Data, blimit);
}
/* U_RNDT_Empty and U_RNDT_Infinite do not change the length */
else if(Type == U_RNDT_Empty ){ printf(" Empty" ); }
@@ -1624,18 +1702,19 @@ int U_PMF_REGIONNODE_print(const char *contents, int Level){
\return size on success, 0 on error
\param contents Record from which to print data
\param Level Tree level. This routine is recursive and could go down many levels. 1 is the top, >1 are child nodes.
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.41, Microsoft name: EmfPlusRegionNodeChildNodes Object
*/
-int U_PMF_REGIONNODECHILDNODES_print(const char *contents, int Level){
+int U_PMF_REGIONNODECHILDNODES_print(const char *contents, int Level, const char *blimit){
uint32_t size,rsize;
printf(" RegionNodeChildNodes:\n");
printf(" + RNCN__Left(Level:%d) {", Level);
- size = U_PMF_REGIONNODE_print(contents, Level);
+ size = U_PMF_REGIONNODE_print(contents, Level, blimit);
printf(" + RNCN__Left(Level:%d) },\n", Level);
if(size){
contents += size;
printf(" + RNCN_Right(Level:%d) {", Level);
- rsize = U_PMF_REGIONNODE_print(contents, Level);
+ rsize = U_PMF_REGIONNODE_print(contents, Level, blimit);
size += rsize;
printf(" + RNCN_Right(Level:%d) },\n",Level);
}
@@ -1646,15 +1725,16 @@ int U_PMF_REGIONNODECHILDNODES_print(const char *contents, int Level){
\brief Print data from a U_PMF_REGIONNODEPATH object
\return Size of data on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.42, Microsoft name: EmfPlusRegionNodePath Object
*/
-int U_PMF_REGIONNODEPATH_print(const char *contents){
+int U_PMF_REGIONNODEPATH_print(const char *contents, const char * blimit){
int32_t Size;
const char *Data;
- int status = U_PMF_REGIONNODEPATH_get(contents, &Size, &Data);
+ int status = U_PMF_REGIONNODEPATH_get(contents, &Size, &Data, blimit);
if(status){
printf(" RegionNodePath: \n");
- (void) U_PMF_PATH_print(Data);
+ (void) U_PMF_PATH_print(Data, blimit);
status = Size + 4; /* data sizee + the 4 bytes encoding the size */
}
return(status);
@@ -1665,11 +1745,12 @@ int U_PMF_REGIONNODEPATH_print(const char *contents){
\brief Print data from a U_PMF_SOLIDBRUSHDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.43, Microsoft name: EmfPlusSolidBrushData Object
*/
-int U_PMF_SOLIDBRUSHDATA_print(const char *contents){
+int U_PMF_SOLIDBRUSHDATA_print(const char *contents, const char *blimit){
U_PMF_ARGB Color;
- int status = U_PMF_SOLIDBRUSHDATA_get(contents, &Color);
+ int status = U_PMF_SOLIDBRUSHDATA_get(contents, &Color, blimit);
if(status){
printf(" SolidBrushData: ");
(void) U_PMF_ARGB_print((char *) &Color);
@@ -1683,12 +1764,13 @@ int U_PMF_SOLIDBRUSHDATA_print(const char *contents){
\param contents Record from which to print data
\param TabStopCount Entries in TabStop array
\param RangeCount Entries in CharRange array
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.44, Microsoft name: EmfPlusStringFormatData Object
*/
-int U_PMF_STRINGFORMATDATA_print(const char *contents, uint32_t TabStopCount, uint32_t RangeCount){
+int U_PMF_STRINGFORMATDATA_print(const char *contents, uint32_t TabStopCount, uint32_t RangeCount, const char *blimit){
const U_FLOAT *TabStops;
const U_PMF_CHARACTERRANGE *CharRange;
- int status = U_PMF_STRINGFORMATDATA_get(contents, TabStopCount, RangeCount, &TabStops, &CharRange);
+ int status = U_PMF_STRINGFORMATDATA_get(contents, TabStopCount, RangeCount, &TabStops, &CharRange, blimit);
if(status){
printf(" SFdata: TabStopCount:%u RangeCount:%u\n", TabStopCount, RangeCount);
@@ -1708,13 +1790,14 @@ int U_PMF_STRINGFORMATDATA_print(const char *contents, uint32_t TabStopCount, ui
\brief Print data from a U_PMF_TEXTUREBRUSHDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.45, Microsoft name: EmfPlusTextureBrushData Object
*/
-int U_PMF_TEXTUREBRUSHDATA_print(const char *contents){
+int U_PMF_TEXTUREBRUSHDATA_print(const char *contents, const char *blimit){
uint32_t Flags;
int32_t WrapMode;
const char *Data;
- int status = U_PMF_TEXTUREBRUSHDATA_get(contents, &Flags, &WrapMode, &Data);
+ int status = U_PMF_TEXTUREBRUSHDATA_get(contents, &Flags, &WrapMode, &Data, blimit);
if(status){
printf(" + TBdata: Flags:%X WrapMode:%d", Flags, WrapMode);
}
@@ -1725,18 +1808,23 @@ int U_PMF_TEXTUREBRUSHDATA_print(const char *contents){
\brief Print data from a U_PMF_TEXTUREBRUSHOPTIONALDATA object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param HasMatrix True if the record contains a matrix.
\param HasImage True if the record contains an image.
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.46, Microsoft name: EmfPlusTextureBrushOptionalData Object
*/
-int U_PMF_TEXTUREBRUSHOPTIONALDATA_print(const char *contents, int HasImage){
+int U_PMF_TEXTUREBRUSHOPTIONALDATA_print(const char *contents, int HasMatrix, int HasImage, const char *blimit){
U_PMF_TRANSFORMMATRIX Matrix;
+ U_PMF_TRANSFORMMATRIX *pMatrix;
const char *Image;
- int status = U_PMF_TEXTUREBRUSHOPTIONALDATA_get(contents, HasImage, &Matrix, &Image);
+ if(HasMatrix){ pMatrix = &Matrix; }
+ else { pMatrix = NULL; }
+ int status = U_PMF_TEXTUREBRUSHOPTIONALDATA_get(contents, HasImage, pMatrix, &Image, blimit);
if(status){
printf(" + TBOptdata: Image:%c", (HasImage ? 'Y' : 'N'));
(void) U_PMF_TRANSFORMMATRIX2_print(&Matrix);
- (void) U_PMF_IMAGE_print(Image);
+ (void) U_PMF_IMAGE_print(Image, blimit);
}
return(status);
}
@@ -1745,11 +1833,12 @@ int U_PMF_TEXTUREBRUSHOPTIONALDATA_print(const char *contents, int HasImage){
\brief Print data from a U_PMF_TRANSFORMMATRIX object stored in file byte order.
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.2.47, Microsoft name: EmfPlusTransformMatrix Object
*/
-int U_PMF_TRANSFORMMATRIX_print(const char *contents){
+int U_PMF_TRANSFORMMATRIX_print(const char *contents, const char *blimit){
U_PMF_TRANSFORMMATRIX Tm;
- int status = U_PMF_TRANSFORMMATRIX_get(contents, &Tm);
+ int status = U_PMF_TRANSFORMMATRIX_get(contents, &Tm, blimit);
if(status){
U_PMF_TRANSFORMMATRIX2_print(&Tm);
}
@@ -1782,12 +1871,13 @@ int U_PMF_ROTMATRIX2_print(U_PMF_ROTMATRIX *Rm){
\brief Print data from a U_PMF_IE_BLUR object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.1, Microsoft name: BlurEffect Object
*/
-int U_PMF_IE_BLUR_print(const char *contents){
+int U_PMF_IE_BLUR_print(const char *contents, const char *blimit){
U_FLOAT Radius;
uint32_t ExpandEdge;
- int status = U_PMF_IE_BLUR_get(contents, &Radius, &ExpandEdge);
+ int status = U_PMF_IE_BLUR_get(contents, &Radius, &ExpandEdge, blimit);
if(status){
printf("BlurEffect Radius:%f ExpandEdge:%u\n", Radius, ExpandEdge);
}
@@ -1798,11 +1888,12 @@ int U_PMF_IE_BLUR_print(const char *contents){
\brief Print data from a U_PMF_IE_BRIGHTNESSCONTRAST object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.2, Microsoft name: BrightnessContrastEffect Object
*/
-int U_PMF_IE_BRIGHTNESSCONTRAST_print(const char *contents){
+int U_PMF_IE_BRIGHTNESSCONTRAST_print(const char *contents, const char *blimit){
int32_t Brightness, Contrast;
- int status = U_PMF_IE_BRIGHTNESSCONTRAST_get(contents, &Brightness, &Contrast);
+ int status = U_PMF_IE_BRIGHTNESSCONTRAST_get(contents, &Brightness, &Contrast, blimit);
if(status){
printf("BrightnessContrastEffect Brightness:%d Contrast:%d\n", Brightness, Contrast);
}
@@ -1813,11 +1904,12 @@ int U_PMF_IE_BRIGHTNESSCONTRAST_print(const char *contents){
\brief Print data from a U_PMF_IE_COLORBALANCE object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.3, Microsoft name: ColorBalanceEffect Object
*/
-int U_PMF_IE_COLORBALANCE_print(const char *contents){
+int U_PMF_IE_COLORBALANCE_print(const char *contents, const char *blimit){
int32_t CyanRed, MagentaGreen, YellowBlue;
- int status = U_PMF_IE_COLORBALANCE_get(contents, &CyanRed, &MagentaGreen, &YellowBlue);
+ int status = U_PMF_IE_COLORBALANCE_get(contents, &CyanRed, &MagentaGreen, &YellowBlue, blimit);
if(status){
printf("ColorBalanceEffect CyanRed:%d MagentaGreen:%d YellowBlue:%d\n", CyanRed, MagentaGreen, YellowBlue);
}
@@ -1828,12 +1920,13 @@ int U_PMF_IE_COLORBALANCE_print(const char *contents){
\brief Print data from a U_PMF_IE_COLORCURVE object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.4, Microsoft name: ColorCurveEffect Object
*/
-int U_PMF_IE_COLORCURVE_print(const char *contents){
+int U_PMF_IE_COLORCURVE_print(const char *contents, const char *blimit){
uint32_t Adjust, Channel;
int32_t Intensity;
- int status = U_PMF_IE_COLORCURVE_get(contents, &Adjust, &Channel, &Intensity);
+ int status = U_PMF_IE_COLORCURVE_get(contents, &Adjust, &Channel, &Intensity, blimit);
if(status){
printf("ColorBalanceEffect Adjust:%u Channel:%u Intensity:%d\n", Adjust, Channel, Intensity);
}
@@ -1844,11 +1937,12 @@ int U_PMF_IE_COLORCURVE_print(const char *contents){
\brief Print data from a U_PMF_IE_COLORLOOKUPTABLE object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.5, Microsoft name: ColorLookupTableEffect Object
*/
-int U_PMF_IE_COLORLOOKUPTABLE_print(const char *contents){
+int U_PMF_IE_COLORLOOKUPTABLE_print(const char *contents, const char *blimit){
const uint8_t *BLUT, *GLUT, *RLUT, *ALUT;
- int status = U_PMF_IE_COLORLOOKUPTABLE_get(contents, &BLUT, &GLUT, &RLUT, &ALUT);
+ int status = U_PMF_IE_COLORLOOKUPTABLE_get(contents, &BLUT, &GLUT, &RLUT, &ALUT, blimit);
if(status){
printf("ColorLookupTableEffect \n");
U_PMF_UINT8_ARRAY_print(" BLUT:", BLUT, 256, "\n");
@@ -1863,12 +1957,13 @@ int U_PMF_IE_COLORLOOKUPTABLE_print(const char *contents){
\brief Print data from a U_PMF_IE_COLORMATRIX object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.6, Microsoft name: ColorMatrixEffect Object
*/
-int U_PMF_IE_COLORMATRIX_print(const char *contents){
+int U_PMF_IE_COLORMATRIX_print(const char *contents, const char *blimit){
U_PMF_IE_COLORMATRIX Matrix;
int i,j;
- int status = U_PMF_IE_COLORMATRIX_get(contents, &Matrix);
+ int status = U_PMF_IE_COLORMATRIX_get(contents, &Matrix, blimit);
if(status){
printf("ColorMatrixEffect\n");
for(i=0;i<5;i++){
@@ -1885,11 +1980,12 @@ int U_PMF_IE_COLORMATRIX_print(const char *contents){
\brief Print data from a U_PMF_IE_HUESATURATIONLIGHTNESS object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.7, Microsoft name: HueSaturationLightnessEffect Object
*/
-int U_PMF_IE_HUESATURATIONLIGHTNESS_print(const char *contents){
+int U_PMF_IE_HUESATURATIONLIGHTNESS_print(const char *contents, const char *blimit){
int32_t Hue, Saturation, Lightness;
- int status = U_PMF_IE_HUESATURATIONLIGHTNESS_get(contents, &Hue, &Saturation, &Lightness);
+ int status = U_PMF_IE_HUESATURATIONLIGHTNESS_get(contents, &Hue, &Saturation, &Lightness, blimit);
if(status){
printf("HueSaturationLightnessEffect Hue:%d Saturation:%d Lightness:%d\n", Hue, Saturation, Lightness);
}
@@ -1900,11 +1996,12 @@ int U_PMF_IE_HUESATURATIONLIGHTNESS_print(const char *contents){
\brief Print data from a U_PMF_IE_LEVELS object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.8, Microsoft name: LevelsEffect Object
*/
-int U_PMF_IE_LEVELS_print(const char *contents){
+int U_PMF_IE_LEVELS_print(const char *contents, const char *blimit){
int32_t Highlight, Midtone, Shadow;
- int status = U_PMF_IE_LEVELS_get(contents, &Highlight, &Midtone, &Shadow);
+ int status = U_PMF_IE_LEVELS_get(contents, &Highlight, &Midtone, &Shadow, blimit);
if(status){
printf("LevelEffect Highlight:%d Midtone:%d Shadow:%d\n", Highlight, Midtone, Shadow);
}
@@ -1915,12 +2012,13 @@ int U_PMF_IE_LEVELS_print(const char *contents){
\brief Print data from a U_PMF_IE_REDEYECORRECTION object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.9, Microsoft name: RedEyeCorrectionEffect Object
*/
-int U_PMF_IE_REDEYECORRECTION_print(const char *contents){
+int U_PMF_IE_REDEYECORRECTION_print(const char *contents, const char *blimit){
int32_t Elements;
U_RECTL *Rects;
- int status = U_PMF_IE_REDEYECORRECTION_get(contents, &Elements, &Rects);
+ int status = U_PMF_IE_REDEYECORRECTION_get(contents, &Elements, &Rects, blimit);
if(status){
printf("RedEyeCorrectionEffect Elements:%u", Elements);
for(; Elements; Elements--, Rects++){
@@ -1935,13 +2033,14 @@ int U_PMF_IE_REDEYECORRECTION_print(const char *contents){
/**
\brief Print data from a U_PMF_IE_SHARPEN object
\return 1 on success, 0 on error
+ \param blimit one byte past the end of data
\param contents Record from which to print data
EMF+ manual 2.2.3.10, Microsoft name: SharpenEffect Object
*/
-int U_PMF_IE_SHARPEN_print(const char *contents){
+int U_PMF_IE_SHARPEN_print(const char *contents, const char *blimit){
U_FLOAT Radius;
int32_t Sharpen;
- int status = U_PMF_IE_SHARPEN_get(contents, &Radius, &Sharpen);
+ int status = U_PMF_IE_SHARPEN_get(contents, &Radius, &Sharpen, blimit);
if(status){
printf("SharpenEffect Radius:%f Sharpen:%u\n", Radius, Sharpen);
}
@@ -1952,11 +2051,12 @@ int U_PMF_IE_SHARPEN_print(const char *contents){
\brief Print data from a U_PMF_IE_TINT object
\return 1 on success, 0 on error
\param contents Record from which to print data
+ \param blimit one byte past the end of data
EMF+ manual 2.2.3.11, Microsoft name: TintEffect Object
*/
-int U_PMF_IE_TINT_print(const char *contents){
+int U_PMF_IE_TINT_print(const char *contents, const char *blimit){
int32_t Hue, Amount;
- int status = U_PMF_IE_TINT_get(contents, &Hue, &Amount);
+ int status = U_PMF_IE_TINT_get(contents, &Hue, &Amount, blimit);
if(status){
printf("TintEffect Hue:%d Amount:%d\n", Hue, Amount);
}
@@ -1981,6 +2081,9 @@ int U_PMR_OFFSETCLIP_print(const char *contents){
if(status){
printf(" + dx:%f dy:%f\n",dX,dY);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2007,6 +2110,9 @@ int U_PMR_SETCLIPPATH_print(const char *contents){
if(status){
printf(" + PathID:%u CMenum:%d\n",PathID,CMenum);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2027,6 +2133,9 @@ int U_PMR_SETCLIPRECT_print(const char *contents){
U_PMF_RECTF_S_print(&Rect);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2045,6 +2154,9 @@ int U_PMR_SETCLIPREGION_print(const char *contents){
U_PMF_COMBINEMODEENUMERATION_print(CMenum);
printf(")\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2061,6 +2173,11 @@ int U_PMR_COMMENT_print(const char *contents){
unsigned int i=0;
int status = U_PMR_COMMENT_get(contents, &Header, &Data);
if(status){
+ const char *blimit = contents + Header.Size;
+ if(IS_MEM_UNSAFE(Data, Header.DataSize, blimit)){
+ printf(" corrupt record\n");
+ return(0);
+ }
/* try to print it, but only ASCII, bail on anything that is not ASCII */
printf(" + Data:");
for(i=0; i< Header.DataSize; i++,Data++){
@@ -2070,6 +2187,9 @@ int U_PMR_COMMENT_print(const char *contents){
}
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2107,9 +2227,12 @@ int U_PMR_HEADER_print(const char *contents){
if(status){
/* try to print it, but only ASCII, bail on anything that is not ASCII */
printf(" + ");
- (void) U_PMF_GRAPHICSVERSION_print((char *) &Version);
+ (void) U_PMF_GRAPHICSVERSION_memsafe_print((char *)&Version);;
printf(" IsDual:%c IsVideo:%d LogicalDpiX,y:{%u,%u}\n",(IsDual ? 'Y' : 'N'),IsVideo,LogicalDpiX, LogicalDpiY);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2127,6 +2250,9 @@ int U_PMR_CLEAR_print(const char *contents){
printf(" + Color:");
(void) U_PMF_ARGB_print((char *) &Color);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2147,6 +2273,9 @@ int U_PMR_DRAWARC_print(const char *contents){
(void) U_PMF_VARRECTF_S_print(&Rect, 1);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2167,6 +2296,9 @@ int U_PMR_DRAWBEZIERS_print(const char *contents){
U_PMF_VARPOINTF_S_print(Points, Elements);
free(Points);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2194,6 +2326,9 @@ int U_PMR_DRAWCLOSEDCURVE_print(const char *contents){
U_PMF_VARPOINTF_S_print(Points, Elements);
free(Points);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2221,6 +2356,9 @@ int U_PMR_DRAWCURVE_print(const char *contents){
U_PMF_VARPOINTF_S_print(Points, Elements);
free(Points);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2269,7 +2407,9 @@ int U_PMR_DRAWDRIVERSTRING_print(const char *contents){
free(Matrix);
printf("\n");
}
-
+ }
+ else {
+ printf(" corrupt record\n");
}
return(status);
}
@@ -2290,6 +2430,9 @@ int U_PMR_DRAWELLIPSE_print(const char *contents){
(void) U_PMF_VARRECTF_S_print(&Rect, 1);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2313,6 +2456,9 @@ int U_PMR_DRAWIMAGE_print(const char *contents){
(void) U_PMF_RECTF_S_print(&DstRect);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2339,6 +2485,9 @@ int U_PMR_DRAWIMAGEPOINTS_print(const char *contents){
U_PMF_VARPOINTF_S_print(Points, Elements);
free(Points);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2360,6 +2509,9 @@ int U_PMR_DRAWLINES_print(const char *contents){
U_PMF_VARPOINTF_S_print(Points, Elements);
free(Points);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2375,6 +2527,9 @@ int U_PMR_DRAWPATH_print(const char *contents){
if(status){
printf(" + PathIdx:%d PenIdx:%d\n", PathIdx, PenIdx);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2395,6 +2550,9 @@ int U_PMR_DRAWPIE_print(const char *contents){
(void) U_PMF_VARRECTF_S_print(&Rect, 1);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2402,10 +2560,9 @@ int U_PMR_DRAWPIE_print(const char *contents){
\brief Print data from a U_PMR_DRAWRECTS record
\return size of record in bytes on success, 0 on error
\param contents Record from which to print data
- \param blimit One byte past the last record in memory.
EMF+ manual 2.3.4.13, Microsoft name: EmfPlusDrawRects Record, Index 0x0B
*/
-int U_PMR_DRAWRECTS_print(const char *contents, const char *blimit){
+int U_PMR_DRAWRECTS_print(const char *contents){
uint32_t PenID;
int ctype;
uint32_t Elements;
@@ -2413,11 +2570,13 @@ int U_PMR_DRAWRECTS_print(const char *contents, const char *blimit){
U_PMF_CMN_HDR hdr;
int status = U_PMR_DRAWRECTS_get(contents, &hdr, &PenID, &ctype, &Elements, &Rects);
if(status){
- if(contents + hdr.Size >= blimit)return(0);
printf(" + PenID:%u ctype:%d Elements:%u Rect:", PenID,ctype,Elements);
(void) U_PMF_VARRECTF_S_print(Rects, Elements);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
if(Rects)free(Rects);
return(status);
}
@@ -2452,6 +2611,9 @@ int U_PMR_DRAWSTRING_print(const char *contents){
printf(" String(as_UTF8):(none)\n");
}
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2477,6 +2639,9 @@ int U_PMR_FILLCLOSEDCURVE_print(const char *contents){
U_PMF_VARPOINTF_S_print(Points, Elements);
free(Points);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2498,6 +2663,9 @@ int U_PMR_FILLELLIPSE_print(const char *contents){
(void) U_PMF_VARRECTF_S_print(&Rect, 1);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2516,6 +2684,9 @@ int U_PMR_FILLPATH_print(const char *contents){
(void) U_PMF_VARBRUSHID_print(btype, BrushID);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2537,6 +2708,9 @@ int U_PMR_FILLPIE_print(const char *contents){
(void) U_PMF_VARRECTF_S_print(&Rect, 1);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2558,6 +2732,9 @@ int U_PMR_FILLPOLYGON_print(const char *contents){
U_PMF_VARPOINTF_S_print(Points, Elements);
free(Points);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2565,23 +2742,24 @@ int U_PMR_FILLPOLYGON_print(const char *contents){
\brief Print data from a U_PMR_FILLRECTS record
\return size of record in bytes on success, 0 on error
\param contents Record from which to print data
- \param blimit One byte past the last record in memory.
EMF+ manual 2.3.4.20, Microsoft name: EmfPlusFillRects Record, Index 0x0A
*/
-int U_PMR_FILLRECTS_print(const char *contents, const char *blimit){
+int U_PMR_FILLRECTS_print(const char *contents){
int btype, ctype;
uint32_t BrushID, Elements;
U_PMF_RECTF *Rects;
U_PMF_CMN_HDR hdr;
int status = U_PMR_FILLRECTS_get(contents, &hdr, &btype,&ctype, &BrushID, &Elements, &Rects);
if(status){
- if(contents + hdr.Size >= blimit)return(0);
printf(" + btype:%d ctype:%d Elements:%u",btype,ctype,Elements);
(void) U_PMF_VARBRUSHID_print(btype, BrushID);
(void) U_PMF_VARRECTF_S_print(Rects, Elements);
free(Rects);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2600,6 +2778,9 @@ int U_PMR_FILLREGION_print(const char *contents){
(void) U_PMF_VARBRUSHID_print(btype, BrushID);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2611,6 +2792,10 @@ int U_PMR_FILLREGION_print(const char *contents){
\param ObjCont Structure that holds accumulated object.
\param term Flag used when an abnormal termination of a series of continuation records is encountered.
EMF+ manual 2.3.5.1, Microsoft name: EmfPlusObject Record, Index 0x13
+
+ This is the ONLY EMF+ record type which needs an explicit blimit passed in. Since it glues
+ together multiple records, and calls itself recursively, the initial caller cannot determine
+ that all of the sizes will be OK from the first record's header.
*/
int U_PMR_OBJECT_print(const char *contents, const char *blimit, U_OBJ_ACCUM *ObjCont, int term){
U_PMF_CMN_HDR Header;
@@ -2641,8 +2826,11 @@ int U_PMR_OBJECT_print(const char *contents, const char *blimit, U_OBJ_ACCUM *Ob
/* In a corrupt EMF+ file we might hit a new type of record before all the continuation records
expected have been found. If that happens terminate whatever we have accumulated so far, and then go on
to emit the new (unexpected) record. */
- if(contents + Header.Size >= blimit)return(0);
- if(!status)return(status);
+ if(IS_MEM_UNSAFE(contents, Header.Size, blimit))return(0);
+ if(!status){
+ printf(" corrupt record\n");
+ return(status);
+ }
if((ObjCont->used > 0) && (U_OA_append(ObjCont, NULL, 0, otype, ObjID) < 0)){
U_PMR_OBJECT_print(contents, blimit, ObjCont, 1);
}
@@ -2665,16 +2853,17 @@ int U_PMR_OBJECT_print(const char *contents, const char *blimit, U_OBJ_ACCUM *Ob
ttype = otype;
}
if(status){
+ blimit = ObjCont->accum + ObjCont->used; /* more restrictive blimit, just to end of object */
switch(ttype){
- case U_OT_Brush: (void) U_PMF_BRUSH_print(ObjCont->accum); break;
- case U_OT_Pen: (void) U_PMF_PEN_print(ObjCont->accum); break;
- case U_OT_Path: (void) U_PMF_PATH_print(ObjCont->accum); break;
- case U_OT_Region: (void) U_PMF_REGION_print(ObjCont->accum); break;
- case U_OT_Image: (void) U_PMF_IMAGE_print(ObjCont->accum); break;
- case U_OT_Font: (void) U_PMF_FONT_print(ObjCont->accum); break;
- case U_OT_StringFormat: (void) U_PMF_STRINGFORMAT_print(ObjCont->accum); break;
- case U_OT_ImageAttributes: (void) U_PMF_IMAGEATTRIBUTES_print(ObjCont->accum); break;
- case U_OT_CustomLineCap: (void) U_PMF_CUSTOMLINECAP_print(ObjCont->accum,""); break;
+ case U_OT_Brush: (void) U_PMF_BRUSH_print(ObjCont->accum, blimit); break;
+ case U_OT_Pen: (void) U_PMF_PEN_print(ObjCont->accum, blimit); break;
+ case U_OT_Path: (void) U_PMF_PATH_print(ObjCont->accum, blimit); break;
+ case U_OT_Region: (void) U_PMF_REGION_print(ObjCont->accum, blimit); break;
+ case U_OT_Image: (void) U_PMF_IMAGE_print(ObjCont->accum, blimit); break;
+ case U_OT_Font: (void) U_PMF_FONT_print(ObjCont->accum, blimit); break;
+ case U_OT_StringFormat: (void) U_PMF_STRINGFORMAT_print(ObjCont->accum, blimit); break;
+ case U_OT_ImageAttributes: (void) U_PMF_IMAGEATTRIBUTES_print(ObjCont->accum, blimit); break;
+ case U_OT_CustomLineCap: (void) U_PMF_CUSTOMLINECAP_print(ObjCont->accum,"", blimit); break;
case U_OT_Invalid:
default:
printf("INVALID OBJECT TYPE!!!!\n");
@@ -2707,24 +2896,27 @@ int U_PMR_SERIALIZABLEOBJECT_print(const char *contents){
printf("\n + Effect:");
free(string);
switch(iee){
- case U_IEE_Unknown: printf("(undefined)\n"); break;
- case U_IEE_BlurEffectGuid: U_PMF_IE_BLUR_print(Data); break;
- case U_IEE_BrightnessContrastEffectGuid: U_PMF_IE_BRIGHTNESSCONTRAST_print(Data); break;
- case U_IEE_ColorBalanceEffectGuid: U_PMF_IE_COLORBALANCE_print(Data); break;
- case U_IEE_ColorCurveEffectGuid: U_PMF_IE_COLORCURVE_print(Data); break;
- case U_IEE_ColorLookupTableEffectGuid: U_PMF_IE_COLORLOOKUPTABLE_print(Data); break;
- case U_IEE_ColorMatrixEffectGuid: U_PMF_IE_COLORMATRIX_print(Data); break;
- case U_IEE_HueSaturationLightnessEffectGuid: U_PMF_IE_HUESATURATIONLIGHTNESS_print(Data); break;
- case U_IEE_LevelsEffectGuid: U_PMF_IE_LEVELS_print(Data); break;
- case U_IEE_RedEyeCorrectionEffectGuid: U_PMF_IE_REDEYECORRECTION_print(Data); break;
- case U_IEE_SharpenEffectGuid: U_PMF_IE_SHARPEN_print(Data); break;
- case U_IEE_TintEffectGuid: U_PMF_IE_TINT_print(Data); break;
+ case U_IEE_Unknown: printf("(undefined)\n"); break;
+ case U_IEE_BlurEffectGuid: U_PMF_IE_BLUR_print(Data, Data + sizeof(U_PMF_IE_BLUR)); break;
+ case U_IEE_BrightnessContrastEffectGuid: U_PMF_IE_BRIGHTNESSCONTRAST_print(Data, Data + sizeof(U_PMF_IE_BRIGHTNESSCONTRAST)); break;
+ case U_IEE_ColorBalanceEffectGuid: U_PMF_IE_COLORBALANCE_print(Data, Data + sizeof(U_PMF_IE_COLORBALANCE)); break;
+ case U_IEE_ColorCurveEffectGuid: U_PMF_IE_COLORCURVE_print(Data, Data + sizeof(U_PMF_IE_COLORCURVE)); break;
+ case U_IEE_ColorLookupTableEffectGuid: U_PMF_IE_COLORLOOKUPTABLE_print(Data, Data + sizeof(U_PMF_IE_COLORLOOKUPTABLE)); break;
+ case U_IEE_ColorMatrixEffectGuid: U_PMF_IE_COLORMATRIX_print(Data, Data + sizeof(U_PMF_IE_COLORMATRIX)); break;
+ case U_IEE_HueSaturationLightnessEffectGuid: U_PMF_IE_HUESATURATIONLIGHTNESS_print(Data, Data + sizeof(U_PMF_IE_HUESATURATIONLIGHTNESS)); break;
+ case U_IEE_LevelsEffectGuid: U_PMF_IE_LEVELS_print(Data, Data + sizeof(U_PMF_IE_LEVELS)); break;
+ case U_IEE_RedEyeCorrectionEffectGuid: U_PMF_IE_REDEYECORRECTION_print(Data, Data + sizeof(U_PMF_IE_REDEYECORRECTION)); break;
+ case U_IEE_SharpenEffectGuid: U_PMF_IE_SHARPEN_print(Data, Data + sizeof(U_PMF_IE_SHARPEN)); break;
+ case U_IEE_TintEffectGuid: U_PMF_IE_TINT_print(Data, Data + sizeof(U_PMF_IE_TINT)); break;
}
}
else {
printf(" + GUID:ERROR Size:%u\n",Size);
}
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2740,6 +2932,9 @@ int U_PMR_SETANTIALIASMODE_print(const char *contents){
if(status){
printf(" + SMenum:%d AntiAlias:%c\n",SMenum,(aatype ? 'Y' : 'N'));
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2755,6 +2950,9 @@ int U_PMR_SETCOMPOSITINGMODE_print(const char *contents){
if(status){
printf(" + CMenum:%d\n",CMenum);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2770,6 +2968,9 @@ int U_PMR_SETCOMPOSITINGQUALITY_print(const char *contents){
if(status){
printf(" + CQenum:%d\n",CQenum);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2785,6 +2986,9 @@ int U_PMR_SETINTERPOLATIONMODE_print(const char *contents){
if(status){
printf(" + IMenum:%d\n",IMenum);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2800,6 +3004,9 @@ int U_PMR_SETPIXELOFFSETMODE_print(const char *contents){
if(status){
printf(" + POMenum:%d\n",POMenum);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2815,6 +3022,9 @@ int U_PMR_SETRENDERINGORIGIN_print(const char *contents){
if(status){
printf(" + X:%d Y:%d\n", X, Y);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2830,6 +3040,9 @@ int U_PMR_SETTEXTCONTRAST_print(const char *contents){
if(status){
printf(" + GC:%d\n", GC);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2845,6 +3058,9 @@ int U_PMR_SETTEXTRENDERINGHINT_print(const char *contents){
if(status){
printf(" + TRHenum:%d\n",TRHenum);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2865,6 +3081,9 @@ int U_PMR_BEGINCONTAINER_print(const char *contents){
printf(" SrcRect:"); (void) U_PMF_RECTF_S_print(&SrcRect);
printf(" StackID:%u\n", StackID);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2880,6 +3099,9 @@ int U_PMR_BEGINCONTAINERNOPARAMS_print(const char *contents){
if(status){
printf(" + StackID:%u\n", StackID);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2895,6 +3117,9 @@ int U_PMR_ENDCONTAINER_print(const char *contents){
if(status){
printf(" + StackID:%u\n", StackID);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2910,6 +3135,9 @@ int U_PMR_RESTORE_print(const char *contents){
if(status){
printf(" + StackID:%u\n", StackID);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2925,6 +3153,9 @@ int U_PMR_SAVE_print(const char *contents){
if(status){
printf(" + StackID:%u\n", StackID);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2945,6 +3176,9 @@ int U_PMR_SETTSCLIP_print(const char *contents){
free(Rects);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2967,6 +3201,7 @@ int U_PMR_SETTSGRAPHICS_print(const char *contents){
&RenderOriginX, &RenderOriginY, &TextContrast, &FilterType,
&PixelOffset, &WorldToDevice, &Data);
if(status){
+ const char *blimit = contents + status;
printf(" + vgatype:%d pptype:%u",vgatype,pptype);
printf(" AntiAliasMode:%u TextRenderHint:%u CompositingMode:%u CompositingQuality:%u",
AntiAliasMode, TextRenderHint, CompositingMode, CompositingQuality);
@@ -2974,9 +3209,12 @@ int U_PMR_SETTSGRAPHICS_print(const char *contents){
printf(" TextContrast:%u",TextContrast);
printf(" WorldToDevice:");
U_PMF_TRANSFORMMATRIX2_print(&WorldToDevice);
- if(pptype){ (void) U_PMF_PALETTE_print(Data); }
+ if(pptype && !U_PMF_PALETTE_print(Data, blimit))return(0);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -2996,6 +3234,9 @@ int U_PMR_MULTIPLYWORLDTRANSFORM_print(const char *contents){
U_PMF_TRANSFORMMATRIX2_print(&Matrix);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -3022,6 +3263,9 @@ int U_PMR_ROTATEWORLDTRANSFORM_print(const char *contents){
if(status){
printf(" + xmtype:%d Multiply:%s Angle:%f\n",xmtype,(xmtype ? "Post" : "Pre"), Angle);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -3038,6 +3282,9 @@ int U_PMR_SCALEWORLDTRANSFORM_print(const char *contents){
if(status){
printf(" + xmtype:%d Multiply:%s ScaleX:%f ScaleY:%f\n",xmtype,(xmtype ? "Post" : "Pre"), Sx, Sy);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -3054,6 +3301,9 @@ int U_PMR_SETPAGETRANSFORM_print(const char *contents){
if(status){
printf(" + UTenum:%d Scale:%f\n",UTenum, Scale);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -3071,6 +3321,9 @@ int U_PMR_SETWORLDTRANSFORM_print(const char *contents){
U_PMF_TRANSFORMMATRIX2_print(&Matrix);
printf("\n");
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
@@ -3087,6 +3340,9 @@ int U_PMR_TRANSLATEWORLDTRANSFORM_print(const char *contents){
if(status){
printf(" + xmtype:%d Multiply:%s TranslateX:%f TranlateY:%f\n",xmtype,(xmtype ? "Post" : "Pre"), Dx, Dy);
}
+ else {
+ printf(" corrupt record\n");
+ }
return(status);
}
diff --git a/src/libuemf/upmf_print.h b/src/libuemf/upmf_print.h
index 3ba6694eb..fe1c57d60 100644
--- a/src/libuemf/upmf_print.h
+++ b/src/libuemf/upmf_print.h
@@ -6,11 +6,11 @@
/*
File: upmf_print.h
-Version: 0.0.2
-Date: 17-OCT-2013
+Version: 0.0.4
+Date: 24-MAR-2015
Author: David Mathog, Biology Division, Caltech
email: mathog@caltech.edu
-Copyright: 2013 David Mathog and California Institute of Technology (Caltech)
+Copyright: 2015 David Mathog and California Institute of Technology (Caltech)
*/
#ifndef _UPMF_PRINT_
@@ -33,77 +33,78 @@ int U_PMF_PX_FMT_ENUM_print(int pfe);
int U_PMF_NODETYPE_print(int Type);
/* prototypes for objects used in PMR records */
-int U_PMF_BRUSH_print(const char *contents);
-int U_PMF_CUSTOMLINECAP_print(const char *contents, const char *Which);
-int U_PMF_FONT_print(const char *contents);
-int U_PMF_IMAGE_print(const char *contents);
-int U_PMF_IMAGEATTRIBUTES_print(const char *contents);
-int U_PMF_PATH_print(const char *contents);
-int U_PMF_PEN_print(const char *contents);
-int U_PMF_REGION_print(const char *contents);
-int U_PMF_STRINGFORMAT_print(const char *contents);
+int U_PMF_BRUSH_print(const char *contents, const char *blimit);
+int U_PMF_CUSTOMLINECAP_print(const char *contents, const char *Which, const char *blimit);
+int U_PMF_FONT_print(const char *contents, const char *blimit);
+int U_PMF_IMAGE_print(const char *contents, const char *blimit);
+int U_PMF_IMAGEATTRIBUTES_print(const char *contents, const char *blimit);
+int U_PMF_PATH_print(const char *contents, const char *blimit);
+int U_PMF_PEN_print(const char *contents, const char *blimit);
+int U_PMF_REGION_print(const char *contents, const char *blimit);
+int U_PMF_STRINGFORMAT_print(const char *contents, const char *blimit);
int U_PMF_ARGB_print(const char *contents);
-int U_PMF_BITMAP_print(const char *contents);
-int U_PMF_BITMAPDATA_print(const char *contents);
-int U_PMF_BLENDCOLORS_print(const char *contents);
-int U_PMF_BLENDFACTORS_print(const char *contents, const char *type);
-int U_PMF_BOUNDARYPATHDATA_print(const char *contents);
-int U_PMF_BOUNDARYPOINTDATA_print(const char *contents);
-int U_PMF_CHARACTERRANGE_print(const char *contents);
-int U_PMF_COMPOUNDLINEDATA_print(const char *contents);
-int U_PMF_COMPRESSEDIMAGE_print(const char *contents);
-int U_PMF_CUSTOMENDCAPDATA_print(const char *contents);
-int U_PMF_CUSTOMLINECAPARROWDATA_print(const char *contents);
-int U_PMF_CUSTOMLINECAPDATA_print(const char *contents);
-int U_PMF_CUSTOMLINECAPOPTIONALDATA_print(const char *contents, uint32_t Flags);
-int U_PMF_CUSTOMSTARTCAPDATA_print(const char *contents);
-int U_PMF_DASHEDLINEDATA_print(const char *contents);
-int U_PMF_FILLPATHOBJ_print(const char *contents);
-int U_PMF_FOCUSSCALEDATA_print(const char *contents);
-int U_PMF_GRAPHICSVERSION_print(const char *contents);
-int U_PMF_HATCHBRUSHDATA_print(const char *contents);
+int U_PMF_BITMAP_print(const char *contents, const char *blimit);
+int U_PMF_BITMAPDATA_print(const char *contents, const char *blimit);
+int U_PMF_BLENDCOLORS_print(const char *contents, const char *blimit);
+int U_PMF_BLENDFACTORS_print(const char *contents, const char *type, const char *blimit);
+int U_PMF_BOUNDARYPATHDATA_print(const char *contents, const char *blimit);
+int U_PMF_BOUNDARYPOINTDATA_print(const char *contents, const char *blimit);
+int U_PMF_CHARACTERRANGE_print(const char *contents, const char *blimit);
+int U_PMF_COMPOUNDLINEDATA_print(const char *contents, const char *blimit);
+int U_PMF_COMPRESSEDIMAGE_print(const char *contents, const char *blimit);
+int U_PMF_CUSTOMENDCAPDATA_print(const char *contents, const char *blimit);
+int U_PMF_CUSTOMLINECAPARROWDATA_print(const char *contents, const char *blimit);
+int U_PMF_CUSTOMLINECAPDATA_print(const char *contents, const char *blimit);
+int U_PMF_CUSTOMLINECAPOPTIONALDATA_print(const char *contents, uint32_t Flags, const char *blimit);
+int U_PMF_CUSTOMSTARTCAPDATA_print(const char *contents, const char *blimit);
+int U_PMF_DASHEDLINEDATA_print(const char *contents, const char *blimit);
+int U_PMF_FILLPATHOBJ_print(const char *contents, const char *blimit);
+int U_PMF_FOCUSSCALEDATA_print(const char *contents, const char *blimit);
+int U_PMF_GRAPHICSVERSION_memsafe_print(const char *contents);
+int U_PMF_GRAPHICSVERSION_print(const char *contents, const char *blimit);
+int U_PMF_HATCHBRUSHDATA_print(const char *contents, const char *blimit);
int U_PMF_LANGUAGEIDENTIFIER_print(U_PMF_LANGUAGEIDENTIFIER LId);
-int U_PMF_LINEARGRADIENTBRUSHDATA_print(const char *contents);
-int U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_print(const char *contents, int BDFlag);
-int U_PMF_LINEPATH_print(const char *contents);
-int U_PMF_METAFILE_print(const char *contents);
-int U_PMF_PALETTE_print(const char *contents);
-int U_PMF_PATHGRADIENTBRUSHDATA_print(const char *contents);
-int U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_print(const char *contents, int BDFlag);
-int U_PMF_PATHPOINTTYPE_print(const char *contents);
-int U_PMF_PATHPOINTTYPERLE_print(const char *contents);
-int U_PMF_PENDATA_print(const char *contents);
-int U_PMF_PENOPTIONALDATA_print(const char *contents, int Flags);
-int U_PMF_POINT_print(const char **contents);
-int U_PMF_POINTF_print(const char **contents);
-int U_PMF_POINTR_print(const char **contents, U_FLOAT *Xpos, U_FLOAT *Ypos);
+int U_PMF_LINEARGRADIENTBRUSHDATA_print(const char *contents, const char *blimit);
+int U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_print(const char *contents, int BDFlag, const char *blimit);
+int U_PMF_LINEPATH_print(const char *contents, const char *blimit);
+int U_PMF_METAFILE_print(const char *contents, const char *blimit);
+int U_PMF_PALETTE_print(const char *contents, const char *blimit);
+int U_PMF_PATHGRADIENTBRUSHDATA_print(const char *contents, const char *blimit);
+int U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_print(const char *contents, int BDFlag, const char *blimit);
+int U_PMF_PATHPOINTTYPE_print(const char *contents, const char *blimit);
+int U_PMF_PATHPOINTTYPERLE_print(const char *contents, const char *blimit);
+int U_PMF_PENDATA_print(const char *contents, const char *blimit);
+int U_PMF_PENOPTIONALDATA_print(const char *contents, int Flags, const char *blimit);
+int U_PMF_POINT_print(const char **contents, const char *blimit);
+int U_PMF_POINTF_print(const char **contents, const char *blimit);
+int U_PMF_POINTR_print(const char **contents, U_FLOAT *Xpos, U_FLOAT *Ypos, const char *blimit);
int U_PMF_POINT_S_print(U_PMF_POINT *Point);
int U_PMF_POINTF_S_print(U_PMF_POINTF *Point);
-int U_PMF_RECT_print(const char **contents);
-int U_PMF_RECTF_print(const char **contents);
+int U_PMF_RECT_print(const char **contents, const char *blimit);
+int U_PMF_RECTF_print(const char **contents, const char *blimit);
int U_PMF_RECT_S_print(U_PMF_RECT *Rect);
int U_PMF_RECTF_S_print(U_PMF_RECTF *Rect);
-int U_PMF_REGIONNODE_print(const char *contents, int Level);
-int U_PMF_REGIONNODECHILDNODES_print(const char *contents, int Level);
-int U_PMF_REGIONNODEPATH_print(const char *contents);
-int U_PMF_SOLIDBRUSHDATA_print(const char *contents);
-int U_PMF_STRINGFORMATDATA_print(const char *contents, uint32_t TabStopCount, uint32_t RangeCount);
-int U_PMF_TEXTUREBRUSHDATA_print(const char *contents);
-int U_PMF_TEXTUREBRUSHOPTIONALDATA_print(const char *contents, int HasImage);
-int U_PMF_TRANSFORMMATRIX_print(const char *contents);
+int U_PMF_REGIONNODE_print(const char *contents, int Level, const char *blimit);
+int U_PMF_REGIONNODECHILDNODES_print(const char *contents, int Level, const char *blimit);
+int U_PMF_REGIONNODEPATH_print(const char *contents, const char *blimit);
+int U_PMF_SOLIDBRUSHDATA_print(const char *contents, const char *blimit);
+int U_PMF_STRINGFORMATDATA_print(const char *contents, uint32_t TabStopCount, uint32_t RangeCount, const char *blimit);
+int U_PMF_TEXTUREBRUSHDATA_print(const char *contents, const char *blimit);
+int U_PMF_TEXTUREBRUSHOPTIONALDATA_print(const char *contents, int HasMatrix, int HasImage, const char *blimit);
+int U_PMF_TRANSFORMMATRIX_print(const char *contents, const char *blimit);
int U_PMF_TRANSFORMMATRIX2_print(U_PMF_TRANSFORMMATRIX *Matrix);
int U_PMF_ROTMATRIX2_print(U_PMF_ROTMATRIX *Matrix);
-int U_PMF_IE_BLUR_print(const char *contents);
-int U_PMF_IE_BRIGHTNESSCONTRAST_print(const char *contents);
-int U_PMF_IE_COLORBALANCE_print(const char *contents);
-int U_PMF_IE_COLORCURVE_print(const char *contents);
-int U_PMF_IE_COLORLOOKUPTABLE_print(const char *contents);
-int U_PMF_IE_COLORMATRIX_print(const char *contents);
-int U_PMF_IE_HUESATURATIONLIGHTNESS_print(const char *contents);
-int U_PMF_IE_LEVELS_print(const char *contents);
-int U_PMF_IE_REDEYECORRECTION_print(const char *contents);
-int U_PMF_IE_SHARPEN_print(const char *contents);
-int U_PMF_IE_TINT_print(const char *contents);
+int U_PMF_IE_BLUR_print(const char *contents, const char *blimit);
+int U_PMF_IE_BRIGHTNESSCONTRAST_print(const char *contents, const char *blimit);
+int U_PMF_IE_COLORBALANCE_print(const char *contents, const char *blimit);
+int U_PMF_IE_COLORCURVE_print(const char *contents, const char *blimit);
+int U_PMF_IE_COLORLOOKUPTABLE_print(const char *contents, const char *blimit);
+int U_PMF_IE_COLORMATRIX_print(const char *contents, const char *blimit);
+int U_PMF_IE_HUESATURATIONLIGHTNESS_print(const char *contents, const char *blimit);
+int U_PMF_IE_LEVELS_print(const char *contents, const char *blimit);
+int U_PMF_IE_REDEYECORRECTION_print(const char *contents, const char *blimit);
+int U_PMF_IE_SHARPEN_print(const char *contents, const char *blimit);
+int U_PMF_IE_TINT_print(const char *contents, const char *blimit);
/* prototypes for PMR records */
int U_PMR_OFFSETCLIP_print(const char *contents);
@@ -127,14 +128,14 @@ int U_PMR_DRAWIMAGEPOINTS_print(const char *contents);
int U_PMR_DRAWLINES_print(const char *contents);
int U_PMR_DRAWPATH_print(const char *contents);
int U_PMR_DRAWPIE_print(const char *contents);
-int U_PMR_DRAWRECTS_print(const char *contents, const char *blimit);
+int U_PMR_DRAWRECTS_print(const char *contents);
int U_PMR_DRAWSTRING_print(const char *contents);
int U_PMR_FILLCLOSEDCURVE_print(const char *contents);
int U_PMR_FILLELLIPSE_print(const char *contents);
int U_PMR_FILLPATH_print(const char *contents);
int U_PMR_FILLPIE_print(const char *contents);
int U_PMR_FILLPOLYGON_print(const char *contents);
-int U_PMR_FILLRECTS_print(const char *contents, const char *blimit);
+int U_PMR_FILLRECTS_print(const char *contents);
int U_PMR_FILLREGION_print(const char *contents);
int U_PMR_OBJECT_print(const char *contents, const char *blimit, U_OBJ_ACCUM *ObjCont, int term);
int U_PMR_SERIALIZABLEOBJECT_print(const char *contents);
diff --git a/src/libuemf/uwmf.c b/src/libuemf/uwmf.c
index b378e587f..35d38f69a 100644
--- a/src/libuemf/uwmf.c
+++ b/src/libuemf/uwmf.c
@@ -19,8 +19,8 @@
/*
File: uwmf.c
-Version: 0.0.15
-Date: 11-APR-2014
+Version: 0.0.16
+Date: 25-MAR-2015
Author: David Mathog, Biology Division, Caltech
email: mathog@caltech.edu
Copyright: 2014 David Mathog and California Institute of Technology (Caltech)
@@ -47,6 +47,7 @@ extern "C" {
#endif
#include "uwmf.h"
#include "uwmf_endian.h"
+#include "uemf_safe.h"
/**
\brief Look up the full numeric type of a WMR record by type.
@@ -671,6 +672,51 @@ const char *U_wmr_escnames(int idx){
/* one prototype from uwmf_endian. Put it here because end user should never need to see it, so
not in uemf.h or uwmf_endian.h */
void U_swap2(void *ul, unsigned int count);
+
+/**
+ \brief Check that the bitmap in the specified packed DIB is compatible with the record size
+
+ \return 1 on success, 0 on failure
+ \param record EMF record that contains a DIB pixel array
+ \param blimit one byte past the end of the record.
+
+ This method can only test DIBs that hold Microsoft's various bitmap types. PNG or JPG is just a bag
+ of bytes, and there is no possible way to derive from the known width and height how big it should be.
+
+ This should not be called directly by end user code.
+*/
+int packed_DIB_safe(
+ const char *record,
+ const char *blimit
+ ){
+ int dibparams = U_BI_UNKNOWN; // type of image not yet determined
+ const char *px = NULL; // DIB pixels
+ const U_RGBQUAD *ct = NULL; // DIB color table
+ int bs;
+ int usedbytes;
+
+ if(!bitmapinfo_safe(record, blimit))return(0); // this DIB has issues with colors fitting into the record
+ uint32_t width, height, colortype, numCt, invert; // these values will be set in get_DIB_params
+ // next call returns pointers and values, but allocates no memory
+ dibparams = wget_DIB_params(record, &px, (const U_RGBQUAD **) &ct, &numCt, &width, &height, &colortype, &invert);
+ // sanity checking
+ if(numCt && colortype >= U_BCBM_COLOR16)return(0); //color tables not used above 16 bit pixels
+ if(!numCt && colortype < U_BCBM_COLOR16)return(0); //color tables mandatory for < 16 bit
+
+ if(dibparams ==U_BI_RGB){
+ // this is the only DIB type where we can calculate how big it should be when stored in the WMF file
+ bs = colortype/8;
+ if(bs<1){
+ usedbytes = (width*colortype + 7)/8; // width of line in fully and partially occupied bytes
+ }
+ else {
+ usedbytes = width*bs;
+ }
+ if(IS_MEM_UNSAFE(px, usedbytes, blimit))return(0);
+ }
+ return(1);
+}
+
//! \endcond
/**
@@ -4439,9 +4485,7 @@ size_t U_WMRRECSAFE_get(
memcpy(&Size16, contents + offsetof(U_METARECORD,Size16_4), 4);
size = 2*Size16;
/* Record is not self consistent - described size past the end of WMF in memory */
- if(size < U_SIZE_METARECORD ||
- contents + size - 1 >= blimit ||
- contents + size - 1 < contents)size=0;
+ if(size < U_SIZE_METARECORD || IS_MEM_UNSAFE(contents, size, blimit))size=0;
return(size);
}
@@ -4826,20 +4870,21 @@ int wmfheader_get(
){
uint32_t Key;
int size=0;
- if(!Placeable || !Header || contents + 4 >= blimit)return(0);
+ if(!contents || !Placeable || !Header || !blimit)return(0);
+ if(IS_MEM_UNSAFE(contents, 4, blimit))return(0);
memcpy(&Key, contents + offsetof(U_WMRPLACEABLE,Key), 4);
if(Key == 0x9AC6CDD7){
size += U_SIZE_WMRPLACEABLE;
- if(contents + size >= blimit)return(0);
+ if(IS_MEM_UNSAFE(contents, size, blimit))return(0);
memcpy(Placeable, contents, U_SIZE_WMRPLACEABLE);
contents += U_SIZE_WMRPLACEABLE;
}
else {
memset(Placeable, 0, U_SIZE_WMRPLACEABLE);
}
- if(contents + size + U_SIZE_WMRHEADER >= blimit)return(0);
+ if(IS_MEM_UNSAFE(contents, size + U_SIZE_WMRHEADER, blimit))return(0);
size += 2* (*(uint16_t *)(contents + offsetof(U_WMRHEADER,Size16w)));
- if(contents + size >= blimit)return(0);
+ if(IS_MEM_UNSAFE(contents, size, blimit))return(0);
memcpy(Header, contents, U_SIZE_WMRHEADER);
return(size);
}
@@ -5512,7 +5557,11 @@ int U_WMRPOLYGON_get(
uint16_t *Length,
const char **Data
){
- return U_WMRCORE_2U16_N16_get(contents, (U_SIZE_WMRPOLYGON), NULL, Length, Data);
+ int size = U_WMRCORE_2U16_N16_get(contents, (U_SIZE_WMRPOLYGON), NULL, Length, Data);
+ if(size){
+ if(IS_MEM_UNSAFE(*Data, (*Length)*sizeof(U_POINT16), contents+size))return(0);
+ }
+ return size;
}
/**
@@ -5527,7 +5576,11 @@ int U_WMRPOLYLINE_get(
uint16_t *Length,
const char **Data
){
- return U_WMRCORE_2U16_N16_get(contents, (U_SIZE_WMRPOLYLINE), NULL, Length, Data);
+ int size = U_WMRCORE_2U16_N16_get(contents, (U_SIZE_WMRPOLYGON), NULL, Length, Data);
+ if(size){
+ if(IS_MEM_UNSAFE(*Data, (*Length)*sizeof(U_POINT16), contents+size))return(0);
+ }
+ return size;
}
/**
@@ -5550,7 +5603,11 @@ int U_WMRESCAPE_get(
uint16_t *Length,
const char **Data
){
- return U_WMRCORE_2U16_N16_get(contents, (U_SIZE_WMRESCAPE), Escape, Length, Data);
+ int size = U_WMRCORE_2U16_N16_get(contents, (U_SIZE_WMRESCAPE), Escape, Length, Data);
+ if(size){
+ if(IS_MEM_UNSAFE(*Data, *Length, contents+size))return(0);
+ }
+ return size;
}
/**
@@ -5787,6 +5844,7 @@ int U_WMRSETDIBTODEV_get(
Dst->y = *(int16_t *)( contents + offsetof(U_WMRSETDIBTODEV, yDst ));
Dst->x = *(int16_t *)( contents + offsetof(U_WMRSETDIBTODEV, xDst ));
*dib = ( contents + offsetof(U_WMRSETDIBTODEV, dib ));
+ if(!packed_DIB_safe(*dib, *dib+size))return(0);
return(size);
}
@@ -5948,6 +6006,7 @@ int U_WMRDIBBITBLT_get(
Dst->y = *(int16_t *)( contents + offsetof(U_WMRDIBBITBLT_PX, yDst ));
Dst->x = *(int16_t *)( contents + offsetof(U_WMRDIBBITBLT_PX, xDst ));
*dib = ( contents + offsetof(U_WMRDIBBITBLT_PX, dib ));
+ if(!packed_DIB_safe(*dib, *dib+size))return(0);
}
return(size);
}
@@ -5999,6 +6058,7 @@ int U_WMRDIBSTRETCHBLT_get(
cDst->y = *(int16_t *)( contents + offsetof(U_WMRDIBSTRETCHBLT_PX, hDst ));
cDst->x = *(int16_t *)( contents + offsetof(U_WMRDIBSTRETCHBLT_PX, wDst ));
*dib = ( contents + offsetof(U_WMRDIBSTRETCHBLT_PX, dib ));
+ if(!packed_DIB_safe(*dib, *dib+size))return(0);
}
return(size);
}
@@ -6040,11 +6100,13 @@ int U_WMRDIBCREATEPATTERNBRUSH_get(
if(TmpBm16.Width <= 0 || TmpBm16.Height <= 0 || TmpBm16.Planes != 1 || TmpBm16.BitsPixel == 0){
*Bm16 = NULL;
*dib = (contents + offsetof(U_WMRDIBCREATEPATTERNBRUSH, Src));
+ if(!packed_DIB_safe(*dib, *dib+size))return(0);
}
}
else { /* from DIB */
*Bm16 = NULL;
*dib = (contents + offsetof(U_WMRDIBCREATEPATTERNBRUSH, Src));
+ if(!packed_DIB_safe(*dib, *dib+size))return(0);
}
return(size);
}
@@ -6085,6 +6147,7 @@ int U_WMRSTRETCHDIB_get(
Dst->y = *(int16_t *)( contents + offsetof(U_WMRSTRETCHDIB, yDst ));
Dst->x = *(int16_t *)( contents + offsetof(U_WMRSTRETCHDIB, xDst ));
*dib = ( contents + offsetof(U_WMRSTRETCHDIB, dib ));
+ if(!packed_DIB_safe(*dib, *dib+size))return(0);
return(size);
}
@@ -6914,7 +6977,12 @@ int U_WMRCREATEFONTINDIRECT_get(
const char *contents,
const char **font
){
- return U_WMRCORE_2U16_N16_get(contents, (U_SIZE_WMRCREATEFONTINDIRECT), NULL, NULL, font);
+ int size = U_WMRCORE_2U16_N16_get(contents, (U_SIZE_WMRCREATEFONTINDIRECT), NULL, NULL, font);
+ if(size){
+ if(IS_MEM_UNSAFE(*font, U_SIZE_FONT_CORE, contents+size))return(0);
+ if(contents + size - *font > U_SIZE_FONT_CORE + 32)return(0); // font name must fit in a 32 bit field
+ }
+ return size;
}
/**
@@ -6927,6 +6995,7 @@ int U_WMRCREATEBRUSHINDIRECT_get(
const char *contents,
const char **brush
){
+ // U_SIZE_WMRCREATEBRUSHINDIRECT is everything, no variable part, so the test below is sufficient
return U_WMRCORE_2U16_N16_get(contents, (U_SIZE_WMRCREATEBRUSHINDIRECT), NULL, NULL, brush);
}
@@ -6947,16 +7016,19 @@ int U_WMRCREATEBITMAP_get(void){
\return length of the U_WMRCREATEREGION record in bytes, or 0 on error
\param contents record to extract data from
\param Region pointer to U_REGION structure in memory. Pointer may not be aligned properly for structure.
+
+ Caller must check at the returned Region does not extend outside of the record!
*/
int U_WMRCREATEREGION_get(
const char *contents,
const char **Region
){
- return U_WMRCORE_2U16_N16_get(contents, (U_SIZE_WMRCREATEREGION), NULL, NULL, Region);
+ return U_WMRCORE_2U16_N16_get(contents, (U_SIZE_WMRCREATEREGION), NULL, NULL, Region);
}
+
#ifdef __cplusplus
}
#endif
diff --git a/src/libuemf/uwmf.h b/src/libuemf/uwmf.h
index 54f7f36fe..2237d2221 100644
--- a/src/libuemf/uwmf.h
+++ b/src/libuemf/uwmf.h
@@ -36,8 +36,8 @@
/*
File: uwmf.h
-Version: 0.0.10
-Date: 24-MAR-2014
+Version: 0.0.11
+Date: 23-APR-2014
Author: David Mathog, Biology Division, Caltech
email: mathog@caltech.edu
Copyright: 2014 David Mathog and California Institute of Technology (Caltech)
@@ -728,6 +728,7 @@ enum U_WMR_TYPES{
#define U_SIZE_WMRCREATEFONTINDIRECT 26 /**< X 28 */
#define U_SIZE_WMRCREATEBRUSHINDIRECT 14 /**< X 16 */
#define U_SIZE_WMRCREATEREGION 26 /**< X 28 */
+#define U_SIZE_WMRCREATEREGION_CORE 24 /**< X 28 Like U_SIZE_WMRCREATEREGION minus the variable part */
/** @} */
diff --git a/src/libuemf/uwmf_print.c b/src/libuemf/uwmf_print.c
index 0e089a5cd..dd460b2b0 100644
--- a/src/libuemf/uwmf_print.c
+++ b/src/libuemf/uwmf_print.c
@@ -319,7 +319,7 @@ void scan_print(
\param dh void pointer to DIB header
A DIB header in an WMF may be either a BitmapCoreHeader or BitmapInfoHeader.
*/
-void dibheader_print(const void *dh){
+void dibheader_print(const char *dh, const char *blimit){
uint32_t Size;
memcpy(&Size, dh, 4); /* may not be aligned */
if(Size == 0xC ){
@@ -330,7 +330,7 @@ void dibheader_print(const void *dh){
}
else {
printf(" (BitmapInfoHeader) ");
- bitmapinfo_print(dh); /* may not be aligned, called routine must handle it */
+ bitmapinfo_print(dh, blimit); /* may not be aligned, called routine must handle it */
}
}
@@ -922,7 +922,7 @@ void U_WMRSETDIBTODEV_print(const char *contents){
printf(" Src X,Y:{%d,%d}\n", Src.x, Src.y );
printf(" W,H:%d,%d\n", cwh.x, cwh.y );
printf(" Dst X,Y:{%d,%d}\n", Dst.x, Dst.y );
- printf(" DIB:"); dibheader_print(dib); printf("\n");
+ printf(" DIB:"); dibheader_print(dib, dib+size); printf("\n");
}
}
@@ -993,7 +993,7 @@ void U_WMRDIBBITBLT_print(const char *contents){
printf(" Src X,Y:{%d,%d}\n", Src.x, Src.x );
printf(" W,H:%d,%d\n", cwh.x, cwh.y );
printf(" Dst X,Y:{%d,%d}\n", Dst.x, Dst.y );
- if(dib){ printf(" DIB:"); dibheader_print(dib); printf("\n"); }
+ if(dib){ printf(" DIB:"); dibheader_print(dib, dib+size); printf("\n"); }
else { printf(" DIB: none\n"); }
}
}
@@ -1009,7 +1009,7 @@ void U_WMRDIBSTRETCHBLT_print(const char *contents){
printf(" Src X,Y:{%d,%d}\n", Src.x, Src.x );
printf(" Dst W,H:%d,%d\n", cDst.x, cDst.y );
printf(" Dst X,Y:{%d,%d}\n", Dst.x, Dst.y );
- if(dib){ printf(" DIB:"); dibheader_print(dib); printf("\n"); }
+ if(dib){ printf(" DIB:"); dibheader_print(dib, dib+size); printf("\n"); }
else { printf(" DIB: none\n"); }
}
}
@@ -1028,7 +1028,7 @@ void U_WMRDIBCREATEPATTERNBRUSH_print(const char *contents){
printf(" Src:Bitmap16:"); bitmap16_print(Bm16); printf("\n");
}
else { /* from DIB */
- printf(" Src:DIB:"); dibheader_print(dib); printf("\n");
+ printf(" Src:DIB:"); dibheader_print(dib, dib+size); printf("\n");
}
}
}
@@ -1046,7 +1046,7 @@ void U_WMRSTRETCHDIB_print(const char *contents){
printf(" Src X,Y:{%d,%d}\n", Src.x, Src.x );
printf(" Dst W,H:%d,%d\n", cDst.x, cDst.y );
printf(" Dst X,Y:{%d,%d}\n", Dst.x, Dst.y );
- if(dib){ printf(" DIB:"); dibheader_print(dib); printf("\n"); }
+ if(dib){ printf(" DIB:"); dibheader_print(dib, dib+size); printf("\n"); }
else { printf(" DIB: none\n"); }
}
}
diff --git a/src/libuemf/uwmf_print.h b/src/libuemf/uwmf_print.h
index 8daee0feb..54dfe9c9c 100644
--- a/src/libuemf/uwmf_print.h
+++ b/src/libuemf/uwmf_print.h
@@ -37,7 +37,7 @@ void bitmapcoreheader_print(U_BITMAPCOREHEADER ch);
void logbrushw_print(U_WLOGBRUSH lb);
void polypolygon_print(uint16_t nPolys, const uint16_t *aPolyCounts, const char *Points);
void scan_print(U_SCAN sc);
-void dibheader_print(const void *dh);
+void dibheader_print(const char *dh, const char *blimit);
/* prototypes for WMF records */
int wmfheader_print(const char *contents, const char *blimit);
diff --git a/src/live_effects/lpe-fillet-chamfer.h b/src/live_effects/lpe-fillet-chamfer.h
index 6da12cce7..9c91a18b5 100644
--- a/src/live_effects/lpe-fillet-chamfer.h
+++ b/src/live_effects/lpe-fillet-chamfer.h
@@ -15,14 +15,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#if HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#if defined(GLIBMM_DISABLE_DEPRECATED) && defined(HAVE_GLIBMM_THREADS_H)
-# include <glibmm/threads.h>
-#endif
-
#include "live_effects/parameter/enum.h"
#include "live_effects/parameter/bool.h"
#include "live_effects/parameter/unit.h"
diff --git a/src/live_effects/lpe-gears.cpp b/src/live_effects/lpe-gears.cpp
index 903dfd716..d4d695542 100644
--- a/src/live_effects/lpe-gears.cpp
+++ b/src/live_effects/lpe-gears.cpp
@@ -168,7 +168,7 @@ Geom::Path Gear::path() {
D2<SBasis> root = _arc(cursor, cursor+root_advance, root_radius());
makeContinuous(root, prev);
pb.append(SBasisCurve(root));
- cursor += root_advance;
+ //cursor += root_advance;
prev = root.at1();
if (base_radius() > root_radius()) {
diff --git a/src/live_effects/lpe-knot.cpp b/src/live_effects/lpe-knot.cpp
index a730d7403..c3000fe0d 100644
--- a/src/live_effects/lpe-knot.cpp
+++ b/src/live_effects/lpe-knot.cpp
@@ -506,9 +506,9 @@ LPEKnot::doEffect_path (Geom::PathVector const &path_in)
static void
collectPathsAndWidths (SPLPEItem const *lpeitem, Geom::PathVector &paths, std::vector<double> &stroke_widths){
if (SP_IS_GROUP(lpeitem)) {
- GSList const *item_list = sp_item_group_item_list(SP_GROUP(lpeitem));
- for ( GSList const *iter = item_list; iter; iter = iter->next ) {
- SPObject *subitem = static_cast<SPObject *>(iter->data);
+ std::vector<SPItem*> item_list = sp_item_group_item_list(SP_GROUP(lpeitem));
+ for ( std::vector<SPItem*>::const_iterator iter = item_list.begin(); iter != item_list.end(); iter++) {
+ SPObject *subitem = *iter;
if (SP_IS_LPE_ITEM(subitem)) {
collectPathsAndWidths(SP_LPE_ITEM(subitem), paths, stroke_widths);
}
diff --git a/src/live_effects/lpe-lattice2.cpp b/src/live_effects/lpe-lattice2.cpp
index 51453357b..8c7f46cbd 100644
--- a/src/live_effects/lpe-lattice2.cpp
+++ b/src/live_effects/lpe-lattice2.cpp
@@ -18,6 +18,8 @@
#include "live_effects/lpe-lattice2.h"
+#include <gtkmm/expander.h>
+
#include "sp-shape.h"
#include "sp-item.h"
#include "sp-path.h"
diff --git a/src/live_effects/lpe-lattice2.h b/src/live_effects/lpe-lattice2.h
index ff2e75641..b32903c9e 100644
--- a/src/live_effects/lpe-lattice2.h
+++ b/src/live_effects/lpe-lattice2.h
@@ -18,12 +18,16 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gtkmm.h>
#include "live_effects/parameter/enum.h"
+#include <gtkmm/widget.h>
#include "live_effects/effect.h"
#include "live_effects/parameter/point.h"
#include "live_effects/lpegroupbbox.h"
+namespace Gtk {
+class Expander;
+}
+
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-taperstroke.cpp b/src/live_effects/lpe-taperstroke.cpp
index a681ad473..842c942b4 100644
--- a/src/live_effects/lpe-taperstroke.cpp
+++ b/src/live_effects/lpe-taperstroke.cpp
@@ -388,13 +388,9 @@ Piecewise<D2<SBasis> > stretch_along(Piecewise<D2<SBasis> > pwd2_in, Geom::Path
x0 -= pattBndsX->min();
y0 -= pattBndsY->middle();
- double xspace = 0;
double noffset = 0;
double toffset = 0;
// Prevent more than 90% overlap...
- if (xspace < -pattBndsX->extent()*.9) {
- xspace = -pattBndsX->extent()*.9;
- }
y0+=noffset;
diff --git a/src/live_effects/parameter/filletchamferpointarray.cpp b/src/live_effects/parameter/filletchamferpointarray.cpp
index 6e70e7e65..cf11d52fc 100644
--- a/src/live_effects/parameter/filletchamferpointarray.cpp
+++ b/src/live_effects/parameter/filletchamferpointarray.cpp
@@ -506,7 +506,6 @@ std::vector<double> FilletChamferPointArrayParam::get_times(int index, Geom::Pat
time_it1 = 0;
}
double resultLenght = 0;
- time_it1_B = 1;
if (subpaths[positions.first].closed() && last) {
time_it2 = modf(to_time(index - positions.second , _vector[index - positions.second ][X]), &intpart);
resultLenght = it1_length + to_len(index - positions.second, _vector[index - positions.second ][X]);
diff --git a/src/live_effects/parameter/originalpath.cpp b/src/live_effects/parameter/originalpath.cpp
index 0884c4c9c..2741461be 100644
--- a/src/live_effects/parameter/originalpath.cpp
+++ b/src/live_effects/parameter/originalpath.cpp
@@ -8,10 +8,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include "live_effects/parameter/originalpath.h"
diff --git a/src/live_effects/parameter/originalpatharray.cpp b/src/live_effects/parameter/originalpatharray.cpp
index 7706dbdf8..78e061e66 100644
--- a/src/live_effects/parameter/originalpatharray.cpp
+++ b/src/live_effects/parameter/originalpatharray.cpp
@@ -8,10 +8,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include "live_effects/parameter/originalpatharray.h"
#include <gtkmm/widget.h>
diff --git a/src/live_effects/parameter/path.cpp b/src/live_effects/parameter/path.cpp
index dd6b54f7c..e0369e662 100644
--- a/src/live_effects/parameter/path.cpp
+++ b/src/live_effects/parameter/path.cpp
@@ -427,7 +427,13 @@ PathParam::paste_param_path(const char *svgd)
if (svgd && *svgd) {
// remove possible link to path
remove_link();
-
+ SPItem * item = SP_ACTIVE_DESKTOP->getSelection()->singleItem();
+ if (item != NULL) {
+ Geom::PathVector path_clipboard = sp_svg_read_pathv(svgd);
+ path_clipboard *= item->i2doc_affine().inverse();
+ svgd = sp_svg_write_path( path_clipboard );
+ }
+
param_write_to_repr(svgd);
signal_path_pasted.emit();
}
diff --git a/src/main.cpp b/src/main.cpp
index f72b6d121..26c25af02 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1156,7 +1156,7 @@ static int sp_process_file_list(GSList *fl)
}
if (sp_export_svg) {
if (sp_export_text_to_path) {
- GSList *items = NULL;
+ std::vector<SPItem*> items;
SPRoot *root = doc->getRoot();
doc->ensureUpToDate();
for ( SPObject *iter = root->firstChild(); iter ; iter = iter->getNext()) {
@@ -1166,17 +1166,14 @@ static int sp_process_file_list(GSList *fl)
}
te_update_layout_now_recursive(item);
- items = g_slist_append(items, item);
+ items.push_back(item);
}
- GSList *selected = NULL;
- GSList *to_select = NULL;
+ std::vector<SPItem*> selected;
+ std::vector<Inkscape::XML::Node*> to_select;
- sp_item_list_to_curves(items, &selected, &to_select);
+ sp_item_list_to_curves(items, selected, to_select);
- g_slist_free (items);
- g_slist_free (selected);
- g_slist_free (to_select);
}
if(sp_export_id) {
doc->ensureUpToDate();
@@ -1435,7 +1432,7 @@ static int sp_do_export_png(SPDocument *doc)
g_warning ("--export-use-hints can only be used with --export-id or --export-area-drawing; ignored.");
}
- GSList *items = NULL;
+ std::vector<SPItem*> items;
Geom::Rect area;
if (sp_export_id || sp_export_area_drawing) {
@@ -1459,7 +1456,7 @@ static int sp_do_export_png(SPDocument *doc)
return 1;
}
- items = g_slist_prepend (items, SP_ITEM(o));
+ items.push_back(SP_ITEM(o));
if (sp_export_id_only) {
g_print("Exporting only object with id=\"%s\"; all other objects hidden\n", sp_export_id);
@@ -1644,10 +1641,12 @@ static int sp_do_export_png(SPDocument *doc)
g_print("Background RRGGBBAA: %08x\n", bgcolor);
g_print("Area %g:%g:%g:%g exported to %lu x %lu pixels (%g dpi)\n", area[Geom::X][0], area[Geom::Y][0], area[Geom::X][1], area[Geom::Y][1], width, height, dpi);
-
+
+ reverse(items.begin(),items.end());
+
if ((width >= 1) && (height >= 1) && (width <= PNG_UINT_31_MAX) && (height <= PNG_UINT_31_MAX)) {
if( sp_export_png_file(doc, path.c_str(), area, width, height, dpi,
- dpi, bgcolor, NULL, NULL, true, sp_export_id_only ? items : NULL) == 1 ) {
+ dpi, bgcolor, NULL, NULL, true, sp_export_id_only ? items : std::vector<SPItem*>()) == 1 ) {
g_print("Bitmap saved as: %s\n", filename.c_str());
} else {
g_warning("Bitmap failed to save to: %s", filename.c_str());
@@ -1657,7 +1656,6 @@ static int sp_do_export_png(SPDocument *doc)
}
}
- g_slist_free (items);
return retcode;
}
diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp
index 3f8d4a662..1293d19aa 100644
--- a/src/object-snapper.cpp
+++ b/src/object-snapper.cpp
@@ -237,8 +237,9 @@ void Inkscape::ObjectSnapper::_collectNodes(SnapSourceType const &t,
// current selection (see the comment in SelTrans::centerRequest())
bool old_pref2 = _snapmanager->snapprefs.isTargetSnappable(SNAPTARGET_ROTATION_CENTER);
if (old_pref2) {
- for ( GSList const *itemlist = _snapmanager->getRotationCenterSource(); itemlist != NULL; itemlist = g_slist_next(itemlist) ) {
- if ((*i).item == reinterpret_cast<SPItem*>(itemlist->data)) {
+ std::vector<SPItem*> rotationSource=_snapmanager->getRotationCenterSource();
+ for ( std::vector<SPItem*>::const_iterator itemlist = rotationSource.begin(); itemlist != rotationSource.end(); itemlist++) {
+ if ((*i).item == *itemlist) {
// don't snap to this item's rotation center
_snapmanager->snapprefs.setTargetSnappable(SNAPTARGET_ROTATION_CENTER, false);
break;
diff --git a/src/object-test.h b/src/object-test.h
index 06363c372..4f0be3251 100644
--- a/src/object-test.h
+++ b/src/object-test.h
@@ -204,7 +204,8 @@ public:
assert(n_group != NULL);
begin = clock();
- sp_item_group_ungroup(n_group, NULL, false);
+ std::vector<SPItem*> ch;
+ sp_item_group_ungroup(n_group, ch, false);
end = clock();
std::cout << "Took " << double(end - begin) / double(CLOCKS_PER_SEC) << " seconds to ungroup a <g> with " << num_elements << " elements\n";
diff --git a/src/path-chemistry.cpp b/src/path-chemistry.cpp
index 5f6e1495b..7bd5b6298 100644
--- a/src/path-chemistry.cpp
+++ b/src/path-chemistry.cpp
@@ -44,13 +44,22 @@
using Inkscape::DocumentUndo;
+
+inline bool less_than_items(SPItem const *first, SPItem const *second)
+{
+ return sp_repr_compare_position(first->getRepr(),
+ second->getRepr())<0;
+}
+
void
sp_selected_path_combine(SPDesktop *desktop)
{
Inkscape::Selection *selection = desktop->getSelection();
SPDocument *doc = desktop->getDocument();
+
+ std::vector<SPItem*> items(selection->itemList());
- if (g_slist_length((GSList *) selection->itemList()) < 1) {
+ if (items.size() < 1) {
desktop->getMessageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to combine."));
return;
}
@@ -59,28 +68,23 @@ sp_selected_path_combine(SPDesktop *desktop)
// set "busy" cursor
desktop->setWaitingCursor();
- GSList *items = g_slist_copy((GSList *) selection->itemList());
-
items = sp_degroup_list (items); // descend into any groups in selection
- GSList *to_paths = NULL;
- for (GSList *i = items; i != NULL; i = i->next) {
- SPItem *item = (SPItem *) i->data;
- if (!dynamic_cast<SPPath *>(item) && !dynamic_cast<SPGroup *>(item)) {
- to_paths = g_slist_prepend(to_paths, item);
+ std::vector<SPItem*> to_paths;
+ for (std::vector<SPItem*>::const_reverse_iterator i = items.rbegin(); i != items.rend(); i++) {
+ if (!dynamic_cast<SPPath *>(*i) && !dynamic_cast<SPGroup *>(*i)) {
+ to_paths.push_back(*i);
}
}
- GSList *converted = NULL;
- bool did = sp_item_list_to_curves(to_paths, &items, &converted);
- g_slist_free(to_paths);
- for (GSList *i = converted; i != NULL; i = i->next)
- items = g_slist_prepend(items, doc->getObjectByRepr((Inkscape::XML::Node*)(i->data)));
+ std::vector<Inkscape::XML::Node*> converted;
+ bool did = sp_item_list_to_curves(to_paths, items, converted);
+ for (std::vector<Inkscape::XML::Node*>::const_iterator i = converted.begin(); i != converted.end(); i++)
+ items.push_back((SPItem*)doc->getObjectByRepr(*i));
items = sp_degroup_list (items); // converting to path may have added more groups, descend again
- items = g_slist_sort(items, (GCompareFunc) sp_item_repr_compare_position);
- items = g_slist_reverse(items);
- assert(items); // cannot be NULL because of list length check at top of function
+ sort(items.begin(),items.end(),less_than_items);
+ assert(!items.empty()); // cannot be NULL because of list length check at top of function
// remember the position, id, transform and style of the topmost path, they will be assigned to the combined one
gint position = 0;
@@ -97,9 +101,9 @@ sp_selected_path_combine(SPDesktop *desktop)
selection->clear();
}
- for (GSList *i = items; i != NULL; i = i->next) { // going from top to bottom
+ for (std::vector<SPItem*>::const_reverse_iterator i = items.rbegin(); i != items.rend(); i++){
- SPItem *item = (SPItem *) i->data;
+ SPItem *item = *i;
SPPath *path = dynamic_cast<SPPath *>(item);
if (!path) {
continue;
@@ -136,7 +140,6 @@ sp_selected_path_combine(SPDesktop *desktop)
}
}
- g_slist_free(items);
if (did) {
first->deleteObject(false);
@@ -200,11 +203,10 @@ sp_selected_path_break_apart(SPDesktop *desktop)
bool did = false;
- for (GSList *items = g_slist_copy((GSList *) selection->itemList());
- items != NULL;
- items = items->next) {
+ std::vector<SPItem*> itemlist(selection->itemList());
+ for (std::vector<SPItem*>::const_iterator i = itemlist.begin(); i != itemlist.end(); i++){
- SPItem *item = (SPItem *) items->data;
+ SPItem *item = *i;
SPPath *path = dynamic_cast<SPPath *>(item);
if (!path) {
@@ -241,7 +243,7 @@ sp_selected_path_break_apart(SPDesktop *desktop)
curve->unref();
- GSList *reprs = NULL;
+ std::vector<Inkscape::XML::Node*> reprs;
for (GSList *l = list; l != NULL; l = l->next) {
curve = (SPCurve *) l->data;
@@ -267,14 +269,12 @@ sp_selected_path_break_apart(SPDesktop *desktop)
if (l == list)
repr->setAttribute("id", id);
- reprs = g_slist_prepend (reprs, repr);
+ reprs.push_back(repr);
Inkscape::GC::release(repr);
}
-
selection->setReprList(reprs);
- g_slist_free(reprs);
g_slist_free(list);
g_free(style);
g_free(path_effect);
@@ -307,18 +307,15 @@ sp_selected_path_to_curves(Inkscape::Selection *selection, SPDesktop *desktop, b
desktop->setWaitingCursor();
}
- GSList *selected = g_slist_copy((GSList *) selection->itemList());
- GSList *to_select = NULL;
+ std::vector<SPItem*> selected(selection->itemList());
+ std::vector<Inkscape::XML::Node*> to_select;
selection->clear();
- GSList *items = g_slist_copy(selected);
+ std::vector<SPItem*> items(selected);
- did = sp_item_list_to_curves(items, &selected, &to_select);
+ did = sp_item_list_to_curves(items, selected, to_select);
- g_slist_free (items);
selection->setReprList(to_select);
selection->addList(selected);
- g_slist_free (to_select);
- g_slist_free (selected);
if (interactive && desktop) {
desktop->clearWaitingCursor();
@@ -341,33 +338,24 @@ void sp_selected_to_lpeitems(SPDesktop *desktop)
return;
}
- GSList *selected = g_slist_copy((GSList *) selection->itemList());
- GSList *to_select = NULL;
+ std::vector<SPItem*> selected(selection->itemList());
+ std::vector<Inkscape::XML::Node*> to_select;
selection->clear();
- GSList *items = g_slist_copy(selected);
+ std::vector<SPItem*> items(selected);
+
- sp_item_list_to_curves(items, &selected, &to_select, true);
+ sp_item_list_to_curves(items, selected, to_select, true);
- g_slist_free(items);
- items = 0;
selection->setReprList(to_select);
selection->addList(selected);
- g_slist_free(to_select);
- to_select = 0;
- g_slist_free(selected);
- selected = 0;
}
bool
-sp_item_list_to_curves(const GSList *items, GSList **selected, GSList **to_select, bool skip_all_lpeitems)
+sp_item_list_to_curves(const std::vector<SPItem*> &items, std::vector<SPItem*>& selected, std::vector<Inkscape::XML::Node*> &to_select, bool skip_all_lpeitems)
{
bool did = false;
-
- for (;
- items != NULL;
- items = items->next) {
-
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(items->data));
+ for (std::vector<SPItem*>::const_iterator i = items.begin(); i != items.end(); i++){
+ SPItem *item = *i;
g_assert(item != NULL);
SPDocument *document = item->document;
@@ -398,9 +386,9 @@ sp_item_list_to_curves(const GSList *items, GSList **selected, GSList **to_selec
Inkscape::XML::Node *repr = box3d_convert_to_group(box)->getRepr();
if (repr) {
- *to_select = g_slist_prepend (*to_select, repr);
+ to_select.insert(to_select.begin(),repr);
did = true;
- *selected = g_slist_remove (*selected, item);
+ selected.erase(remove(selected.begin(), selected.end(), item), selected.end());
}
continue;
@@ -408,17 +396,14 @@ sp_item_list_to_curves(const GSList *items, GSList **selected, GSList **to_selec
if (group) {
group->removeAllPathEffects(true);
- GSList *item_list = sp_item_group_item_list(group);
+ std::vector<SPItem*> item_list = sp_item_group_item_list(group);
- GSList *item_to_select = NULL;
- GSList *item_selected = NULL;
+ std::vector<Inkscape::XML::Node*> item_to_select;
+ std::vector<SPItem*> item_selected;
- if (sp_item_list_to_curves(item_list, &item_selected, &item_to_select))
+ if (sp_item_list_to_curves(item_list, item_selected, item_to_select))
did = true;
- g_slist_free(item_list);
- g_slist_free(item_to_select);
- g_slist_free(item_selected);
continue;
}
@@ -428,7 +413,7 @@ sp_item_list_to_curves(const GSList *items, GSList **selected, GSList **to_selec
continue;
did = true;
- *selected = g_slist_remove (*selected, item);
+ selected.erase(remove(selected.begin(), selected.end(), item), selected.end());
// remember the position of the item
gint pos = item->getRepr()->position();
@@ -470,7 +455,7 @@ sp_item_list_to_curves(const GSList *items, GSList **selected, GSList **to_selec
/* Buglet: We don't re-add the (new version of the) object to the selection of any other
* desktops where it was previously selected. */
- *to_select = g_slist_prepend (*to_select, repr);
+ to_select.insert(to_select.begin(),repr);
Inkscape::GC::release(repr);
}
@@ -488,6 +473,9 @@ sp_selected_item_to_curved_repr(SPItem *item, guint32 /*text_grouping_policy*/)
if (dynamic_cast<SPText *>(item) || dynamic_cast<SPFlowtext *>(item)) {
// Special treatment for text: convert each glyph to separate path, then group the paths
Inkscape::XML::Node *g_repr = xml_doc->createElement("svg:g");
+
+ Glib::ustring original_text; // To save original text of accessibility.
+
g_repr->setAttribute("transform", item->getRepr()->attribute("transform"));
/* Mask */
gchar *mask_str = (gchar *) item->getRepr()->attribute("mask");
@@ -508,6 +496,8 @@ sp_selected_item_to_curved_repr(SPItem *item, guint32 /*text_grouping_policy*/)
Inkscape::Text::Layout::iterator iter = te_get_layout(item)->begin();
do {
+ original_text += (gunichar)te_get_layout(item)->characterAt( iter );
+
Inkscape::Text::Layout::iterator iter_next = iter;
iter_next.nextGlyph(); // iter_next is one glyph ahead from iter
if (iter == iter_next)
@@ -547,6 +537,11 @@ sp_selected_item_to_curved_repr(SPItem *item, guint32 /*text_grouping_policy*/)
p_repr->setAttribute("style", style_str.c_str());
g_repr->appendChild(p_repr);
+
+ // For accessibility, store original string
+ if( original_text.size() > 0 ) {
+ g_repr->setAttribute("aria-label", original_text.c_str() );
+ }
Inkscape::GC::release(p_repr);
if (iter == te_get_layout(item)->end())
@@ -612,9 +607,9 @@ void
sp_selected_path_reverse(SPDesktop *desktop)
{
Inkscape::Selection *selection = desktop->getSelection();
- GSList *items = (GSList *) selection->itemList();
+ std::vector<SPItem*> items = selection->itemList();
- if (!items) {
+ if (items.empty()) {
desktop->getMessageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>path(s)</b> to reverse."));
return;
}
@@ -626,9 +621,9 @@ sp_selected_path_reverse(SPDesktop *desktop)
bool did = false;
desktop->messageStack()->flash(Inkscape::IMMEDIATE_MESSAGE, _("Reversing paths..."));
- for (GSList *i = items; i != NULL; i = i->next) {
+ for (std::vector<SPItem*>::const_iterator i = items.begin(); i != items.end(); i++){
- SPPath *path = dynamic_cast<SPPath *>(static_cast<SPObject *>(i->data));
+ SPPath *path = dynamic_cast<SPPath *>(*i);
if (!path) {
continue;
}
diff --git a/src/path-chemistry.h b/src/path-chemistry.h
index a2150440c..f454167a9 100644
--- a/src/path-chemistry.h
+++ b/src/path-chemistry.h
@@ -33,7 +33,7 @@ void sp_selected_path_to_curves (Inkscape::Selection *selection, SPDesktop *desk
void sp_selected_to_lpeitems(SPDesktop *desktop);
Inkscape::XML::Node *sp_selected_item_to_curved_repr(SPItem *item, guint32 text_grouping_policy);
void sp_selected_path_reverse (SPDesktop *desktop);
-bool sp_item_list_to_curves(const GSList *items, GSList **selected, GSList **to_select, bool skip_all_lpeitems = false);
+bool sp_item_list_to_curves(const std::vector<SPItem*> &items, std::vector<SPItem*> &selected, std::vector<Inkscape::XML::Node*> &to_select, bool skip_all_lpeitems = false);
#endif // SEEN_PATH_CHEMISTRY_H
diff --git a/src/removeoverlap.cpp b/src/removeoverlap.cpp
index ba5740e55..9ea75de0d 100644
--- a/src/removeoverlap.cpp
+++ b/src/removeoverlap.cpp
@@ -38,20 +38,19 @@ namespace {
* such that rectangular bounding boxes are separated by at least xGap
* horizontally and yGap vertically
*/
-void removeoverlap(GSList const *const items, double const xGap, double const yGap) {
- using Inkscape::Util::GSListConstIterator;
- std::list<SPItem *> selected;
- selected.insert<GSListConstIterator<SPItem *> >(selected.end(), items, NULL);
+void removeoverlap(std::vector<SPItem*> const &items, double const xGap, double const yGap) {
+ std::vector<SPItem*> selected(items);
std::vector<Record> records;
std::vector<Rectangle *> rs;
Geom::Point const gap(xGap, yGap);
- for (std::list<SPItem *>::iterator it(selected.begin());
+ for (std::vector<SPItem*>::iterator it(selected.begin());
it != selected.end();
++it)
{
+ SPItem* item = *it;
using Geom::X; using Geom::Y;
- Geom::OptRect item_box((*it)->desktopVisualBounds());
+ Geom::OptRect item_box((item)->desktopVisualBounds());
if (item_box) {
Geom::Point min(item_box->min() - .5*gap);
Geom::Point max(item_box->max() + .5*gap);
@@ -67,7 +66,7 @@ void removeoverlap(GSList const *const items, double const xGap, double const yG
min[Y] = max[Y] = (min[Y] + max[Y])/2;
}
Rectangle *vspc_rect = new Rectangle(min[X], max[X], min[Y], max[Y]);
- records.push_back(Record(*it, item_box->midpoint(), vspc_rect));
+ records.push_back(Record(item, item_box->midpoint(), vspc_rect));
rs.push_back(vspc_rect);
}
}
diff --git a/src/removeoverlap.h b/src/removeoverlap.h
index 7109c9513..d873663d1 100644
--- a/src/removeoverlap.h
+++ b/src/removeoverlap.h
@@ -15,6 +15,6 @@
typedef struct _GSList GSList;
-void removeoverlap(GSList const *items, double xGap, double yGap);
+void removeoverlap(std::vector<SPItem*> const &items, double xGap, double yGap);
#endif // SEEN_REMOVEOVERLAP_H
diff --git a/src/selcue.cpp b/src/selcue.cpp
index d2fa0970a..c73219b7d 100644
--- a/src/selcue.cpp
+++ b/src/selcue.cpp
@@ -96,15 +96,16 @@ void Inkscape::SelCue::_updateItemBboxes(Inkscape::Preferences *prefs)
void Inkscape::SelCue::_updateItemBboxes(gint mode, int prefs_bbox)
{
- GSList const *items = _selection->itemList();
- if (_item_bboxes.size() != g_slist_length((GSList *) items)) {
+ const std::vector<SPItem*> items = _selection->itemList();
+ if (_item_bboxes.size() != items.size()) {
_newItemBboxes();
return;
}
int bcount = 0;
- for (GSList const *l = _selection->itemList(); l != NULL; l = l->next) {
- SPItem *item = static_cast<SPItem *>(l->data);
+ std::vector<SPItem*> ll=_selection->itemList();
+ for (std::vector<SPItem*>::const_iterator l = ll.begin(); l != ll.end(); l++) {
+ SPItem *item = *l;
SPCanvasItem* box = _item_bboxes[bcount ++];
if (box) {
@@ -145,8 +146,9 @@ void Inkscape::SelCue::_newItemBboxes()
int prefs_bbox = prefs->getBool("/tools/bounding_box");
- for (GSList const *l = _selection->itemList(); l != NULL; l = l->next) {
- SPItem *item = static_cast<SPItem *>(l->data);
+ std::vector<SPItem*> ll=_selection->itemList();
+ for (std::vector<SPItem*>::const_iterator l = ll.begin(); l != ll.end(); l++) {
+ SPItem *item = *l;
Geom::OptRect const b = (prefs_bbox == 0) ?
item->desktopVisualBounds() : item->desktopGeometricBounds();
@@ -199,8 +201,9 @@ void Inkscape::SelCue::_newTextBaselines()
}
_text_baselines.clear();
- for (GSList const *l = _selection->itemList(); l != NULL; l = l->next) {
- SPItem *item = static_cast<SPItem *>(l->data);
+ std::vector<SPItem*> ll = _selection->itemList();
+ for (std::vector<SPItem*>::const_iterator l=ll.begin();l!=ll.end();l++) {
+ SPItem *item = *l;
SPCanvasItem* baseline_point = NULL;
if (SP_IS_TEXT(item) || SP_IS_FLOWTEXT(item)) { // visualize baseline
diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp
index 5e8fd5e07..2cd4f6b4e 100644
--- a/src/selection-chemistry.cpp
+++ b/src/selection-chemistry.cpp
@@ -279,25 +279,21 @@ void SelectionHelper::fixSelection(SPDesktop *dt)
Inkscape::Selection *selection = dt->getSelection();
- GSList *items = NULL;
+ std::vector<SPItem*> items ;
- GSList const *selList = selection->itemList();
+ std::vector<SPItem*> const selList = selection->itemList();
- for( GSList const *i = selList; i; i = i->next ) {
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(i->data));
+ for( std::vector<SPItem*>::const_reverse_iterator i = selList.rbegin(); i != selList.rend(); i++ ) {
+ SPItem *item = *i;
if( item &&
!dt->isLayer(item) &&
(!item->isLocked()))
{
- items = g_slist_prepend(items, item);
+ items.push_back(item);
}
}
selection->setList(items);
-
- if(items) {
- g_slist_free(items);
- }
}
} // namespace Inkscape
@@ -307,7 +303,7 @@ void SelectionHelper::fixSelection(SPDesktop *dt)
* Copies repr and its inherited css style elements, along with the accumulated transform 'full_t',
* then prepends the copy to 'clip'.
*/
-static void sp_selection_copy_one(Inkscape::XML::Node *repr, Geom::Affine full_t, GSList **clip, Inkscape::XML::Document* xml_doc)
+static void sp_selection_copy_one(Inkscape::XML::Node *repr, Geom::Affine full_t, std::vector<Inkscape::XML::Node*> &clip, Inkscape::XML::Document* xml_doc)
{
Inkscape::XML::Node *copy = repr->duplicate(xml_doc);
@@ -323,41 +319,39 @@ static void sp_selection_copy_one(Inkscape::XML::Node *repr, Geom::Affine full_t
copy->setAttribute("transform", affinestr);
g_free(affinestr);
- *clip = g_slist_prepend(*clip, copy);
+ clip.insert(clip.begin(),copy);
}
-static void sp_selection_copy_impl(GSList const *items, GSList **clip, Inkscape::XML::Document* xml_doc)
+static void sp_selection_copy_impl(std::vector<SPItem*> const &items, std::vector<Inkscape::XML::Node*> &clip, Inkscape::XML::Document* xml_doc)
{
// Sort items:
- GSList *sorted_items = g_slist_copy(const_cast<GSList *>(items));
- sorted_items = g_slist_sort(static_cast<GSList *>(sorted_items), (GCompareFunc) sp_object_compare_position);
+ std::vector<SPItem*> sorted_items(items);
+ sort(sorted_items.begin(),sorted_items.end(),sp_object_compare_position_bool);
// Copy item reprs:
- for (GSList *i = sorted_items; i != NULL; i = i->next) {
- SPItem *item = dynamic_cast<SPItem *>(SP_OBJECT(i->data));
+ for (std::vector<SPItem*>::const_iterator i = sorted_items.begin(); i != sorted_items.end(); i++) {
+ SPItem *item = *i;
if (item) {
sp_selection_copy_one(item->getRepr(), item->i2doc_affine(), clip, xml_doc);
} else {
g_assert_not_reached();
}
}
-
- *clip = g_slist_reverse(*clip);
- g_slist_free(static_cast<GSList *>(sorted_items));
+ reverse(clip.begin(),clip.end());
}
// TODO check if parent parameter should be changed to SPItem, of if the code should handle non-items.
-static GSList *sp_selection_paste_impl(SPDocument *doc, SPObject *parent, GSList **clip)
+static std::vector<Inkscape::XML::Node*> sp_selection_paste_impl(SPDocument *doc, SPObject *parent, std::vector<Inkscape::XML::Node*> &clip)
{
Inkscape::XML::Document *xml_doc = doc->getReprDoc();
SPItem *parentItem = dynamic_cast<SPItem *>(parent);
g_assert(parentItem != NULL);
- GSList *copied = NULL;
+ std::vector<Inkscape::XML::Node*> copied;
// add objects to document
- for (GSList *l = *clip; l != NULL; l = l->next) {
- Inkscape::XML::Node *repr = static_cast<Inkscape::XML::Node *>(l->data);
+ for (std::vector<Inkscape::XML::Node*>::const_iterator l = clip.begin(); l != clip.end(); l++) {
+ Inkscape::XML::Node *repr = *l;
Inkscape::XML::Node *copy = repr->duplicate(xml_doc);
// premultiply the item transform by the accumulated parent transform in the paste layer
@@ -375,19 +369,19 @@ static GSList *sp_selection_paste_impl(SPDocument *doc, SPObject *parent, GSList
}
parent->appendChildRepr(copy);
- copied = g_slist_prepend(copied, copy);
+ copied.push_back(copy);
Inkscape::GC::release(copy);
}
return copied;
}
-static void sp_selection_delete_impl(GSList const *items, bool propagate = true, bool propagate_descendants = true)
+static void sp_selection_delete_impl(std::vector<SPItem*> const &items, bool propagate = true, bool propagate_descendants = true)
{
- for (GSList const *i = items ; i ; i = i->next ) {
- sp_object_ref(static_cast<SPItem *>(i->data), NULL);
+ for (std::vector<SPItem*>::const_iterator i = items.begin(); i != items.end(); i++) {
+ sp_object_ref(*i, NULL);
}
- for (GSList const *i = items; i != NULL; i = i->next) {
- SPItem *item = static_cast<SPItem *>(i->data);
+ for (std::vector<SPItem*>::const_iterator i = items.begin(); i != items.end(); i++) {
+ SPItem *item = *i;
item->deleteObject(propagate, propagate_descendants);
sp_object_unref(item, NULL);
}
@@ -414,11 +408,9 @@ void sp_selection_delete(SPDesktop *desktop)
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("<b>Nothing</b> was deleted."));
return;
}
-
- GSList *selected = g_slist_copy(const_cast<GSList *>(selection->itemList()));
+ std::vector<SPItem*> selected(selection->itemList());
selection->clear();
sp_selection_delete_impl(selected);
- g_slist_free(selected);
desktop->currentLayer()->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
/* a tool may have set up private information in it's selection context
@@ -461,16 +453,15 @@ void sp_selection_duplicate(SPDesktop *desktop, bool suppressDone)
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to duplicate."));
return;
}
-
- GSList *reprs = g_slist_copy(const_cast<GSList *>(selection->reprList()));
+ std::vector<Inkscape::XML::Node*> reprs(selection->reprList());
selection->clear();
// sorting items from different parents sorts each parent's subset without possibly mixing
// them, just what we need
- reprs = g_slist_sort(reprs, (GCompareFunc) sp_repr_compare_position);
+ sort(reprs.begin(),reprs.end(),sp_repr_compare_position_bool);
- GSList *newsel = NULL;
+ std::vector<Inkscape::XML::Node*> newsel;
std::vector<const gchar *> old_ids;
std::vector<const gchar *> new_ids;
@@ -478,8 +469,8 @@ void sp_selection_duplicate(SPDesktop *desktop, bool suppressDone)
bool relink_clones = prefs->getBool("/options/relinkclonesonduplicate/value");
const bool fork_livepatheffects = prefs->getBool("/options/forklpeonduplicate/value", true);
- while (reprs) {
- Inkscape::XML::Node *old_repr = static_cast<Inkscape::XML::Node *>(reprs->data);
+ for(std::vector<Inkscape::XML::Node*>::const_reverse_iterator i=reprs.rbegin();i!=reprs.rend();i++){
+ Inkscape::XML::Node *old_repr = *i;
Inkscape::XML::Node *parent = old_repr->parent();
Inkscape::XML::Node *copy = old_repr->duplicate(xml_doc);
@@ -500,8 +491,7 @@ void sp_selection_duplicate(SPDesktop *desktop, bool suppressDone)
}
}
- newsel = g_slist_prepend(newsel, copy);
- reprs = g_slist_remove(reprs, reprs->data);
+ newsel.push_back(copy);
Inkscape::GC::release(copy);
}
@@ -547,8 +537,6 @@ void sp_selection_duplicate(SPDesktop *desktop, bool suppressDone)
}
selection->setReprList(newsel);
-
- g_slist_free(newsel);
}
void sp_edit_clear_all(Inkscape::Selection *selection)
@@ -561,11 +549,10 @@ void sp_edit_clear_all(Inkscape::Selection *selection)
SPGroup *group = dynamic_cast<SPGroup *>(selection->layers()->currentLayer());
g_return_if_fail(group != NULL);
- GSList *items = sp_item_group_item_list(group);
+ std::vector<SPItem*> items = sp_item_group_item_list(group);
- while (items) {
- reinterpret_cast<SPObject*>(items->data)->deleteObject();
- items = g_slist_remove(items, items->data);
+ for(unsigned int i = 0; i < items.size(); i++){
+ items[i]->deleteObject();
}
DocumentUndo::done(doc, SP_VERB_EDIT_CLEAR_ALL,
@@ -582,7 +569,7 @@ void sp_edit_clear_all(Inkscape::Selection *selection)
* onlysensitive - TRUE includes only non-locked items
* ingroups - TRUE to recursively get grouped items children
*/
-GSList *get_all_items(GSList *list, SPObject *from, SPDesktop *desktop, bool onlyvisible, bool onlysensitive, bool ingroups, GSList const *exclude)
+std::vector<SPItem*> &get_all_items(std::vector<SPItem*> &list, SPObject *from, SPDesktop *desktop, bool onlyvisible, bool onlysensitive, bool ingroups, std::vector<SPItem*> const &exclude)
{
for ( SPObject *child = from->firstChild() ; child; child = child->getNext() ) {
SPItem *item = dynamic_cast<SPItem *>(child);
@@ -590,10 +577,10 @@ GSList *get_all_items(GSList *list, SPObject *from, SPDesktop *desktop, bool onl
!desktop->isLayer(item) &&
(!onlysensitive || !item->isLocked()) &&
(!onlyvisible || !desktop->itemIsHidden(item)) &&
- (!exclude || !g_slist_find(const_cast<GSList *>(exclude), child))
+ (exclude.empty() || exclude.end() == std::find(exclude.begin(),exclude.end(),child))
)
{
- list = g_slist_prepend(list, item);
+ list.insert(list.begin(),item);
}
if (ingroups || (item && desktop->isLayer(item))) {
@@ -618,9 +605,9 @@ static void sp_edit_select_all_full(SPDesktop *dt, bool force_all_layers, bool i
bool onlyvisible = prefs->getBool("/options/kbselection/onlyvisible", true);
bool onlysensitive = prefs->getBool("/options/kbselection/onlysensitive", true);
- GSList *items = NULL;
+ std::vector<SPItem*> items ;
- GSList const *exclude = NULL;
+ std::vector<SPItem*> exclude;
if (invert) {
exclude = selection->itemList();
}
@@ -634,40 +621,38 @@ static void sp_edit_select_all_full(SPDesktop *dt, bool force_all_layers, bool i
(onlyvisible && dt->itemIsHidden(dynamic_cast<SPItem *>(dt->currentLayer()))) )
return;
- GSList *all_items = sp_item_group_item_list(dynamic_cast<SPGroup *>(dt->currentLayer()));
+ std::vector<SPItem*> all_items = sp_item_group_item_list(dynamic_cast<SPGroup *>(dt->currentLayer()));
- for (GSList *i = all_items; i; i = i->next) {
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(i->data));
+ for (std::vector<SPItem*>::const_reverse_iterator i=all_items.rbegin();i!=all_items.rend();i++) {
+ SPItem *item = *i;
if (item && (!onlysensitive || !item->isLocked())) {
if (!onlyvisible || !dt->itemIsHidden(item)) {
if (!dt->isLayer(item)) {
- if (!invert || !g_slist_find(const_cast<GSList *>(exclude), item)) {
- items = g_slist_prepend(items, item); // leave it in the list
+ if (!invert || exclude.end() == std::find(exclude.begin(),exclude.end(),item)) {
+ items.push_back(item); // leave it in the list
}
}
}
}
}
- g_slist_free(all_items);
break;
}
case PREFS_SELECTION_LAYER_RECURSIVE: {
- items = get_all_items(NULL, dt->currentLayer(), dt, onlyvisible, onlysensitive, FALSE, exclude);
+ std::vector<SPItem*> x;
+ items = get_all_items(x, dt->currentLayer(), dt, onlyvisible, onlysensitive, FALSE, exclude);
break;
}
default: {
- items = get_all_items(NULL, dt->currentRoot(), dt, onlyvisible, onlysensitive, FALSE, exclude);
+ std::vector<SPItem*> x;
+ items = get_all_items(x, dt->currentRoot(), dt, onlyvisible, onlysensitive, FALSE, exclude);
break;
}
}
selection->setList(items);
- if (items) {
- g_slist_free(items);
- }
}
void sp_edit_select_all(SPDesktop *desktop)
@@ -690,16 +675,16 @@ void sp_edit_invert_in_all_layers(SPDesktop *desktop)
sp_edit_select_all_full(desktop, true, true);
}
-static void sp_selection_group_impl(GSList *p, Inkscape::XML::Node *group, Inkscape::XML::Document *xml_doc, SPDocument *doc) {
+static void sp_selection_group_impl(std::vector<Inkscape::XML::Node*> p, Inkscape::XML::Node *group, Inkscape::XML::Document *xml_doc, SPDocument *doc) {
- p = g_slist_sort(p, (GCompareFunc) sp_repr_compare_position);
+ sort(p.begin(),p.end(),sp_repr_compare_position_bool);
// Remember the position and parent of the topmost object.
- gint topmost = (static_cast<Inkscape::XML::Node *>(g_slist_last(p)->data))->position();
- Inkscape::XML::Node *topmost_parent = (static_cast<Inkscape::XML::Node *>(g_slist_last(p)->data))->parent();
+ gint topmost = p.back()->position();
+ Inkscape::XML::Node *topmost_parent = p.back()->parent();
- while (p) {
- Inkscape::XML::Node *current = static_cast<Inkscape::XML::Node *>(p->data);
+ for(std::vector<Inkscape::XML::Node*>::const_iterator i = p.begin(); i != p.end(); i++){
+ Inkscape::XML::Node *current = *i;
if (current->parent() == topmost_parent) {
Inkscape::XML::Node *spnew = current->duplicate(xml_doc);
@@ -708,7 +693,7 @@ static void sp_selection_group_impl(GSList *p, Inkscape::XML::Node *group, Inksc
Inkscape::GC::release(spnew);
topmost --; // only reduce count for those items deleted from topmost_parent
} else { // move it to topmost_parent first
- GSList *temp_clip = NULL;
+ std::vector<Inkscape::XML::Node*> temp_clip;
// At this point, current may already have no item, due to its being a clone whose original is already moved away
// So we copy it artificially calculating the transform from its repr->attr("transform") and the parent transform
@@ -724,15 +709,15 @@ static void sp_selection_group_impl(GSList *p, Inkscape::XML::Node *group, Inksc
// then, if this is clone, looking up its original in that array and pre-multiplying
// it by the inverse of that original's transform diff.
- sp_selection_copy_one(current, item_t, &temp_clip, xml_doc);
+ sp_selection_copy_one(current, item_t, temp_clip, xml_doc);
sp_repr_unparent(current);
// paste into topmost_parent (temporarily)
- GSList *copied = sp_selection_paste_impl(doc, doc->getObjectByRepr(topmost_parent), &temp_clip);
- if (temp_clip) g_slist_free(temp_clip);
- if (copied) { // if success,
+ std::vector<Inkscape::XML::Node*> copied = sp_selection_paste_impl(doc, doc->getObjectByRepr(topmost_parent), temp_clip);
+ if (!temp_clip.empty())temp_clip.clear() ;
+ if (!copied.empty()) { // if success,
// take pasted object (now in topmost_parent)
- Inkscape::XML::Node *in_topmost = static_cast<Inkscape::XML::Node *>(copied->data);
+ Inkscape::XML::Node *in_topmost = copied.back();
// make a copy
Inkscape::XML::Node *spnew = in_topmost->duplicate(xml_doc);
// remove pasted
@@ -740,10 +725,9 @@ static void sp_selection_group_impl(GSList *p, Inkscape::XML::Node *group, Inksc
// put its copy into group
group->appendChild(spnew);
Inkscape::GC::release(spnew);
- g_slist_free(copied);
+ copied.clear();
}
}
- p = g_slist_remove(p, current);
}
// Add the new group to the topmost members' parent
@@ -764,9 +748,7 @@ void sp_selection_group(Inkscape::Selection *selection, SPDesktop *desktop)
return;
}
- GSList const *l = const_cast<GSList *>(selection->reprList());
-
- GSList *p = g_slist_copy(const_cast<GSList *>(l));
+ std::vector<Inkscape::XML::Node*> p (selection->reprList());
selection->clear();
@@ -802,11 +784,11 @@ void sp_selection_ungroup(Inkscape::Selection *selection, SPDesktop *desktop)
}
// first check whether there is anything to ungroup
- GSList *old_select = const_cast<GSList *>(selection->itemList());
- GSList *new_select = NULL;
+ std::vector<SPItem*> old_select = selection->itemList();
+ std::vector<SPItem*> new_select;
GSList *groups = NULL;
- for (GSList *item = old_select; item; item = item->next) {
- SPItem *obj = static_cast<SPItem*>(item->data);
+ for (std::vector<SPItem*>::const_iterator item = old_select.begin(); item!=old_select.end(); item++) {
+ SPItem *obj = *item;
if (dynamic_cast<SPGroup *>(obj)) {
groups = g_slist_prepend(groups, obj);
}
@@ -818,14 +800,14 @@ void sp_selection_ungroup(Inkscape::Selection *selection, SPDesktop *desktop)
return;
}
- GSList *items = g_slist_copy(old_select);
+ std::vector<SPItem*> items(old_select);
selection->clear();
// If any of the clones refer to the groups, unlink them and replace them with successors
// in the items list.
GSList *clones_to_unlink = NULL;
- for (GSList *item = items; item; item = item->next) {
- SPUse *use = dynamic_cast<SPUse *>(static_cast<SPItem *>(item->data));
+ for (std::vector<SPItem*>::const_iterator item = items.begin(); item != items.end(); item++) {
+ SPUse *use = dynamic_cast<SPUse *>(*item);
SPItem *original = use;
while (dynamic_cast<SPUse *>(original)) {
@@ -833,7 +815,7 @@ void sp_selection_ungroup(Inkscape::Selection *selection, SPDesktop *desktop)
}
if (g_slist_find(groups, original) != NULL) {
- clones_to_unlink = g_slist_prepend(clones_to_unlink, item->data);
+ clones_to_unlink = g_slist_prepend(clones_to_unlink, *item);
}
}
@@ -844,57 +826,53 @@ void sp_selection_ungroup(Inkscape::Selection *selection, SPDesktop *desktop)
for (GSList *item = clones_to_unlink; item; item = item->next) {
SPUse *use = static_cast<SPUse *>(item->data);
- GSList *items_node = g_slist_find(items, item->data);
- items_node->data = use->unlink();
+ std::vector<SPItem*>::iterator items_node = std::find(items.begin(),items.end(), item->data);
+ *items_node = use->unlink();
}
g_slist_free(clones_to_unlink);
// do the actual work
- for (GSList *item = items; item; item = item->next) {
- SPItem *obj = static_cast<SPItem *>(item->data);
+ for (std::vector<SPItem*>::iterator item = items.begin(); item != items.end(); item++) {
+ SPItem *obj = *item;
// ungroup only the groups marked earlier
- if (g_slist_find(groups, item->data) != NULL) {
- GSList *children = NULL;
- sp_item_group_ungroup(dynamic_cast<SPGroup *>(obj), &children, false);
+ if (g_slist_find(groups, *item) != NULL) {
+ std::vector<SPItem*> children;
+ sp_item_group_ungroup(dynamic_cast<SPGroup *>(obj), children, false);
// add the items resulting from ungrouping to the selection
- new_select = g_slist_concat(new_select, children);
- item->data = NULL; // zero out the original pointer, which is no longer valid
+ new_select.insert(new_select.end(),children.begin(),children.end());
+ *item = NULL; // zero out the original pointer, which is no longer valid
} else {
// if not a group, keep in the selection
- new_select = g_slist_append(new_select, item->data);
+ new_select.push_back(*item);
}
}
selection->addList(new_select);
- g_slist_free(new_select);
- g_slist_free(items);
DocumentUndo::done(selection->layers()->getDocument(), SP_VERB_SELECTION_UNGROUP,
_("Ungroup"));
}
/** Replace all groups in the list with their member objects, recursively; returns a new list, frees old */
-GSList *
-sp_degroup_list(GSList *items)
+std::vector<SPItem*>
+sp_degroup_list(std::vector<SPItem*> &items)
{
- GSList *out = NULL;
+ std::vector<SPItem*> out;
bool has_groups = false;
- for (GSList *item = items; item; item = item->next) {
- SPGroup *group = dynamic_cast<SPGroup *>(static_cast<SPObject *>(item->data));
+ for (std::vector<SPItem*>::const_iterator item=items.begin();item!=items.end();item++) {
+ SPGroup *group = dynamic_cast<SPGroup *>(*item);
if (!group) {
- out = g_slist_prepend(out, item->data);
+ out.push_back(*item);
} else {
has_groups = true;
- GSList *members = sp_item_group_item_list(group);
- for (GSList *member = members; member; member = member->next) {
- out = g_slist_prepend(out, member->data);
+ std::vector<SPItem*> members = sp_item_group_item_list(group);
+ for (std::vector<SPItem*>::const_iterator member=members.begin();member!=members.end();member++) {
+ out.push_back(*member);
}
- g_slist_free(members);
+ members.clear();
}
}
- out = g_slist_reverse(out);
- g_slist_free(items);
if (has_groups) { // recurse if we unwrapped a group - it may have contained others
out = sp_degroup_list(out);
@@ -906,18 +884,19 @@ sp_degroup_list(GSList *items)
/** If items in the list have a common parent, return it, otherwise return NULL */
static SPGroup *
-sp_item_list_common_parent_group(GSList const *items)
+sp_item_list_common_parent_group(std::vector<SPItem*> const items)
{
- if (!items) {
+ if (items.empty()) {
return NULL;
}
- SPObject *parent = SP_OBJECT(items->data)->parent;
+ SPObject *parent = items[0]->parent;
// Strictly speaking this CAN happen, if user selects <svg> from Inkscape::XML editor
if (!dynamic_cast<SPGroup *>(parent)) {
return NULL;
}
- for (items = items->next; items; items = items->next) {
- if (SP_OBJECT(items->data)->parent != parent) {
+ for (std::vector<SPItem*>::const_iterator item=items.begin();item!=items.end();item++) {
+ if((*item)==items[0])continue;
+ if ((*item)->parent != parent) {
return NULL;
}
}
@@ -927,13 +906,13 @@ sp_item_list_common_parent_group(GSList const *items)
/** Finds out the minimum common bbox of the selected items. */
static Geom::OptRect
-enclose_items(GSList const *items)
+enclose_items(std::vector<SPItem*> const &items)
{
- g_assert(items != NULL);
+ g_assert(!items.empty());
Geom::OptRect r;
- for (GSList const *i = items; i; i = i->next) {
- r.unionWith(static_cast<SPItem *>(i->data)->desktopVisualBounds());
+ for (std::vector<SPItem*>::const_iterator i = items.begin();i!=items.end();i++) {
+ r.unionWith((*i)->desktopVisualBounds());
}
return r;
}
@@ -948,11 +927,17 @@ static SPObject *prev_sibling(SPObject *child)
return prev;
}
+bool sp_item_repr_compare_position_bool(SPObject const *first, SPObject const *second)
+{
+ return sp_repr_compare_position(((SPItem*)first)->getRepr(),
+ ((SPItem*)second)->getRepr())<0;
+}
+
void
sp_selection_raise(Inkscape::Selection *selection, SPDesktop *desktop)
{
- GSList const *items = const_cast<GSList *>(selection->itemList());
- if (!items) {
+ std::vector<SPItem*> items= selection->itemList();
+ if (items.empty()) {
selection_display_message(desktop, Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to raise."));
return;
}
@@ -966,16 +951,16 @@ sp_selection_raise(Inkscape::Selection *selection, SPDesktop *desktop)
Inkscape::XML::Node *grepr = const_cast<Inkscape::XML::Node *>(group->getRepr());
/* Construct reverse-ordered list of selected children. */
- GSList *rev = g_slist_copy(const_cast<GSList *>(items));
- rev = g_slist_sort(rev, (GCompareFunc) sp_item_repr_compare_position);
+ std::vector<SPItem*> rev(items);
+ sort(rev.begin(),rev.end(),sp_item_repr_compare_position_bool);
// Determine the common bbox of the selected items.
Geom::OptRect selected = enclose_items(items);
// Iterate over all objects in the selection (starting from top).
if (selected) {
- while (rev) {
- SPObject *child = reinterpret_cast<SPObject*>(rev->data);
+ for (std::vector<SPItem*>::const_iterator item=rev.begin();item!=rev.end();item++) {
+ SPObject *child = *item;
// for each selected object, find the next sibling
for (SPObject *newref = child->next; newref; newref = newref->next) {
// if the sibling is an item AND overlaps our selection,
@@ -984,7 +969,7 @@ sp_selection_raise(Inkscape::Selection *selection, SPDesktop *desktop)
Geom::OptRect newref_bbox = newItem->desktopVisualBounds();
if ( newref_bbox && selected->intersects(*newref_bbox) ) {
// AND if it's not one of our selected objects,
- if (!g_slist_find(const_cast<GSList *>(items), newref)) {
+ if ( std::find(items.begin(),items.end(),newref)==items.end()) {
// move the selected object after that sibling
grepr->changeOrder(child->getRepr(), newref->getRepr());
}
@@ -992,12 +977,8 @@ sp_selection_raise(Inkscape::Selection *selection, SPDesktop *desktop)
}
}
}
- rev = g_slist_remove(rev, child);
}
- } else {
- g_slist_free(rev);
}
-
DocumentUndo::done(selection->layers()->getDocument(), SP_VERB_SELECTION_RAISE,
//TRANSLATORS: "Raise" means "to raise an object" in the undo history
C_("Undo action", "Raise"));
@@ -1012,7 +993,7 @@ void sp_selection_raise_to_top(Inkscape::Selection *selection, SPDesktop *deskto
return;
}
- GSList const *items = const_cast<GSList *>(selection->itemList());
+ std::vector<SPItem*> items = selection->itemList();
SPGroup const *group = sp_item_list_common_parent_group(items);
if (!group) {
@@ -1020,24 +1001,22 @@ void sp_selection_raise_to_top(Inkscape::Selection *selection, SPDesktop *deskto
return;
}
- GSList *rl = g_slist_copy(const_cast<GSList *>(selection->reprList()));
- rl = g_slist_sort(rl, (GCompareFunc) sp_repr_compare_position);
+ std::vector<Inkscape::XML::Node*> rl(selection->reprList());
+ sort(rl.begin(),rl.end(),sp_repr_compare_position_bool);
- for (GSList *l = rl; l != NULL; l = l->next) {
- Inkscape::XML::Node *repr = static_cast<Inkscape::XML::Node *>(l->data);
+ for (std::vector<Inkscape::XML::Node*>::const_iterator l=rl.begin(); l!=rl.end();l++) {
+ Inkscape::XML::Node *repr =(*l);
repr->setPosition(-1);
}
- g_slist_free(rl);
-
DocumentUndo::done(document, SP_VERB_SELECTION_TO_FRONT,
_("Raise to top"));
}
void sp_selection_lower(Inkscape::Selection *selection, SPDesktop *desktop)
{
- GSList const *items = const_cast<GSList *>(selection->itemList());
- if (!items) {
+ std::vector<SPItem*> items = selection->itemList();
+ if (items.empty()) {
selection_display_message(desktop, Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to lower."));
return;
}
@@ -1054,14 +1033,13 @@ void sp_selection_lower(Inkscape::Selection *selection, SPDesktop *desktop)
Geom::OptRect selected = enclose_items(items);
/* Construct direct-ordered list of selected children. */
- GSList *rev = g_slist_copy(const_cast<GSList *>(items));
- rev = g_slist_sort(rev, (GCompareFunc) sp_item_repr_compare_position);
- rev = g_slist_reverse(rev);
+ std::vector<SPItem*> rev(items);
+ sort(rev.begin(),rev.end(),sp_item_repr_compare_position_bool);
// Iterate over all objects in the selection (starting from top).
if (selected) {
- while (rev) {
- SPObject *child = reinterpret_cast<SPObject*>(rev->data);
+ for (std::vector<SPItem*>::const_reverse_iterator item=rev.rbegin();item!=rev.rend();item++) {
+ SPObject *child = *item;
// for each selected object, find the prev sibling
for (SPObject *newref = prev_sibling(child); newref; newref = prev_sibling(newref)) {
// if the sibling is an item AND overlaps our selection,
@@ -1070,7 +1048,7 @@ void sp_selection_lower(Inkscape::Selection *selection, SPDesktop *desktop)
Geom::OptRect ref_bbox = newItem->desktopVisualBounds();
if ( ref_bbox && selected->intersects(*ref_bbox) ) {
// AND if it's not one of our selected objects,
- if (!g_slist_find(const_cast<GSList *>(items), newref)) {
+ if (items.end()==std::find(items.begin(),items.end(),newref)) {
// move the selected object before that sibling
SPObject *put_after = prev_sibling(newref);
if (put_after)
@@ -1082,10 +1060,7 @@ void sp_selection_lower(Inkscape::Selection *selection, SPDesktop *desktop)
}
}
}
- rev = g_slist_remove(rev, child);
}
- } else {
- g_slist_free(rev);
}
DocumentUndo::done(selection->layers()->getDocument(), SP_VERB_SELECTION_LOWER,
@@ -1102,7 +1077,7 @@ void sp_selection_lower_to_bottom(Inkscape::Selection *selection, SPDesktop *des
return;
}
- GSList const *items = const_cast<GSList *>(selection->itemList());
+ std::vector<SPItem*> items =selection->itemList();
SPGroup const *group = sp_item_list_common_parent_group(items);
if (!group) {
@@ -1110,15 +1085,13 @@ void sp_selection_lower_to_bottom(Inkscape::Selection *selection, SPDesktop *des
return;
}
- GSList *rl;
- rl = g_slist_copy(const_cast<GSList *>(selection->reprList()));
- rl = g_slist_sort(rl, (GCompareFunc) sp_repr_compare_position);
- rl = g_slist_reverse(rl);
+ std::vector<Inkscape::XML::Node*> rl(selection->reprList());
+ sort(rl.begin(),rl.end(),sp_repr_compare_position_bool);
- for (GSList *l = rl; l != NULL; l = l->next) {
+ for (std::vector<Inkscape::XML::Node*>::const_reverse_iterator l=rl.rbegin();l!=rl.rend();l++) {
gint minpos;
SPObject *pp, *pc;
- Inkscape::XML::Node *repr = static_cast<Inkscape::XML::Node *>(l->data);
+ Inkscape::XML::Node *repr = (*l);
pp = document->getObjectByRepr(repr->parent());
minpos = 0;
g_assert(dynamic_cast<SPGroup *>(pp));
@@ -1130,8 +1103,6 @@ void sp_selection_lower_to_bottom(Inkscape::Selection *selection, SPDesktop *des
repr->setPosition(minpos);
}
- g_slist_free(rl);
-
DocumentUndo::done(document, SP_VERB_SELECTION_TO_BACK,
_("Lower to bottom"));
}
@@ -1269,9 +1240,9 @@ void sp_selection_remove_livepatheffect(SPDesktop *desktop)
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to remove live path effects from."));
return;
}
-
- for ( GSList const *itemlist = selection->itemList(); itemlist != NULL; itemlist = g_slist_next(itemlist) ) {
- SPItem *item = reinterpret_cast<SPItem*>(itemlist->data);
+ std::vector<SPItem*> list=selection->itemList();
+ for ( std::vector<SPItem*>::const_iterator itemlist=list.begin();itemlist!=list.end();itemlist++) {
+ SPItem *item = *itemlist;
sp_selection_remove_livepatheffect_impl(item);
@@ -1325,10 +1296,10 @@ void sp_selection_paste_size_separately(SPDesktop *desktop, bool apply_x, bool a
* Ensures that the clones of objects are not modified when moving objects between layers.
* Calls the same function as ungroup
*/
-void sp_selection_change_layer_maintain_clones(GSList const *items,SPObject *where)
+void sp_selection_change_layer_maintain_clones(std::vector<SPItem*> const &items,SPObject *where)
{
- for (const GSList *i = items; i != NULL; i = i->next) {
- SPItem *item = dynamic_cast<SPItem *>(SP_OBJECT(i->data));
+ for (std::vector<SPItem*>::const_iterator i = items.begin(); i != items.end(); i++) {
+ SPItem *item = *i;
if (item) {
SPItem *oldparent = dynamic_cast<SPItem *>(item->parent);
SPItem *newparent = dynamic_cast<SPItem *>(where);
@@ -1350,26 +1321,24 @@ void sp_selection_to_next_layer(SPDesktop *dt, bool suppressDone)
return;
}
- GSList const *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
+ std::vector<SPItem*> items(selection->itemList());
bool no_more = false; // Set to true, if no more layers above
SPObject *next=Inkscape::next_layer(dt->currentRoot(), dt->currentLayer());
if (next) {
sp_selection_change_layer_maintain_clones(items,next);
- GSList *temp_clip = NULL;
- sp_selection_copy_impl(items, &temp_clip, dt->doc()->getReprDoc());
+ std::vector<Inkscape::XML::Node*> temp_clip;
+ sp_selection_copy_impl(items, temp_clip, dt->doc()->getReprDoc());
sp_selection_delete_impl(items, false, false);
next=Inkscape::next_layer(dt->currentRoot(), dt->currentLayer()); // Fixes bug 1482973: crash while moving layers
- GSList *copied;
+ std::vector<Inkscape::XML::Node*> copied;
if (next) {
- copied = sp_selection_paste_impl(dt->getDocument(), next, &temp_clip);
+ copied = sp_selection_paste_impl(dt->getDocument(), next, temp_clip);
} else {
- copied = sp_selection_paste_impl(dt->getDocument(), dt->currentLayer(), &temp_clip);
+ copied = sp_selection_paste_impl(dt->getDocument(), dt->currentLayer(), temp_clip);
no_more = true;
}
- selection->setReprList((GSList const *) copied);
- g_slist_free(copied);
- if (temp_clip) g_slist_free(temp_clip);
+ selection->setReprList(copied);
if (next) dt->setCurrentLayer(next);
if ( !suppressDone ) {
DocumentUndo::done(dt->getDocument(), SP_VERB_LAYER_MOVE_TO_NEXT,
@@ -1383,7 +1352,6 @@ void sp_selection_to_next_layer(SPDesktop *dt, bool suppressDone)
dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No more layers above."));
}
- g_slist_free(const_cast<GSList *>(items));
}
void sp_selection_to_prev_layer(SPDesktop *dt, bool suppressDone)
@@ -1396,26 +1364,24 @@ void sp_selection_to_prev_layer(SPDesktop *dt, bool suppressDone)
return;
}
- GSList const *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
+ const std::vector<SPItem*> items(selection->itemList());
bool no_more = false; // Set to true, if no more layers below
SPObject *next=Inkscape::previous_layer(dt->currentRoot(), dt->currentLayer());
if (next) {
sp_selection_change_layer_maintain_clones(items,next);
- GSList *temp_clip = NULL;
- sp_selection_copy_impl(items, &temp_clip, dt->doc()->getReprDoc()); // we're in the same doc, so no need to copy defs
+ std::vector<Inkscape::XML::Node*> temp_clip;
+ sp_selection_copy_impl(items, temp_clip, dt->doc()->getReprDoc()); // we're in the same doc, so no need to copy defs
sp_selection_delete_impl(items, false, false);
next=Inkscape::previous_layer(dt->currentRoot(), dt->currentLayer()); // Fixes bug 1482973: crash while moving layers
- GSList *copied;
+ std::vector<Inkscape::XML::Node*> copied;
if (next) {
- copied = sp_selection_paste_impl(dt->getDocument(), next, &temp_clip);
+ copied = sp_selection_paste_impl(dt->getDocument(), next, temp_clip);
} else {
- copied = sp_selection_paste_impl(dt->getDocument(), dt->currentLayer(), &temp_clip);
+ copied = sp_selection_paste_impl(dt->getDocument(), dt->currentLayer(), temp_clip);
no_more = true;
}
- selection->setReprList((GSList const *) copied);
- g_slist_free(copied);
- if (temp_clip) g_slist_free(temp_clip);
+ selection->setReprList( copied);
if (next) dt->setCurrentLayer(next);
if ( !suppressDone ) {
DocumentUndo::done(dt->getDocument(), SP_VERB_LAYER_MOVE_TO_PREV,
@@ -1428,8 +1394,6 @@ void sp_selection_to_prev_layer(SPDesktop *dt, bool suppressDone)
if (no_more) {
dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No more layers below."));
}
-
- g_slist_free(const_cast<GSList *>(items));
}
void sp_selection_to_layer(SPDesktop *dt, SPObject *moveto, bool suppressDone)
@@ -1442,25 +1406,22 @@ void sp_selection_to_layer(SPDesktop *dt, SPObject *moveto, bool suppressDone)
return;
}
- GSList const *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
+ std::vector<SPItem*> items(selection->itemList());
if (moveto) {
sp_selection_change_layer_maintain_clones(items,moveto);
- GSList *temp_clip = NULL;
- sp_selection_copy_impl(items, &temp_clip, dt->doc()->getReprDoc()); // we're in the same doc, so no need to copy defs
+ std::vector<Inkscape::XML::Node*> temp_clip;
+ sp_selection_copy_impl(items, temp_clip, dt->doc()->getReprDoc()); // we're in the same doc, so no need to copy defs
sp_selection_delete_impl(items, false, false);
- GSList *copied = sp_selection_paste_impl(dt->getDocument(), moveto, &temp_clip);
- selection->setReprList((GSList const *) copied);
- g_slist_free(copied);
- if (temp_clip) g_slist_free(temp_clip);
+ std::vector<Inkscape::XML::Node*> copied = sp_selection_paste_impl(dt->getDocument(), moveto, temp_clip);
+ selection->setReprList(copied);
+ if (!temp_clip.empty()) temp_clip.clear();
if (moveto) dt->setCurrentLayer(moveto);
if ( !suppressDone ) {
DocumentUndo::done(dt->getDocument(), SP_VERB_LAYER_MOVE_TO,
_("Move selection to layer"));
}
}
-
- g_slist_free(const_cast<GSList *>(items));
}
static bool
@@ -1495,8 +1456,9 @@ static bool
selection_contains_both_clone_and_original(Inkscape::Selection *selection)
{
bool clone_with_original = false;
- for (GSList const *l = selection->itemList(); l != NULL; l = l->next) {
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(l->data));
+ std::vector<SPItem*> items = selection->itemList();
+ for (std::vector<SPItem*>::const_iterator l=items.begin();l!=items.end() ;l++) {
+ SPItem *item = *l;
if (item) {
clone_with_original |= selection_contains_original(item, selection);
if (clone_with_original)
@@ -1539,9 +1501,9 @@ void sp_selection_apply_affine(Inkscape::Selection *selection, Geom::Affine cons
persp3d_apply_affine_transformation(transf_persp, affine);
}
-
- for (GSList const *l = selection->itemList(); l != NULL; l = l->next) {
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(l->data));
+ std::vector<SPItem*> items = selection->itemList();
+ for (std::vector<SPItem*>::const_iterator l=items.begin();l!=items.end() ;l++) {
+ SPItem *item = *l;
if( dynamic_cast<SPRoot *>(item) ) {
// An SVG element cannot have a transform. We could change 'x' and 'y' in response
@@ -1710,10 +1672,9 @@ void sp_selection_remove_transform(SPDesktop *desktop)
Inkscape::Selection *selection = desktop->getSelection();
- GSList const *l = const_cast<GSList *>(selection->reprList());
- while (l != NULL) {
- ((Inkscape::XML::Node*)l->data)->setAttribute("transform", NULL, false);
- l = l->next;
+ std::vector<Inkscape::XML::Node*> items = selection->reprList();
+ for (std::vector<Inkscape::XML::Node*>::const_iterator l=items.begin();l!=items.end() ;l++) {
+ (*l)->setAttribute("transform", NULL, false);
}
DocumentUndo::done(desktop->getDocument(), SP_VERB_OBJECT_FLATTEN,
@@ -1811,10 +1772,10 @@ void sp_selection_rotate_90(SPDesktop *desktop, bool ccw)
if (selection->isEmpty())
return;
- GSList const *l = selection->itemList();
+ std::vector<SPItem*> items = selection->itemList();
Geom::Rotate const rot_90(Geom::Point(0, ccw ? 1 : -1)); // pos. or neg. rotation, depending on the value of ccw
- for (GSList const *l2 = l ; l2 != NULL ; l2 = l2->next) {
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(l2->data));
+ for (std::vector<SPItem*>::const_iterator l=items.begin();l!=items.end() ;l++) {
+ SPItem *item = *l;
if (item) {
sp_item_rotate_rel(item, rot_90);
} else {
@@ -1870,15 +1831,24 @@ void sp_select_same_fill_stroke_style(SPDesktop *desktop, gboolean fill, gboolea
bool onlyvisible = prefs->getBool("/options/kbselection/onlyvisible", true);
bool onlysensitive = prefs->getBool("/options/kbselection/onlysensitive", true);
bool ingroups = TRUE;
-
- GSList *all_list = get_all_items(NULL, desktop->currentRoot(), desktop, onlyvisible, onlysensitive, ingroups, NULL);
- GSList *all_matches = NULL;
+ std::vector<SPItem*> x,y;
+ std::vector<SPItem*> all_list = get_all_items(x, desktop->currentRoot(), desktop, onlyvisible, onlysensitive, ingroups, y);
+ std::vector<SPItem*> all_matches;
Inkscape::Selection *selection = desktop->getSelection();
+ std::vector<SPItem*> items = selection->itemList();
+
+ std::vector<SPItem*> tmp;
+ for (std::vector<SPItem*>::const_iterator iter=all_list.begin();iter!=all_list.end();iter++) {
+ if(!SP_IS_GROUP(*iter)){
+ tmp.push_back(*iter);
+ }
+ }
+ all_list=tmp;
- for (GSList const* sel_iter = selection->itemList(); sel_iter; sel_iter = sel_iter->next) {
- SPItem *sel = dynamic_cast<SPItem *>(static_cast<SPObject *>(sel_iter->data));
- GSList *matches = all_list;
+ for (std::vector<SPItem*>::const_iterator sel_iter=items.begin();sel_iter!=items.end();sel_iter++) {
+ SPItem *sel = *sel_iter;
+ std::vector<SPItem*> matches = all_list;
if (fill && stroke && style) {
matches = sp_get_same_style(sel, matches);
}
@@ -1891,19 +1861,12 @@ void sp_select_same_fill_stroke_style(SPDesktop *desktop, gboolean fill, gboolea
else if (style) {
matches = sp_get_same_style(sel, matches,SP_STROKE_STYLE_ALL);
}
- all_matches = g_slist_concat (all_matches, matches);
+ all_matches.insert(all_matches.end(), matches.begin(),matches.end());
}
selection->clear();
selection->setList(all_matches);
- if (all_matches) {
- g_slist_free(all_matches);
- }
- if (all_list) {
- g_slist_free(all_list);
- }
-
}
@@ -1924,14 +1887,15 @@ void sp_select_same_object_type(SPDesktop *desktop)
bool onlyvisible = prefs->getBool("/options/kbselection/onlyvisible", true);
bool onlysensitive = prefs->getBool("/options/kbselection/onlysensitive", true);
bool ingroups = TRUE;
-
- GSList *all_list = get_all_items(NULL, desktop->currentRoot(), desktop, onlyvisible, onlysensitive, ingroups, NULL);
- GSList *matches = all_list;
+ std::vector<SPItem*> x,y;
+ std::vector<SPItem*> all_list = get_all_items(x, desktop->currentRoot(), desktop, onlyvisible, onlysensitive, ingroups, y);
+ std::vector<SPItem*> matches = all_list;
Inkscape::Selection *selection = desktop->getSelection();
- for (GSList const* sel_iter = selection->itemList(); sel_iter; sel_iter = sel_iter->next) {
- SPItem *sel = dynamic_cast<SPItem *>(static_cast<SPObject *>(sel_iter->data));
+ std::vector<SPItem*> items=selection->itemList();
+ for (std::vector<SPItem*>::const_iterator sel_iter=items.begin();sel_iter!=items.end();sel_iter++) {
+ SPItem *sel = *sel_iter;
if (sel) {
matches = sp_get_same_object_type(sel, matches);
} else {
@@ -1942,12 +1906,6 @@ void sp_select_same_object_type(SPDesktop *desktop)
selection->clear();
selection->setList(matches);
- if (matches) {
- g_slist_free(matches);
- }
- if (all_list) {
- g_slist_free(all_list);
- }
}
@@ -1956,15 +1914,15 @@ void sp_select_same_object_type(SPDesktop *desktop)
* Find all items in src list that have the same fill or stroke style as sel
* Return the list of matching items
*/
-GSList *sp_get_same_fill_or_stroke_color(SPItem *sel, GSList *src, SPSelectStrokeStyleType type)
+std::vector<SPItem*> sp_get_same_fill_or_stroke_color(SPItem *sel, std::vector<SPItem*> &src, SPSelectStrokeStyleType type)
{
- GSList *matches = NULL;
+ std::vector<SPItem*> matches ;
gboolean match = false;
SPIPaint *sel_paint = (type == SP_FILL_COLOR) ? &(sel->style->fill) : &(sel->style->stroke);
- for (GSList *i = src; i != NULL; i = i->next) {
- SPItem *iter = dynamic_cast<SPItem *>(static_cast<SPObject *>(i->data));
+ for (std::vector<SPItem*>::const_reverse_iterator i=src.rbegin();i!=src.rend();i++) {
+ SPItem *iter = *i;
if (iter) {
SPIPaint *iter_paint = (type == SP_FILL_COLOR) ? &(iter->style->fill) : &(iter->style->stroke);
match = false;
@@ -2003,7 +1961,7 @@ GSList *sp_get_same_fill_or_stroke_color(SPItem *sel, GSList *src, SPSelectStrok
}
if (match) {
- matches = g_slist_prepend(matches, iter);
+ matches.push_back(iter);
}
} else {
g_assert_not_reached();
@@ -2054,17 +2012,16 @@ static bool item_type_match (SPItem *i, SPItem *j)
* Find all items in src list that have the same object type as sel by type
* Return the list of matching items
*/
-GSList *sp_get_same_object_type(SPItem *sel, GSList *src)
+std::vector<SPItem*> sp_get_same_object_type(SPItem *sel, std::vector<SPItem*> &src)
{
- GSList *matches = NULL;
+ std::vector<SPItem*> matches;
- for (GSList *i = src; i != NULL; i = i->next) {
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(i->data));
+ for (std::vector<SPItem*>::const_reverse_iterator i=src.rbegin();i!=src.rend();i++) {
+ SPItem *item = *i;
if (item && item_type_match(sel, item) && !item->cloned) {
- matches = g_slist_prepend (matches, item);
+ matches.push_back(item);
}
}
-
return matches;
}
@@ -2074,9 +2031,9 @@ GSList *sp_get_same_fill_or_stroke_color(SPItem *sel, GSList *src, SPSelectStrok
* Find all items in src list that have the same stroke style as sel by type
* Return the list of matching items
*/
-GSList *sp_get_same_style(SPItem *sel, GSList *src, SPSelectStrokeStyleType type)
+std::vector<SPItem*> sp_get_same_style(SPItem *sel, std::vector<SPItem*> &src, SPSelectStrokeStyleType type)
{
- GSList *matches = NULL;
+ std::vector<SPItem*> matches;
bool match = false;
SPStyle *sel_style = sel->style;
@@ -2092,16 +2049,16 @@ GSList *sp_get_same_style(SPItem *sel, GSList *src, SPSelectStrokeStyleType type
* Stroke width needs to handle transformations, so call this function
* to get the transformed stroke width
*/
- GSList *objects = NULL;
+ std::vector<SPItem*> objects;
SPStyle *sel_style_for_width = NULL;
if (type == SP_STROKE_STYLE_WIDTH || type == SP_STROKE_STYLE_ALL || type==SP_STYLE_ALL ) {
- objects = g_slist_prepend(objects, sel);
+ objects.push_back(sel);
sel_style_for_width = new SPStyle(SP_ACTIVE_DOCUMENT);
objects_query_strokewidth (objects, sel_style_for_width);
}
bool match_g;
- for (GSList *i = src; i != NULL; i = i->next) {
- SPItem *iter = dynamic_cast<SPItem *>(static_cast<SPObject *>(i->data));
+ for (std::vector<SPItem*>::const_iterator i=src.begin();i!=src.end();i++) {
+ SPItem *iter = *i;
if (iter) {
match_g=true;
SPStyle *iter_style = iter->style;
@@ -2110,15 +2067,14 @@ GSList *sp_get_same_style(SPItem *sel, GSList *src, SPSelectStrokeStyleType type
if (type == SP_STROKE_STYLE_WIDTH|| type == SP_STROKE_STYLE_ALL|| type==SP_STYLE_ALL) {
match = (sel_style->stroke_width.set == iter_style->stroke_width.set);
if (sel_style->stroke_width.set && iter_style->stroke_width.set) {
- GSList *objects = NULL;
- objects = g_slist_prepend(objects, iter);
+ std::vector<SPItem*> objects;
+ objects.insert(objects.begin(),iter);
SPStyle tmp_style(SP_ACTIVE_DOCUMENT);
objects_query_strokewidth (objects, &tmp_style);
if (sel_style_for_width) {
match = (sel_style_for_width->stroke_width.computed == tmp_style.stroke_width.computed);
}
- g_slist_free(objects);
}
}
match_g = match_g && match;
@@ -2141,10 +2097,10 @@ GSList *sp_get_same_style(SPItem *sel, GSList *src, SPSelectStrokeStyleType type
}
}
}
- match_g = match_g && match;
+ match_g = match_g && match;
if (match_g) {
while (iter->cloned) iter=dynamic_cast<SPItem *>(iter->parent);
- matches = g_slist_prepend(matches, iter);
+ matches.insert(matches.begin(),iter);
}
} else {
g_assert_not_reached();
@@ -2152,8 +2108,6 @@ GSList *sp_get_same_style(SPItem *sel, GSList *src, SPSelectStrokeStyleType type
}
if( sel_style_for_width != NULL ) delete sel_style_for_width;
- g_slist_free(objects);
-
return matches;
}
@@ -2307,17 +2261,9 @@ sp_selection_move_screen(Inkscape::Selection *selection, gdouble dx, gdouble dy)
}
}
-namespace {
-template <typename D>
-SPItem *next_item(SPDesktop *desktop, GSList *path, SPObject *root,
- bool only_in_viewport, PrefsSelectionContext inlayer, bool onlyvisible, bool onlysensitive);
-
-template <typename D>
-SPItem *next_item_from_list(SPDesktop *desktop, GSList const *items, SPObject *root,
- bool only_in_viewport, PrefsSelectionContext inlayer, bool onlyvisible, bool onlysensitive);
-struct Forward {
+typedef struct Forward {
typedef SPObject *Iterator;
static Iterator children(SPObject *o) { return o->firstChild(); }
@@ -2326,9 +2272,9 @@ struct Forward {
static SPObject *object(Iterator i) { return i; }
static Iterator next(Iterator i) { return i->getNext(); }
-};
+} Forward;
-struct ListReverse {
+typedef struct ListReverse {
typedef GSList *Iterator;
static Iterator children(SPObject *o) {
@@ -2359,8 +2305,87 @@ private:
}
return list;
}
-};
+} ListReverse;
+
+
+
+template <typename D>
+SPItem *next_item(SPDesktop *desktop, GSList *path, SPObject *root,
+ bool only_in_viewport, PrefsSelectionContext inlayer, bool onlyvisible, bool onlysensitive)
+{
+ typename D::Iterator children;
+ typename D::Iterator iter;
+
+ SPItem *found=NULL;
+
+ if (path) {
+ SPObject *object=reinterpret_cast<SPObject *>(path->data);
+ g_assert(object->parent == root);
+ if (desktop->isLayer(object)) {
+ found = next_item<D>(desktop, path->next, object, only_in_viewport, inlayer, onlyvisible, onlysensitive);
+ }
+ iter = children = D::siblings_after(object);
+ } else {
+ iter = children = D::children(root);
+ }
+
+ while ( iter && !found ) {
+ SPObject *object=D::object(iter);
+ if (desktop->isLayer(object)) {
+ if (PREFS_SELECTION_LAYER != inlayer) { // recurse into sublayers
+ found = next_item<D>(desktop, NULL, object, only_in_viewport, inlayer, onlyvisible, onlysensitive);
+ }
+ } else {
+ SPItem *item = dynamic_cast<SPItem *>(object);
+ if ( item &&
+ ( !only_in_viewport || desktop->isWithinViewport(item) ) &&
+ ( !onlyvisible || !desktop->itemIsHidden(item)) &&
+ ( !onlysensitive || !item->isLocked()) &&
+ !desktop->isLayer(item) )
+ {
+ found = item;
+ }
+ }
+ iter = D::next(iter);
+ }
+
+ D::dispose(children);
+
+ return found;
+}
+
+
+template <typename D>
+SPItem *next_item_from_list(SPDesktop *desktop, std::vector<SPItem*> const items,
+ SPObject *root, bool only_in_viewport, PrefsSelectionContext inlayer, bool onlyvisible, bool onlysensitive)
+{
+ SPObject *current=root;
+ for(std::vector<SPItem*>::const_iterator i = items.begin();i!=items.end();i++) {
+ SPItem *item = *i;
+ if ( root->isAncestorOf(item) &&
+ ( !only_in_viewport || desktop->isWithinViewport(item) ) )
+ {
+ current = item;
+ break;
+ }
+ }
+
+ GSList *path=NULL;
+ while ( current != root ) {
+ path = g_slist_prepend(path, current);
+ current = current->parent;
+ }
+
+ SPItem *next;
+ // first, try from the current object
+ next = next_item<D>(desktop, path, root, only_in_viewport, inlayer, onlyvisible, onlysensitive);
+ g_slist_free(path);
+
+ if (!next) { // if we ran out of objects, start over at the root
+ next = next_item<D>(desktop, NULL, root, only_in_viewport, inlayer, onlyvisible, onlysensitive);
+ }
+ return next;
}
void
@@ -2487,88 +2512,8 @@ void sp_selection_edit_clip_or_mask(SPDesktop * /*dt*/, bool /*clip*/)
}
-namespace {
-template <typename D>
-SPItem *next_item_from_list(SPDesktop *desktop, GSList const *items,
- SPObject *root, bool only_in_viewport, PrefsSelectionContext inlayer, bool onlyvisible, bool onlysensitive)
-{
- SPObject *current=root;
- while (items) {
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(items->data));
- if ( root->isAncestorOf(item) &&
- ( !only_in_viewport || desktop->isWithinViewport(item) ) )
- {
- current = item;
- break;
- }
- items = items->next;
- }
- GSList *path=NULL;
- while ( current != root ) {
- path = g_slist_prepend(path, current);
- current = current->parent;
- }
-
- SPItem *next;
- // first, try from the current object
- next = next_item<D>(desktop, path, root, only_in_viewport, inlayer, onlyvisible, onlysensitive);
- g_slist_free(path);
-
- if (!next) { // if we ran out of objects, start over at the root
- next = next_item<D>(desktop, NULL, root, only_in_viewport, inlayer, onlyvisible, onlysensitive);
- }
-
- return next;
-}
-
-template <typename D>
-SPItem *next_item(SPDesktop *desktop, GSList *path, SPObject *root,
- bool only_in_viewport, PrefsSelectionContext inlayer, bool onlyvisible, bool onlysensitive)
-{
- typename D::Iterator children;
- typename D::Iterator iter;
-
- SPItem *found=NULL;
-
- if (path) {
- SPObject *object=reinterpret_cast<SPObject *>(path->data);
- g_assert(object->parent == root);
- if (desktop->isLayer(object)) {
- found = next_item<D>(desktop, path->next, object, only_in_viewport, inlayer, onlyvisible, onlysensitive);
- }
- iter = children = D::siblings_after(object);
- } else {
- iter = children = D::children(root);
- }
-
- while ( iter && !found ) {
- SPObject *object=D::object(iter);
- if (desktop->isLayer(object)) {
- if (PREFS_SELECTION_LAYER != inlayer) { // recurse into sublayers
- found = next_item<D>(desktop, NULL, object, only_in_viewport, inlayer, onlyvisible, onlysensitive);
- }
- } else {
- SPItem *item = dynamic_cast<SPItem *>(object);
- if ( item &&
- ( !only_in_viewport || desktop->isWithinViewport(item) ) &&
- ( !onlyvisible || !desktop->itemIsHidden(item)) &&
- ( !onlysensitive || !item->isLocked()) &&
- !desktop->isLayer(item) )
- {
- found = item;
- }
- }
- iter = D::next(iter);
- }
-
- D::dispose(children);
-
- return found;
-}
-
-}
/**
* If \a item is not entirely visible then adjust visible area to centre on the centre on of
@@ -2608,17 +2553,17 @@ void sp_selection_clone(SPDesktop *desktop)
return;
}
- GSList *reprs = g_slist_copy(const_cast<GSList *>(selection->reprList()));
+ std::vector<Inkscape::XML::Node*> reprs (selection->reprList());
selection->clear();
// sorting items from different parents sorts each parent's subset without possibly mixing them, just what we need
- reprs = g_slist_sort(reprs, (GCompareFunc) sp_repr_compare_position);
+ sort(reprs.begin(),reprs.end(),sp_repr_compare_position_bool);
- GSList *newsel = NULL;
+ std::vector<Inkscape::XML::Node*> newsel;
- while (reprs) {
- Inkscape::XML::Node *sel_repr = static_cast<Inkscape::XML::Node *>(reprs->data);
+ for(std::vector<Inkscape::XML::Node*>::const_reverse_iterator i=reprs.rbegin();i!=reprs.rend();i++){
+ Inkscape::XML::Node *sel_repr = *i;
Inkscape::XML::Node *parent = sel_repr->parent();
Inkscape::XML::Node *clone = xml_doc->createElement("svg:use");
@@ -2634,8 +2579,7 @@ void sp_selection_clone(SPDesktop *desktop)
// add the new clone to the top of the original's parent
parent->appendChild(clone);
- newsel = g_slist_prepend(newsel, clone);
- reprs = g_slist_remove(reprs, sel_repr);
+ newsel.push_back(clone);
Inkscape::GC::release(clone);
}
@@ -2643,8 +2587,6 @@ void sp_selection_clone(SPDesktop *desktop)
C_("Action", "Clone"));
selection->setReprList(newsel);
-
- g_slist_free(newsel);
}
void
@@ -2670,11 +2612,9 @@ sp_selection_relink(SPDesktop *desktop)
// Get a copy of current selection.
bool relinked = false;
- for (GSList *items = const_cast<GSList *>(selection->itemList());
- items != NULL;
- items = items->next)
- {
- SPItem *item = static_cast<SPItem *>(items->data);
+ std::vector<SPItem*> items=selection->itemList();
+ for (std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ SPItem *item = *i;
if (dynamic_cast<SPUse *>(item)) {
item->getRepr()->setAttribute("xlink:href", newref);
@@ -2708,13 +2648,11 @@ sp_selection_unlink(SPDesktop *desktop)
}
// Get a copy of current selection.
- GSList *new_select = NULL;
+ std::vector<SPItem*> new_select;
bool unlinked = false;
- for (GSList *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
- items != NULL;
- items = items->next)
- {
- SPItem *item = static_cast<SPItem *>(items->data);
+ std::vector<SPItem*> items=selection->itemList();
+ for (std::vector<SPItem*>::const_reverse_iterator i=items.rbegin();i!=items.rend();i++){
+ SPItem *item = *i;
if (dynamic_cast<SPText *>(item)) {
SPObject *tspan = sp_tref_convert_to_tspan(item);
@@ -2730,7 +2668,7 @@ sp_selection_unlink(SPDesktop *desktop)
if (!(dynamic_cast<SPUse *>(item) || dynamic_cast<SPTRef *>(item))) {
// keep the non-use item in the new selection
- new_select = g_slist_prepend(new_select, item);
+ new_select.push_back(item);
continue;
}
@@ -2740,7 +2678,7 @@ sp_selection_unlink(SPDesktop *desktop)
unlink = use->unlink();
// Unable to unlink use (external or invalid href?)
if (!unlink) {
- new_select = g_slist_prepend(new_select, item);
+ new_select.push_back(item);
continue;
}
} else /*if (SP_IS_TREF(use))*/ {
@@ -2750,13 +2688,12 @@ sp_selection_unlink(SPDesktop *desktop)
unlinked = true;
// Add ungrouped items to the new selection.
- new_select = g_slist_prepend(new_select, unlink);
+ new_select.push_back(unlink);
}
- if (new_select) { // set new selection
+ if (!new_select.empty()) { // set new selection
selection->clear();
selection->setList(new_select);
- g_slist_free(new_select);
}
if (!unlinked) {
desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("<b>No clones to unlink</b> in the selection."));
@@ -2779,7 +2716,9 @@ sp_select_clone_original(SPDesktop *desktop)
gchar const *error = _("Select a <b>clone</b> to go to its original. Select a <b>linked offset</b> to go to its source. Select a <b>text on path</b> to go to the path. Select a <b>flowed text</b> to go to its frame.");
// Check if other than two objects are selected
- if (g_slist_length(const_cast<GSList *>(selection->itemList())) != 1 || !item) {
+
+ std::vector<SPItem*> items=selection->itemList();
+ if (items.size() != 1 || !item) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, error);
return;
}
@@ -2876,14 +2815,15 @@ void sp_selection_clone_original_path_lpe(SPDesktop *desktop)
Inkscape::SVGOStringStream os;
SPObject * firstItem = NULL;
- for (const GSList * item = selection->itemList(); item != NULL; item = item->next) {
- if (SP_IS_SHAPE(item->data) || SP_IS_TEXT(item->data)) {
+ std::vector<SPItem*> items=selection->itemList();
+ for (std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ if (SP_IS_SHAPE(*i) || SP_IS_TEXT(*i)) {
if (firstItem) {
os << "|";
} else {
- firstItem = SP_ITEM(item->data);
+ firstItem = SP_ITEM(*i);
}
- os << '#' << SP_ITEM(item->data)->getId() << ",0";
+ os << '#' << SP_ITEM(*i)->getId() << ",0";
}
}
if (firstItem) {
@@ -2960,12 +2900,12 @@ void sp_selection_to_marker(SPDesktop *desktop, bool apply)
Geom::Point center( *c - corner ); // As defined by rotation center
center[Geom::Y] = -center[Geom::Y];
- GSList *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
+ std::vector<SPItem*> items(selection->itemList());
//items = g_slist_sort(items, (GCompareFunc) sp_object_compare_position); // Why needed?
// bottommost object, after sorting
- SPObject *parent = SP_OBJECT(items->data)->parent;
+ SPObject *parent = items[0]->parent;
Geom::Affine parent_transform;
{
@@ -2978,10 +2918,10 @@ void sp_selection_to_marker(SPDesktop *desktop, bool apply)
}
// Create a list of duplicates, to be pasted inside marker element.
- GSList *repr_copies = NULL;
- for (GSList *i = items; i != NULL; i = i->next) {
- Inkscape::XML::Node *dup = SP_OBJECT(i->data)->getRepr()->duplicate(xml_doc);
- repr_copies = g_slist_prepend(repr_copies, dup);
+ std::vector<Inkscape::XML::Node*> repr_copies;
+ for (std::vector<SPItem*>::const_reverse_iterator i=items.rbegin();i!=items.rend();i++){
+ Inkscape::XML::Node *dup = (*i)->getRepr()->duplicate(xml_doc);
+ repr_copies.push_back(dup);
}
Geom::Rect bbox(desktop->dt2doc(r->min()), desktop->dt2doc(r->max()));
@@ -2989,8 +2929,8 @@ void sp_selection_to_marker(SPDesktop *desktop, bool apply)
if (apply) {
// Delete objects so that their clones don't get alerted;
// the objects will be restored inside the marker element.
- for (GSList *i = items; i != NULL; i = i->next) {
- SPObject *item = reinterpret_cast<SPObject*>(i->data);
+ for (std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ SPObject *item = *i;
item->deleteObject(false);
}
}
@@ -3009,7 +2949,6 @@ void sp_selection_to_marker(SPDesktop *desktop, bool apply)
prefs->setInt("/options/clonecompensation/value", saved_compensation);
- g_slist_free(items);
DocumentUndo::done(doc, SP_VERB_EDIT_SELECTION_2_MARKER,
_("Objects to marker"));
@@ -3018,8 +2957,9 @@ void sp_selection_to_marker(SPDesktop *desktop, bool apply)
static void sp_selection_to_guides_recursive(SPItem *item, bool wholegroups) {
SPGroup *group = dynamic_cast<SPGroup *>(item);
if (group && !dynamic_cast<SPBox3D *>(item) && !wholegroups) {
- for (GSList *i = sp_item_group_item_list(group); i != NULL; i = i->next) {
- sp_selection_to_guides_recursive(static_cast<SPItem*>(i->data), wholegroups);
+ std::vector<SPItem*> items=sp_item_group_item_list(group);
+ for (std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ sp_selection_to_guides_recursive(*i, wholegroups);
}
} else {
item->convert_to_guides();
@@ -3034,9 +2974,9 @@ void sp_selection_to_guides(SPDesktop *desktop)
SPDocument *doc = desktop->getDocument();
Inkscape::Selection *selection = desktop->getSelection();
// we need to copy the list because it gets reset when objects are deleted
- GSList *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
+ std::vector<SPItem*> items(selection->itemList());
- if (!items) {
+ if (items.empty()) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to convert to guides."));
return;
}
@@ -3049,8 +2989,8 @@ void sp_selection_to_guides(SPDesktop *desktop)
// and its entry in the selection list is invalid (crash).
// Therefore: first convert all, then delete all.
- for (GSList const *i = items; i != NULL; i = i->next) {
- sp_selection_to_guides_recursive(static_cast<SPItem*>(i->data), wholegroups);
+ for (std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ sp_selection_to_guides_recursive(*i, wholegroups);
}
if (deleteitems) {
@@ -3058,8 +2998,6 @@ void sp_selection_to_guides(SPDesktop *desktop)
sp_selection_delete_impl(items);
}
- g_slist_free(items);
-
DocumentUndo::done(doc, SP_VERB_EDIT_SELECTION_2_GUIDES, _("Objects to guides"));
}
@@ -3102,18 +3040,18 @@ void sp_selection_symbol(SPDesktop *desktop, bool /*apply*/ )
doc->ensureUpToDate();
- GSList *items = g_slist_copy(const_cast<GSList *>(selection->list()));
+ std::vector<SPObject*> items(selection->list());
// Keep track of parent, this is where <use> will be inserted.
- Inkscape::XML::Node *the_first_repr = reinterpret_cast<SPObject *>( items->data )->getRepr();
+ Inkscape::XML::Node *the_first_repr = items[0]->getRepr();
Inkscape::XML::Node *the_parent_repr = the_first_repr->parent();
// Find out if we have a single group
bool single_group = false;
SPGroup *the_group = NULL;
Geom::Affine transform;
- if( g_slist_length( items ) == 1 ) {
- SPObject *object = reinterpret_cast<SPObject *>( items->data );
+ if( items.size() == 1 ) {
+ SPObject *object = items[0];
the_group = dynamic_cast<SPGroup *>(object);
if ( the_group ) {
single_group = true;
@@ -3124,7 +3062,6 @@ void sp_selection_symbol(SPDesktop *desktop, bool /*apply*/ )
if( transform.isTranslation() ) {
// Create new list from group children.
- g_slist_free(items);
items = object->childList(false);
// Hack: Temporarily set clone compensation to unmoved, so that we can move clone-originals
@@ -3170,8 +3107,8 @@ void sp_selection_symbol(SPDesktop *desktop, bool /*apply*/ )
}
// Move selected items to new <symbol>
- for (GSList *i = items; i != NULL; i = i->next) {
- Inkscape::XML::Node *repr = SP_OBJECT(i->data)->getRepr();
+ for (std::vector<SPObject*>::const_iterator i=items.begin();i!=items.end();i++){
+ Inkscape::XML::Node *repr = (*i)->getRepr();
repr->parent()->removeChild(repr);
symbol_repr->addChild(repr,NULL);
}
@@ -3197,7 +3134,6 @@ void sp_selection_symbol(SPDesktop *desktop, bool /*apply*/ )
// Clean up
Inkscape::GC::release(symbol_repr);
- g_slist_free(items);
DocumentUndo::done(doc, SP_VERB_EDIT_SYMBOL, _("Group to symbol"));
}
@@ -3238,26 +3174,25 @@ void sp_selection_unsymbol(SPDesktop *desktop)
desktop->currentLayer()->getRepr()->appendChild(group);
// Move all children of symbol to group
- GSList* children = symbol->childList(false);
+ std::vector<SPObject*> children = symbol->childList(false);
// Converting a group to a symbol inserts a group for non-translational transform.
// In converting a symbol back to a group we strip out the inserted group (or any other
// group that only adds a transform to the symbol content).
- if( g_slist_length( children ) == 1 ) {
- SPObject *object = reinterpret_cast<SPObject *>( children->data );
+ if( children.size() == 1 ) {
+ SPObject *object = children[0];
if ( dynamic_cast<SPGroup *>( object ) ) {
if( object->getAttribute("style") == NULL ||
object->getAttribute("class") == NULL ) {
group->setAttribute("transform", object->getAttribute("transform"));
- g_slist_free(children);
children = object->childList(false);
}
}
}
- for (GSList* i = children; i != NULL; i = i->next ) {
- Inkscape::XML::Node *repr = SP_OBJECT(i->data)->getRepr();
+ for (std::vector<SPObject*>::const_reverse_iterator i=children.rbegin();i!=children.rend();i++){
+ Inkscape::XML::Node *repr = (*i)->getRepr();
repr->parent()->removeChild(repr);
group->addChild(repr,NULL);
}
@@ -3283,7 +3218,6 @@ void sp_selection_unsymbol(SPDesktop *desktop)
// Clean up
Inkscape::GC::release(group);
- g_slist_free(children);
DocumentUndo::done(doc, SP_VERB_EDIT_UNSYMBOL, _("Group from symbol"));
}
@@ -3318,12 +3252,12 @@ sp_selection_tile(SPDesktop *desktop, bool apply)
move_p[Geom::Y] = -move_p[Geom::Y];
Geom::Affine move = Geom::Affine(Geom::Translate(move_p));
- GSList *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
+ std::vector<SPItem*> items (selection->itemList());
- items = g_slist_sort(items, (GCompareFunc) sp_object_compare_position);
+ sort(items.begin(),items.end(),sp_object_compare_position_bool);
// bottommost object, after sorting
- SPObject *parent = SP_OBJECT(items->data)->parent;
+ SPObject *parent = items[0]->parent;
Geom::Affine parent_transform;
@@ -3337,23 +3271,21 @@ sp_selection_tile(SPDesktop *desktop, bool apply)
}
// remember the position of the first item
- gint pos = SP_OBJECT(items->data)->getRepr()->position();
+ gint pos = items[0]->getRepr()->position();
// create a list of duplicates
- GSList *repr_copies = NULL;
- for (GSList *i = items; i != NULL; i = i->next) {
- Inkscape::XML::Node *dup = SP_OBJECT(i->data)->getRepr()->duplicate(xml_doc);
- repr_copies = g_slist_prepend(repr_copies, dup);
+ std::vector<Inkscape::XML::Node*> repr_copies;
+ for (std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ Inkscape::XML::Node *dup = (*i)->getRepr()->duplicate(xml_doc);
+ repr_copies.push_back(dup);
}
- // restore the z-order after prepends
- repr_copies = g_slist_reverse(repr_copies);
Geom::Rect bbox(desktop->dt2doc(r->min()), desktop->dt2doc(r->max()));
if (apply) {
// delete objects so that their clones don't get alerted; this object will be restored shortly
- for (GSList *i = items; i != NULL; i = i->next) {
- SPObject *item = reinterpret_cast<SPObject*>(i->data);
+ for (std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ SPObject *item = *i;
item->deleteObject(false);
}
}
@@ -3399,7 +3331,6 @@ sp_selection_tile(SPDesktop *desktop, bool apply)
selection->set(rectangle);
}
- g_slist_free(items);
DocumentUndo::done(doc, SP_VERB_EDIT_TILE,
_("Objects to pattern"));
@@ -3422,15 +3353,13 @@ void sp_selection_untile(SPDesktop *desktop)
return;
}
- GSList *new_select = NULL;
+ std::vector<SPItem*> new_select;
bool did = false;
- for (GSList *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
- items != NULL;
- items = items->next) {
-
- SPItem *item = static_cast<SPItem *>(items->data);
+ std::vector<SPItem*> items(selection->itemList());
+ for (std::vector<SPItem*>::const_reverse_iterator i=items.rbegin();i!=items.rend();i++){
+ SPItem *item = *i;
SPStyle *style = item->style;
@@ -3466,7 +3395,7 @@ void sp_selection_untile(SPDesktop *desktop)
Geom::Affine transform( i->transform * pat_transform );
i->doWriteTransform(i->getRepr(), transform);
- new_select = g_slist_prepend(new_select, i);
+ new_select.push_back(i);
} else {
g_assert_not_reached();
}
@@ -3493,18 +3422,14 @@ void sp_selection_get_export_hints(Inkscape::Selection *selection, Glib::ustring
return;
}
- GSList const *reprlst = selection->reprList();
+ std::vector<Inkscape::XML::Node*> const reprlst = selection->reprList();
bool filename_search = TRUE;
bool xdpi_search = TRUE;
bool ydpi_search = TRUE;
- for (; reprlst != NULL &&
- filename_search &&
- xdpi_search &&
- ydpi_search;
- reprlst = reprlst->next) {
+ for (std::vector<Inkscape::XML::Node*>::const_iterator i=reprlst.begin();filename_search&&xdpi_search&&ydpi_search&&i!=reprlst.end();i++){
gchar const *dpi_string;
- Inkscape::XML::Node * repr = static_cast<Inkscape::XML::Node *>(reprlst->data);
+ Inkscape::XML::Node *repr = *i;
if (filename_search) {
const gchar* tmp = repr->attribute("inkscape:export-filename");
@@ -3590,10 +3515,10 @@ void sp_selection_create_bitmap_copy(SPDesktop *desktop)
}
// List of the items to show; all others will be hidden
- GSList *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
+ std::vector<SPItem*> items(selection->itemList());
// Sort items so that the topmost comes last
- items = g_slist_sort(items, (GCompareFunc) sp_item_repr_compare_position);
+ sort(items.begin(),items.end(),sp_item_repr_compare_position_bool);
// Generate a random value from the current time (you may create bitmap from the same object(s)
// multiple times, and this is done so that they don't clash)
@@ -3604,7 +3529,7 @@ void sp_selection_create_bitmap_copy(SPDesktop *desktop)
// Create the filename.
gchar *const basename = g_strdup_printf("%s-%s-%u.png",
document->getName(),
- SP_OBJECT(items->data)->getRepr()->attribute("id"),
+ items[0]->getRepr()->attribute("id"),
current);
// Imagemagick is known not to handle spaces in filenames, so we replace anything but letters,
// digits, and a few other chars, with "_"
@@ -3624,8 +3549,8 @@ void sp_selection_create_bitmap_copy(SPDesktop *desktop)
//g_print("%s\n", filepath);
// Remember parent and z-order of the topmost one
- gint pos = SP_OBJECT(g_slist_last(items)->data)->getRepr()->position();
- SPObject *parent_object = SP_OBJECT(g_slist_last(items)->data)->parent;
+ gint pos = items.back()->getRepr()->position();
+ SPObject *parent_object = items.back()->parent;
Inkscape::XML::Node *parent = parent_object->getRepr();
// Calculate resolution
@@ -3717,8 +3642,6 @@ void sp_selection_create_bitmap_copy(SPDesktop *desktop)
true, /*bool force_overwrite,*/
items);
- g_slist_free(items);
-
// Run filter, if any
if (run) {
g_print("Running external filter: %s\n", run);
@@ -3793,22 +3716,20 @@ void sp_selection_set_clipgroup(SPDesktop *desktop)
return;
}
- GSList const *l = const_cast<GSList *>(selection->reprList());
-
- GSList *p = g_slist_copy(const_cast<GSList *>(l));
+ std::vector<Inkscape::XML::Node*> p(selection->reprList());
- p = g_slist_sort(p, (GCompareFunc) sp_repr_compare_position);
+ sort(p.begin(),p.end(),sp_repr_compare_position_bool);
selection->clear();
- gint topmost = (static_cast<Inkscape::XML::Node *>(g_slist_last(p)->data))->position();
- Inkscape::XML::Node *topmost_parent = (static_cast<Inkscape::XML::Node *>(g_slist_last(p)->data))->parent();
+ int topmost = (p.back())->position();
+ Inkscape::XML::Node *topmost_parent = (p.back())->parent();
Inkscape::XML::Node *inner = xml_doc->createElement("svg:g");
inner->setAttribute("inkscape:label", "Clip");
- while (p) {
- Inkscape::XML::Node *current = static_cast<Inkscape::XML::Node *>(p->data);
+ for(std::vector<Inkscape::XML::Node*>::const_iterator i=p.begin();i!=p.end();i++){
+ Inkscape::XML::Node *current = *i;
if (current->parent() == topmost_parent) {
Inkscape::XML::Node *spnew = current->duplicate(xml_doc);
@@ -3817,7 +3738,7 @@ void sp_selection_set_clipgroup(SPDesktop *desktop)
Inkscape::GC::release(spnew);
topmost --; // only reduce count for those items deleted from topmost_parent
} else { // move it to topmost_parent first
- GSList *temp_clip = NULL;
+ std::vector<Inkscape::XML::Node*> temp_clip;
// At this point, current may already have no item, due to its being a clone whose original is already moved away
// So we copy it artificially calculating the transform from its repr->attr("transform") and the parent transform
@@ -3833,15 +3754,14 @@ void sp_selection_set_clipgroup(SPDesktop *desktop)
// then, if this is clone, looking up its original in that array and pre-multiplying
// it by the inverse of that original's transform diff.
- sp_selection_copy_one(current, item_t, &temp_clip, xml_doc);
+ sp_selection_copy_one(current, item_t, temp_clip, xml_doc);
sp_repr_unparent(current);
// paste into topmost_parent (temporarily)
- GSList *copied = sp_selection_paste_impl(doc, doc->getObjectByRepr(topmost_parent), &temp_clip);
- if (temp_clip) g_slist_free(temp_clip);
- if (copied) { // if success,
+ std::vector<Inkscape::XML::Node*> copied = sp_selection_paste_impl(doc, doc->getObjectByRepr(topmost_parent), temp_clip);
+ if (!copied.empty()) { // if success,
// take pasted object (now in topmost_parent)
- Inkscape::XML::Node *in_topmost = static_cast<Inkscape::XML::Node *>(copied->data);
+ Inkscape::XML::Node *in_topmost = copied.back();
// make a copy
Inkscape::XML::Node *spnew = in_topmost->duplicate(xml_doc);
// remove pasted
@@ -3849,10 +3769,8 @@ void sp_selection_set_clipgroup(SPDesktop *desktop)
// put its copy into group
inner->appendChild(spnew);
Inkscape::GC::release(spnew);
- g_slist_free(copied);
}
}
- p = g_slist_remove(p, current);
}
Inkscape::XML::Node *outer = xml_doc->createElement("svg:g");
@@ -3910,7 +3828,7 @@ void sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_
if ( apply_to_layer && is_empty) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to create clippath or mask from."));
return;
- } else if (!apply_to_layer && ( is_empty || NULL == selection->itemList()->next )) {
+ } else if (!apply_to_layer && ( is_empty || selection->itemList().size()==1 )) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select mask object and <b>object(s)</b> to apply clippath or mask to."));
return;
}
@@ -3925,9 +3843,9 @@ void sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_
doc->ensureUpToDate();
- GSList *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
+ std::vector<SPItem*> items(selection->itemList());
- items = g_slist_sort(items, (GCompareFunc) sp_object_compare_position);
+ sort(items.begin(),items.end(),sp_object_compare_position_bool);
// See lp bug #542004
selection->clear();
@@ -3936,7 +3854,7 @@ void sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_
GSList *mask_items = NULL;
GSList *apply_to_items = NULL;
GSList *items_to_delete = NULL;
- GSList *items_to_select = NULL;
+ std::vector<SPItem*> items_to_select;
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
bool topmost = prefs->getBool("/options/maskobject/topmost", true);
@@ -3947,51 +3865,50 @@ void sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_
// all selected items are used for mask, which is applied to a layer
apply_to_items = g_slist_prepend(apply_to_items, desktop->currentLayer());
- for (GSList *i = items; i != NULL; i = i->next) {
- Inkscape::XML::Node *dup = SP_OBJECT(i->data)->getRepr()->duplicate(xml_doc);
+ for (std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++) {
+ Inkscape::XML::Node *dup = (*i)->getRepr()->duplicate(xml_doc);
mask_items = g_slist_prepend(mask_items, dup);
- SPObject *item = reinterpret_cast<SPObject*>(i->data);
+ SPObject *item = *i;
if (remove_original) {
items_to_delete = g_slist_prepend(items_to_delete, item);
}
else {
- items_to_select = g_slist_prepend(items_to_select, item);
+ items_to_select.push_back((SPItem*)item);
}
}
} else if (!topmost) {
// topmost item is used as a mask, which is applied to other items in a selection
- GSList *i = items;
- Inkscape::XML::Node *dup = SP_OBJECT(i->data)->getRepr()->duplicate(xml_doc);
+ Inkscape::XML::Node *dup = items[0]->getRepr()->duplicate(xml_doc);
mask_items = g_slist_prepend(mask_items, dup);
if (remove_original) {
- SPObject *item = reinterpret_cast<SPObject*>(i->data);
+ SPObject *item = items.front();
items_to_delete = g_slist_prepend(items_to_delete, item);
}
- for (i = i->next; i != NULL; i = i->next) {
- apply_to_items = g_slist_prepend(apply_to_items, i->data);
- items_to_select = g_slist_prepend(items_to_select, i->data);
+ for (std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++) {
+ if(i==items.begin())continue;
+ apply_to_items = g_slist_prepend(apply_to_items, *i);
+ items_to_select.push_back(*i);
}
} else {
- GSList *i = NULL;
- for (i = items; NULL != i->next; i = i->next) {
- apply_to_items = g_slist_prepend(apply_to_items, i->data);
- items_to_select = g_slist_prepend(items_to_select, i->data);
+ SPItem *i = NULL;
+ for (std::vector<SPItem*>::const_iterator j=items.begin();j!=items.end();j++) {
+ i=*j;
+ apply_to_items = g_slist_prepend(apply_to_items, i);
+ items_to_select.push_back(i);
}
- Inkscape::XML::Node *dup = SP_OBJECT(i->data)->getRepr()->duplicate(xml_doc);
+ Inkscape::XML::Node *dup = SP_OBJECT(i)->getRepr()->duplicate(xml_doc);
mask_items = g_slist_prepend(mask_items, dup);
if (remove_original) {
- SPObject *item = reinterpret_cast<SPObject*>(i->data);
+ SPObject *item = reinterpret_cast<SPObject*>(i);
items_to_delete = g_slist_prepend(items_to_delete, item);
}
}
-
- g_slist_free(items);
- items = NULL;
+ items.clear();
if (apply_to_items && grouping == PREFS_MASKOBJECT_GROUPING_ALL) {
// group all those objects into one group
@@ -4001,24 +3918,21 @@ void sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_
// make a note we should ungroup this when unsetting mask
group->setAttribute("inkscape:groupmode", "maskhelper");
- GSList *reprs_to_group = NULL;
+ std::vector<Inkscape::XML::Node*> reprs_to_group;
for (GSList *i = apply_to_items ; NULL != i ; i = i->next) {
- reprs_to_group = g_slist_prepend(reprs_to_group, SP_OBJECT(i->data)->getRepr());
- items_to_select = g_slist_remove(items_to_select, i->data);
+ reprs_to_group.push_back(static_cast<SPObject*>(i->data)->getRepr());
+ items_to_select.erase(remove(items_to_select.begin(), items_to_select.end(), static_cast<SPObject*>(i->data)), items_to_select.end());
}
- reprs_to_group = g_slist_reverse(reprs_to_group);
sp_selection_group_impl(reprs_to_group, group, xml_doc, doc);
- reprs_to_group = NULL;
-
// apply clip/mask only to newly created group
g_slist_free(apply_to_items);
apply_to_items = NULL;
apply_to_items = g_slist_prepend(apply_to_items, doc->getObjectByRepr(group));
- items_to_select = g_slist_prepend(items_to_select, doc->getObjectByRepr(group));
+ items_to_select.push_back((SPItem*)(doc->getObjectByRepr(group)));
Inkscape::GC::release(group);
}
@@ -4058,7 +3972,7 @@ void sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_
Inkscape::XML::Node *spnew = current->duplicate(xml_doc);
gint position = current->position();
- items_to_select = g_slist_remove(items_to_select, item);
+ items_to_select.erase(remove(items_to_select.begin(), items_to_select.end(), item), items_to_select.end());
current->parent()->appendChild(group);
sp_repr_unparent(current);
group->appendChild(spnew);
@@ -4067,7 +3981,7 @@ void sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_
// Apply clip/mask to group instead
apply_mask_to = group;
- items_to_select = g_slist_prepend(items_to_select, doc->getObjectByRepr(group));
+ items_to_select.push_back((SPItem*)(doc->getObjectByRepr(group)));
Inkscape::GC::release(spnew);
Inkscape::GC::release(group);
}
@@ -4082,14 +3996,11 @@ void sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_
for (GSList *i = items_to_delete; NULL != i; i = i->next) {
SPObject *item = reinterpret_cast<SPObject*>(i->data);
item->deleteObject(false);
- items_to_select = g_slist_remove(items_to_select, item);
+ items_to_select.erase(remove(items_to_select.begin(), items_to_select.end(), item), items_to_select.end());
}
g_slist_free(items_to_delete);
- items_to_select = g_slist_reverse(items_to_select);
-
selection->addList(items_to_select);
- g_slist_free(items_to_select);
if (apply_clip_path) {
DocumentUndo::done(doc, SP_VERB_OBJECT_SET_CLIPPATH, _("Set clipping path"));
@@ -4121,20 +4032,19 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) {
gchar const *attributeName = apply_clip_path ? "clip-path" : "mask";
std::map<SPObject*,SPItem*> referenced_objects;
- GSList *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
+ std::vector<SPItem*> items(selection->itemList());
selection->clear();
GSList *items_to_ungroup = NULL;
- GSList *items_to_select = g_slist_copy(items);
- items_to_select = g_slist_reverse(items_to_select);
+ std::vector<SPItem*> items_to_select(items);
// SPObject* refers to a group containing the clipped path or mask itself,
// whereas SPItem* refers to the item being clipped or masked
- for (GSList const *i = items; NULL != i; i = i->next) {
+ for (std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
if (remove_original) {
// remember referenced mask/clippath, so orphaned masks can be moved back to document
- SPItem *item = reinterpret_cast<SPItem *>(i->data);
+ SPItem *item = *i;
Inkscape::URIReference *uri_ref = NULL;
if (apply_clip_path) {
@@ -4149,9 +4059,9 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) {
}
}
- SP_OBJECT(i->data)->getRepr()->setAttribute(attributeName, "none");
+ (*i)->getRepr()->setAttribute(attributeName, "none");
- SPGroup *group = dynamic_cast<SPGroup *>(static_cast<SPObject *>(i->data));
+ SPGroup *group = dynamic_cast<SPGroup *>(*i);
if (ungroup_masked && group) {
// if we had previously enclosed masked object in group,
// add it to list so we can ungroup it later
@@ -4163,7 +4073,6 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) {
}
}
- g_slist_free(items);
// restore mask objects into a document
for ( std::map<SPObject*,SPItem*>::iterator it = referenced_objects.begin() ; it != referenced_objects.end() ; ++it) {
@@ -4171,7 +4080,7 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) {
GSList *items_to_move = NULL;
for ( SPObject *child = obj->firstChild() ; child; child = child->getNext() ) {
// Collect all clipped paths and masks within a single group
- Inkscape::XML::Node *copy = SP_OBJECT(child)->getRepr()->duplicate(xml_doc);
+ Inkscape::XML::Node *copy = child->getRepr()->duplicate(xml_doc);
if(copy->attribute("inkscape:original-d") && copy->attribute("inkscape:path-effect"))
{
copy->setAttribute("d", copy->attribute("inkscape:original-d"));
@@ -4197,7 +4106,7 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) {
repr->setPosition((pos + 1) > 0 ? (pos + 1) : 0);
SPItem *mask_item = static_cast<SPItem *>(desktop->getDocument()->getObjectByRepr(repr));
- items_to_select = g_slist_prepend(items_to_select, mask_item);
+ items_to_select.push_back(mask_item);
// transform mask, so it is moved the same spot where mask was applied
Geom::Affine transform(mask_item->transform);
@@ -4212,10 +4121,10 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) {
for (GSList *i = items_to_ungroup ; NULL != i ; i = i->next) {
SPGroup *group = dynamic_cast<SPGroup *>(static_cast<SPObject *>(i->data));
if (group) {
- items_to_select = g_slist_remove(items_to_select, group);
- GSList *children = NULL;
- sp_item_group_ungroup(group, &children, false);
- items_to_select = g_slist_concat(children, items_to_select);
+ items_to_select.erase(remove(items_to_select.begin(), items_to_select.end(), group), items_to_select.end());
+ std::vector<SPItem*> children;
+ sp_item_group_ungroup(group, children, false);
+ items_to_select.insert(items_to_select.end(),children.rbegin(),children.rend());
} else {
g_assert_not_reached();
}
@@ -4224,9 +4133,7 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) {
g_slist_free(items_to_ungroup);
// rebuild selection
- items_to_select = g_slist_reverse(items_to_select);
selection->addList(items_to_select);
- g_slist_free(items_to_select);
if (apply_clip_path) {
DocumentUndo::done(doc, SP_VERB_OBJECT_UNSET_CLIPPATH, _("Release clipping path"));
diff --git a/src/selection-chemistry.h b/src/selection-chemistry.h
index 4ee7a5200..8bcab664b 100644
--- a/src/selection-chemistry.h
+++ b/src/selection-chemistry.h
@@ -143,8 +143,9 @@ enum SPSelectStrokeStyleType {
void sp_select_same_fill_stroke_style(SPDesktop *desktop, gboolean fill, gboolean strok, gboolean style);
void sp_select_same_object_type(SPDesktop *desktop);
-GSList *sp_get_same_style(SPItem *sel, GSList *src, SPSelectStrokeStyleType type=SP_STYLE_ALL);
-GSList *sp_get_same_object_type(SPItem *sel, GSList *src);
+
+std::vector<SPItem*> sp_get_same_style(SPItem *sel, std::vector<SPItem*> &src, SPSelectStrokeStyleType type=SP_STYLE_ALL);
+std::vector<SPItem*> sp_get_same_object_type(SPItem *sel, std::vector<SPItem*> &src);
void scroll_to_show_item(SPDesktop *desktop, SPItem *item);
@@ -171,9 +172,9 @@ void unlock_all_in_all_layers(SPDesktop *dt);
void unhide_all(SPDesktop *dt);
void unhide_all_in_all_layers(SPDesktop *dt);
-GSList *get_all_items(GSList *list, SPObject *from, SPDesktop *desktop, bool onlyvisible, bool onlysensitive, bool ingroups, GSList const *exclude);
+std::vector<SPItem*> &get_all_items(std::vector<SPItem*> &list, SPObject *from, SPDesktop *desktop, bool onlyvisible, bool onlysensitive, bool ingroups, std::vector<SPItem*> const &exclude);
-GSList *sp_degroup_list (GSList *items);
+std::vector<SPItem*> sp_degroup_list (std::vector<SPItem*> &items);
/* selection cycling */
typedef enum
diff --git a/src/selection-describer.cpp b/src/selection-describer.cpp
index 2386a731e..8304db684 100644
--- a/src/selection-describer.cpp
+++ b/src/selection-describer.cpp
@@ -40,14 +40,14 @@
#include "sp-spiral.h"
// Returns a list of terms for the items to be used in the statusbar
-char* collect_terms (GSList *items)
+char* collect_terms (const std::vector<SPItem*> &items)
{
GSList *check = NULL;
std::stringstream ss;
bool first = true;
- for (GSList *i = (GSList *)items; i != NULL; i = i->next) {
- SPItem *item = dynamic_cast<SPItem *>(reinterpret_cast<SPObject *>(i->data));
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end();iter++ ) {
+ SPItem *item = *iter;
if (item) {
const char *term = item->displayName();
if (term != NULL && g_slist_find (check, term) == NULL) {
@@ -61,12 +61,12 @@ char* collect_terms (GSList *items)
}
// Returns the number of terms in the list
-static int count_terms (GSList *items)
+static int count_terms (const std::vector<SPItem*> &items)
{
GSList *check = NULL;
int count=0;
- for (GSList *i = (GSList *)items; i != NULL; i = i->next) {
- SPItem *item = dynamic_cast<SPItem *>(reinterpret_cast<SPObject *>(i->data));
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end();iter++ ) {
+ SPItem *item = *iter;
if (item) {
const char *term = item->displayName();
if (term != NULL && g_slist_find (check, term) == NULL) {
@@ -79,11 +79,11 @@ static int count_terms (GSList *items)
}
// Returns the number of filtered items in the list
-static int count_filtered (GSList *items)
+static int count_filtered (const std::vector<SPItem*> &items)
{
int count=0;
- for (GSList *i = items; i != NULL; i = i->next) {
- SPItem *item = dynamic_cast<SPItem *>(reinterpret_cast<SPObject *>((i->data)));
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end();iter++ ) {
+ SPItem *item = *iter;
if (item) {
count += item->isFiltered();
}
@@ -122,12 +122,12 @@ void SelectionDescriber::_selectionModified(Inkscape::Selection *selection, guin
}
void SelectionDescriber::_updateMessageFromSelection(Inkscape::Selection *selection) {
- GSList const *items = selection->itemList();
+ std::vector<SPItem*> const items = selection->itemList();
- if (!items) { // no items
+ if (items.empty()) { // no items
_context.set(Inkscape::NORMAL_MESSAGE, _when_nothing);
} else {
- SPItem *item = dynamic_cast<SPItem *>(reinterpret_cast<SPObject *>(items->data));
+ SPItem *item = items[0];
g_assert(item != NULL);
SPObject *layer = selection->layers()->layerForObject(item);
SPObject *root = selection->layers()->currentRoot();
@@ -188,7 +188,7 @@ void SelectionDescriber::_updateMessageFromSelection(Inkscape::Selection *select
g_free (layer_name);
g_free (parent_name);
- if (!items->next) { // one item
+ if (items.size()==1) { // one item
char *item_desc = item->detailedDescription();
bool isUse = dynamic_cast<SPUse *>(item) != NULL;
@@ -228,9 +228,9 @@ void SelectionDescriber::_updateMessageFromSelection(Inkscape::Selection *select
g_free(item_desc);
} else { // multiple items
- int objcount = g_slist_length((GSList *)items);
- char *terms = collect_terms ((GSList *)items);
- int n_terms = count_terms((GSList *)items);
+ int objcount = items.size();
+ char *terms = collect_terms (items);
+ int n_terms = count_terms(items);
gchar *objects_str = g_strdup_printf(ngettext(
"<b>%1$i</b> objects selected of type %2$s",
@@ -241,7 +241,7 @@ void SelectionDescriber::_updateMessageFromSelection(Inkscape::Selection *select
// indicate all, some, or none filtered
gchar *filt_str = NULL;
- int n_filt = count_filtered((GSList *)items); //all filtered
+ int n_filt = count_filtered(items); //all filtered
if (n_filt) {
filt_str = g_strdup_printf(ngettext("; <i>%d filtered object</i> ",
"; <i>%d filtered objects</i> ", n_filt), n_filt);
diff --git a/src/selection.cpp b/src/selection.cpp
index 81139d044..7979b5d61 100644
--- a/src/selection.cpp
+++ b/src/selection.cpp
@@ -42,9 +42,11 @@
namespace Inkscape {
Selection::Selection(LayerModel *layers, SPDesktop *desktop) :
- _objs(NULL),
- _reprs(NULL),
- _items(NULL),
+ _objs(std::list<SPObject*>()),
+ _objs_vector(std::vector<SPObject*>()),
+ _objs_set(std::set<SPObject*>()),
+ _reprs(std::vector<XML::Node*>()),
+ _items(std::vector<SPItem*>()),
_layers(layers),
_desktop(desktop),
_selection_context(NULL),
@@ -121,17 +123,14 @@ Selection::_releaseContext(SPObject *obj)
}
void Selection::_invalidateCachedLists() {
- g_slist_free(_items);
- _items = NULL;
-
- g_slist_free(_reprs);
- _reprs = NULL;
+ _items.clear();
+ _reprs.clear();
}
void Selection::_clear() {
_invalidateCachedLists();
- while (_objs) {
- SPObject *obj=reinterpret_cast<SPObject *>(_objs->data);
+ while (!_objs.empty()) {
+ SPObject *obj=_objs.front();
_remove(obj);
}
}
@@ -148,7 +147,7 @@ bool Selection::includes(SPObject *obj) const {
g_return_val_if_fail(SP_IS_OBJECT(obj), FALSE);
- return ( g_slist_find(_objs, obj) != NULL );
+ return ( _objs_set.find(obj)!=_objs_set.end() );
}
void Selection::add(SPObject *obj, bool persist_selection_context/* = false */) {
@@ -179,8 +178,10 @@ void Selection::_add(SPObject *obj) {
// (to prevent double-selection)
_removeObjectDescendants(obj);
_removeObjectAncestors(obj);
+ g_return_if_fail(SP_IS_OBJECT(obj));
- _objs = g_slist_prepend(_objs, obj);
+ _objs.push_front(obj);
+ _objs_set.insert(obj);
add_3D_boxes_recursively(obj);
@@ -234,26 +235,27 @@ void Selection::_remove(SPObject *obj) {
remove_3D_boxes_recursively(obj);
- _objs = g_slist_remove(_objs, obj);
+ _objs.remove(obj);
+ _objs_set.erase(obj);
}
-void Selection::setList(GSList const *list) {
+void Selection::setList(std::vector<SPItem*> const &list) {
// Clear and add, or just clear with emit.
- if (list != NULL) {
+ if (!list.empty()) {
_clear();
addList(list);
} else clear();
}
-void Selection::addList(GSList const *list) {
+void Selection::addList(std::vector<SPItem*> const &list) {
- if (list == NULL)
+ if (list.empty())
return;
_invalidateCachedLists();
- for ( GSList const *iter = list ; iter != NULL ; iter = iter->next ) {
- SPObject *obj = reinterpret_cast<SPObject *>(iter->data);
+ for ( std::vector<SPItem*>::const_iterator iter=list.begin();iter!=list.end();iter++ ) {
+ SPObject *obj = *iter;
if (includes(obj)) continue;
_add (obj);
}
@@ -261,11 +263,11 @@ void Selection::addList(GSList const *list) {
_emitChanged();
}
-void Selection::setReprList(GSList const *list) {
+void Selection::setReprList(std::vector<XML::Node*> const &list) {
_clear();
- for ( GSList const *iter = list ; iter != NULL ; iter = iter->next ) {
- SPObject *obj=_objectForXMLNode(reinterpret_cast<Inkscape::XML::Node *>(iter->data));
+ for ( std::vector<XML::Node*>::const_reverse_iterator iter=list.rbegin();iter!=list.rend();iter++ ) {
+ SPObject *obj=_objectForXMLNode(*iter);
if (obj) {
_add(obj);
}
@@ -279,35 +281,38 @@ void Selection::clear() {
_emitChanged();
}
-GSList const *Selection::list() {
- return _objs;
+std::vector<SPObject*> const &Selection::list() {
+ if(!_objs_vector.empty())
+ return _objs_vector;
+
+ for ( std::list<SPObject*>::const_iterator iter=_objs.begin();iter!=_objs.end();iter++ ) {
+ _objs_vector.push_back(*iter);
+ }
+ return _objs_vector;
+
}
-GSList const *Selection::itemList() {
- if (_items) {
+std::vector<SPItem*> const &Selection::itemList() {
+ if (!_items.empty()) {
return _items;
}
- for ( GSList const *iter=_objs ; iter != NULL ; iter = iter->next ) {
- SPObject *obj=reinterpret_cast<SPObject *>(iter->data);
+ for ( std::list<SPObject*>::const_iterator iter=_objs.begin();iter!=_objs.end();iter++ ) {
+ SPObject *obj=*iter;
if (SP_IS_ITEM(obj)) {
- _items = g_slist_prepend(_items, SP_ITEM(obj));
+ _items.push_back(SP_ITEM(obj));
}
}
- _items = g_slist_reverse(_items);
-
return _items;
}
-GSList const *Selection::reprList() {
- if (_reprs) { return _reprs; }
-
- for ( GSList const *iter=itemList() ; iter != NULL ; iter = iter->next ) {
- SPObject *obj=reinterpret_cast<SPObject *>(iter->data);
- _reprs = g_slist_prepend(_reprs, obj->getRepr());
+std::vector<XML::Node*> const &Selection::reprList() {
+ if (!_reprs.empty()) { return _reprs; }
+ std::vector<SPItem*> list = itemList();
+ for ( std::vector<SPItem*>::const_iterator iter=list.begin();iter!=list.end();iter++ ) {
+ SPObject *obj = *iter;
+ _reprs.push_back(obj->getRepr());
}
- _reprs = g_slist_reverse(_reprs);
-
return _reprs;
}
@@ -337,17 +342,17 @@ std::list<SPBox3D *> const Selection::box3DList(Persp3D *persp) {
}
SPObject *Selection::single() {
- if ( _objs != NULL && _objs->next == NULL ) {
- return reinterpret_cast<SPObject *>(_objs->data);
+ if ( _objs.size() == 1 ) {
+ return _objs.front();
} else {
return NULL;
}
}
SPItem *Selection::singleItem() {
- GSList const *items=itemList();
- if ( items != NULL && items->next == NULL ) {
- return reinterpret_cast<SPItem *>(items->data);
+ std::vector<SPItem*> const items=itemList();
+ if ( items.size()==1) {
+ return items[0];
} else {
return NULL;
}
@@ -362,12 +367,12 @@ SPItem *Selection::largestItem(Selection::CompareSize compare) {
}
SPItem *Selection::_sizeistItem(bool sml, Selection::CompareSize compare) {
- GSList const *items = const_cast<Selection *>(this)->itemList();
+ std::vector<SPItem*> const items = const_cast<Selection *>(this)->itemList();
gdouble max = sml ? 1e18 : 0;
SPItem *ist = NULL;
- for ( GSList const *i = items; i != NULL ; i = i->next ) {
- Geom::OptRect obox = SP_ITEM(i->data)->desktopPreferredBounds();
+ for ( std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++ ) {
+ Geom::OptRect obox = SP_ITEM(*i)->desktopPreferredBounds();
if (!obox || obox.isEmpty()) continue;
Geom::Rect bbox = *obox;
@@ -376,7 +381,7 @@ SPItem *Selection::_sizeistItem(bool sml, Selection::CompareSize compare) {
size = sml ? size : size * -1;
if (size < max) {
max = size;
- ist = SP_ITEM(i->data);
+ ist = SP_ITEM(*i);
}
}
return ist;
@@ -395,22 +400,22 @@ Geom::OptRect Selection::bounds(SPItem::BBoxType type) const
Geom::OptRect Selection::geometricBounds() const
{
- GSList const *items = const_cast<Selection *>(this)->itemList();
+ std::vector<SPItem*> const items = const_cast<Selection *>(this)->itemList();
Geom::OptRect bbox;
- for ( GSList const *i = items ; i != NULL ; i = i->next ) {
- bbox.unionWith(SP_ITEM(i->data)->desktopGeometricBounds());
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end();iter++ ) {
+ bbox.unionWith(SP_ITEM(*iter)->desktopGeometricBounds());
}
return bbox;
}
Geom::OptRect Selection::visualBounds() const
{
- GSList const *items = const_cast<Selection *>(this)->itemList();
+ std::vector<SPItem*> const items = const_cast<Selection *>(this)->itemList();
Geom::OptRect bbox;
- for ( GSList const *i = items ; i != NULL ; i = i->next ) {
- bbox.unionWith(SP_ITEM(i->data)->desktopVisualBounds());
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end();iter++ ) {
+ bbox.unionWith(SP_ITEM(*iter)->desktopVisualBounds());
}
return bbox;
}
@@ -427,11 +432,11 @@ Geom::OptRect Selection::preferredBounds() const
Geom::OptRect Selection::documentBounds(SPItem::BBoxType type) const
{
Geom::OptRect bbox;
- GSList const *items = const_cast<Selection *>(this)->itemList();
- if (!items) return bbox;
+ std::vector<SPItem*> const items = const_cast<Selection *>(this)->itemList();
+ if (items.empty()) return bbox;
- for ( GSList const *iter=items ; iter != NULL ; iter = iter->next ) {
- SPItem *item = SP_ITEM(iter->data);
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end();iter++ ) {
+ SPItem *item = SP_ITEM(*iter);
bbox |= item->documentBounds(type);
}
@@ -441,9 +446,9 @@ Geom::OptRect Selection::documentBounds(SPItem::BBoxType type) const
// If we have a selection of multiple items, then the center of the first item
// will be returned; this is also the case in SelTrans::centerRequest()
boost::optional<Geom::Point> Selection::center() const {
- GSList *items = (GSList *) const_cast<Selection *>(this)->itemList();
- if (items) {
- SPItem *first = reinterpret_cast<SPItem*>(g_slist_last(items)->data); // from the first item in selection
+ std::vector<SPItem*> const items = const_cast<Selection *>(this)->itemList();
+ if (!items.empty()) {
+ SPItem *first = items.back(); // from the first item in selection
if (first->isCenterSet()) { // only if set explicitly
return first->getCenter();
}
@@ -457,13 +462,13 @@ boost::optional<Geom::Point> Selection::center() const {
}
std::vector<Inkscape::SnapCandidatePoint> Selection::getSnapPoints(SnapPreferences const *snapprefs) const {
- GSList const *items = const_cast<Selection *>(this)->itemList();
+ std::vector<SPItem*> const items = const_cast<Selection *>(this)->itemList();
SnapPreferences snapprefs_dummy = *snapprefs; // create a local copy of the snapping prefs
snapprefs_dummy.setTargetSnappable(Inkscape::SNAPTARGET_ROTATION_CENTER, false); // locally disable snapping to the item center
std::vector<Inkscape::SnapCandidatePoint> p;
- for (GSList const *iter = items; iter != NULL; iter = iter->next) {
- SPItem *this_item = SP_ITEM(iter->data);
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end();iter++ ) {
+ SPItem *this_item = *iter;
this_item->getSnappoints(p, &snapprefs_dummy);
//Include the transformation origin for snapping
@@ -477,19 +482,21 @@ std::vector<Inkscape::SnapCandidatePoint> Selection::getSnapPoints(SnapPreferenc
}
void Selection::_removeObjectDescendants(SPObject *obj) {
- GSList *iter, *next;
- for ( iter = _objs ; iter ; iter = next ) {
- next = iter->next;
- SPObject *sel_obj=reinterpret_cast<SPObject *>(iter->data);
+ std::vector<SPObject*> toremove;
+ for ( std::list<SPObject*>::const_iterator iter=_objs.begin();iter!=_objs.end();iter++ ) {
+ SPObject *sel_obj= dynamic_cast<SPObject*>(*iter);
SPObject *parent = sel_obj->parent;
while (parent) {
if ( parent == obj ) {
- _remove(sel_obj);
+ toremove.push_back(sel_obj);
break;
}
parent = parent->parent;
}
}
+ for ( std::vector<SPObject*>::const_iterator iter=toremove.begin();iter!=toremove.end();iter++ ) {
+ _remove(*iter);
+ }
}
void Selection::_removeObjectAncestors(SPObject *obj) {
@@ -511,32 +518,24 @@ SPObject *Selection::_objectForXMLNode(Inkscape::XML::Node *repr) const {
return object;
}
-guint Selection::numberOfLayers() {
- GSList const *items = const_cast<Selection *>(this)->itemList();
- GSList *layers = NULL;
- for (GSList const *iter = items; iter != NULL; iter = iter->next) {
- SPObject *layer = _layers->layerForObject(SP_OBJECT(iter->data));
- if (g_slist_find (layers, layer) == NULL) {
- layers = g_slist_prepend (layers, layer);
- }
+size_t Selection::numberOfLayers() {
+ std::vector<SPItem*> const items = const_cast<Selection *>(this)->itemList();
+ std::set<SPObject*> layers;
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end();iter++ ) {
+ SPObject *layer = _layers->layerForObject(*iter);
+ layers.insert(layer);
}
- guint ret = g_slist_length (layers);
- g_slist_free (layers);
- return ret;
-}
-
-guint Selection::numberOfParents() {
- GSList const *items = const_cast<Selection *>(this)->itemList();
- GSList *parents = NULL;
- for (GSList const *iter = items; iter != NULL; iter = iter->next) {
- SPObject *parent = SP_OBJECT(iter->data)->parent;
- if (g_slist_find (parents, parent) == NULL) {
- parents = g_slist_prepend (parents, parent);
- }
+ return layers.size();
+}
+
+size_t Selection::numberOfParents() {
+ std::vector<SPItem*> const items = const_cast<Selection *>(this)->itemList();
+ std::set<SPObject*> parents;
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end();iter++ ) {
+ SPObject *parent = (*iter)->parent;
+ parents.insert(parent);
}
- guint ret = g_slist_length (parents);
- g_slist_free (parents);
- return ret;
+ return parents.size();
}
}
diff --git a/src/selection.h b/src/selection.h
index 19e2ae1fd..952dde51d 100644
--- a/src/selection.h
+++ b/src/selection.h
@@ -16,6 +16,7 @@
#include <vector>
#include <map>
#include <list>
+#include <set>
#include <stddef.h>
#include <sigc++/sigc++.h>
@@ -26,11 +27,11 @@
#include "sp-item.h"
+
class SPDesktop;
class SPItem;
class SPBox3D;
class Persp3D;
-typedef struct _GSList GSList;
namespace Inkscape {
class LayerModel;
@@ -39,6 +40,7 @@ class Node;
}
}
+
namespace Inkscape {
/**
@@ -154,21 +156,21 @@ public:
*
* @param objs the objects to select
*/
- void setList(GSList const *objs);
+ void setList(std::vector<SPItem*> const &objs);
/**
* Adds the specified objects to selection, without deselecting first.
*
* @param objs the objects to select
*/
- void addList(GSList const *objs);
+ void addList(std::vector<SPItem*> const &objs);
/**
* Clears the selection and selects the specified objects.
*
* @param repr a list of xml nodes for the items to select
*/
- void setReprList(GSList const *reprs);
+ void setReprList(std::vector<XML::Node*> const &reprs);
/** Add items from an STL iterator range to the selection.
* \param from the begin iterator
@@ -192,7 +194,7 @@ public:
/**
* Returns true if no items are selected.
*/
- bool isEmpty() const { return _objs == NULL; }
+ bool isEmpty() const { return _objs.empty(); }
/**
* Returns true if the given object is selected.
@@ -238,13 +240,13 @@ public:
XML::Node *singleRepr();
/** Returns the list of selected objects. */
- GSList const *list();
+ std::vector<SPObject*> const &list();
/** Returns the list of selected SPItems. */
- GSList const *itemList();
+ std::vector<SPItem*> const &itemList();
/** Returns a list of the xml nodes of all selected objects. */
/// \todo only returns reprs of SPItems currently; need a separate
/// method for that
- GSList const *reprList();
+ std::vector<XML::Node*> const &reprList();
/** Returns a list of all perspectives which have a 3D box in the current selection.
(these may also be nested in groups) */
@@ -257,10 +259,10 @@ public:
std::list<SPBox3D *> const box3DList(Persp3D *persp = NULL);
/** Returns the number of layers in which there are selected objects. */
- unsigned int numberOfLayers();
+ size_t numberOfLayers();
/** Returns the number of parents to which the selected objects belong. */
- unsigned int numberOfParents();
+ size_t numberOfParents();
/** Returns the bounding rectangle of the selection. */
Geom::OptRect bounds(SPItem::BBoxType type) const;
@@ -360,9 +362,11 @@ private:
/** Releases an active layer object that is being removed. */
void _releaseContext(SPObject *obj);
- mutable GSList *_objs;
- mutable GSList *_reprs;
- mutable GSList *_items;
+ mutable std::list<SPObject*> _objs; //to more efficiently remove arbitrary elements
+ mutable std::vector<SPObject*> _objs_vector; // to be returned by list();
+ mutable std::set<SPObject*> _objs_set; //to efficiently test if object is selected
+ mutable std::vector<XML::Node*> _reprs;
+ mutable std::vector<SPItem*> _items;
void add_box_perspective(SPBox3D *box);
void add_3D_boxes_recursively(SPObject *obj);
diff --git a/src/seltrans.cpp b/src/seltrans.cpp
index 5e4c0642e..f7562923f 100644
--- a/src/seltrans.cpp
+++ b/src/seltrans.cpp
@@ -112,7 +112,7 @@ Inkscape::SelTrans::SelTrans(SPDesktop *desktop) :
_opposite_for_bboxpoints(Geom::Point(0,0)),
_origin_for_specpoints(Geom::Point(0,0)),
_origin_for_bboxpoints(Geom::Point(0,0)),
- _stamp_cache(NULL),
+ _stamp_cache(std::vector<SPItem*>()),
_message_context(desktop->messageStack()),
_bounding_box_prefs_observer(*this)
{
@@ -239,8 +239,9 @@ void Inkscape::SelTrans::setCenter(Geom::Point const &p)
_center_is_set = true;
// Write the new center position into all selected items
- for (GSList const *l = _desktop->selection->itemList(); l; l = l->next) {
- SPItem *it = SP_ITEM(l->data);
+ std::vector<SPItem*> items=_desktop->selection->itemList();
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end();iter++ ) {
+ SPItem *it = SP_ITEM(*iter);
it->setCenter(p);
// only set the value; updating repr and document_done will be done once, on ungrab
}
@@ -268,8 +269,9 @@ void Inkscape::SelTrans::grab(Geom::Point const &p, gdouble x, gdouble y, bool s
return;
}
- for (GSList const *l = selection->itemList(); l; l = l->next) {
- SPItem *it = reinterpret_cast<SPItem*>(sp_object_ref(SP_ITEM(l->data), NULL));
+ std::vector<SPItem*> items=_desktop->selection->itemList();
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end();iter++ ) {
+ SPItem *it = static_cast<SPItem*>(sp_object_ref(*iter, NULL));
_items.push_back(it);
_items_const.push_back(it);
_items_affines.push_back(it->i2dt_affine());
@@ -370,7 +372,7 @@ void Inkscape::SelTrans::grab(Geom::Point const &p, gdouble x, gdouble y, bool s
}
_updateHandles();
- g_return_if_fail(_stamp_cache == NULL);
+ g_return_if_fail(_stamp_cache.empty());
}
void Inkscape::SelTrans::transform(Geom::Affine const &rel_affine, Geom::Point const &norm)
@@ -432,10 +434,8 @@ void Inkscape::SelTrans::ungrab()
for (int i = 0; i < 4; i++)
sp_canvas_item_hide(_l[i]);
}
-
- if (_stamp_cache) {
- g_slist_free(_stamp_cache);
- _stamp_cache = NULL;
+ if(!_stamp_cache.empty()){
+ _stamp_cache.clear();
}
_message_context.clear();
@@ -491,8 +491,9 @@ void Inkscape::SelTrans::ungrab()
if (_center_is_set) {
// we were dragging center; update reprs and commit undoable action
- for (GSList const *l = _desktop->selection->itemList(); l; l = l->next) {
- SPItem *it = SP_ITEM(l->data);
+ std::vector<SPItem*> items=_desktop->selection->itemList();
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end();iter++ ) {
+ SPItem *it = *iter;
it->updateRepr();
}
DocumentUndo::done(_desktop->getDocument(), SP_VERB_CONTEXT_SELECT,
@@ -515,26 +516,25 @@ void Inkscape::SelTrans::stamp()
Inkscape::Selection *selection = _desktop->getSelection();
bool fixup = !_grabbed;
- if ( fixup && _stamp_cache ) {
+ if ( fixup && !_stamp_cache.empty() ) {
// TODO - give a proper fix. Simple temporary work-around for the grab() issue
- g_slist_free(_stamp_cache);
- _stamp_cache = NULL;
+ _stamp_cache.clear();
}
/* stamping mode */
if (!_empty) {
- GSList *l;
- if (_stamp_cache) {
+ std::vector<SPItem*> l;
+ if (!_stamp_cache.empty()) {
l = _stamp_cache;
} else {
/* Build cache */
- l = g_slist_copy((GSList *) selection->itemList());
- l = g_slist_sort(l, (GCompareFunc) sp_object_compare_position);
+ l = selection->itemList();
+ sort(l.begin(),l.end(),sp_object_compare_position_bool);
_stamp_cache = l;
}
- while (l) {
- SPItem *original_item = SP_ITEM(l->data);
+ for(std::vector<SPItem*>::const_iterator x=l.begin();x!=l.end();x++) {
+ SPItem *original_item = *x;
Inkscape::XML::Node *original_repr = original_item->getRepr();
// remember the position of the item
@@ -568,16 +568,14 @@ void Inkscape::SelTrans::stamp()
}
Inkscape::GC::release(copy_repr);
- l = l->next;
}
DocumentUndo::done(_desktop->getDocument(), SP_VERB_CONTEXT_SELECT,
_("Stamp"));
}
- if ( fixup && _stamp_cache ) {
+ if ( fixup && !_stamp_cache.empty() ) {
// TODO - give a proper fix. Simple temporary work-around for the grab() issue
- g_slist_free(_stamp_cache);
- _stamp_cache = NULL;
+ _stamp_cache.clear();
}
}
@@ -712,8 +710,9 @@ void Inkscape::SelTrans::handleClick(SPKnot */*knot*/, guint state, SPSelTransHa
case HANDLE_CENTER:
if (state & GDK_SHIFT_MASK) {
// Unset the center position for all selected items
- for (GSList const *l = _desktop->selection->itemList(); l; l = l->next) {
- SPItem *it = SP_ITEM(l->data);
+ std::vector<SPItem*> items=_desktop->selection->itemList();
+ for ( std::vector<SPItem*>::const_iterator iter=items.begin();iter!=items.end();iter++ ) {
+ SPItem *it = *iter;
it->unsetCenter();
it->updateRepr();
_center_is_set = false; // center has changed
@@ -1283,7 +1282,7 @@ gboolean Inkscape::SelTrans::centerRequest(Geom::Point &pt, guint state)
// items will share a single center. While dragging that single center, it should never snap to the
// centers of any of the selected objects. Therefore we will have to pass the list of selected items
// to the snapper, to avoid self-snapping of the rotation center
- GSList *items = (GSList *) const_cast<Selection *>(_selection)->itemList();
+ std::vector<SPItem*> items = const_cast<Selection *>(_selection)->itemList();
SnapManager &m = _desktop->namedview->snap_manager;
m.setup(_desktop);
m.setRotationCenterSource(items);
diff --git a/src/seltrans.h b/src/seltrans.h
index d5db1542d..26c2e9cd9 100644
--- a/src/seltrans.h
+++ b/src/seltrans.h
@@ -187,7 +187,7 @@ private:
SPCtrlLine *_l[4];
unsigned int _sel_changed_id;
unsigned int _sel_modified_id;
- GSList *_stamp_cache;
+ std::vector<SPItem*> _stamp_cache;
Geom::Point _origin; ///< position of origin for transforms
Geom::Point _point; ///< original position of the knot being used for the current transform
diff --git a/src/snap.cpp b/src/snap.cpp
index 96b5ab53c..30441ca0b 100644
--- a/src/snap.cpp
+++ b/src/snap.cpp
@@ -43,7 +43,7 @@ SnapManager::SnapManager(SPNamedView const *v) :
object(this, 0),
snapprefs(),
_named_view(v),
- _rotation_center_source_items(NULL),
+ _rotation_center_source_items(std::vector<SPItem*>()),
_guide_to_ignore(NULL),
_desktop(NULL),
_snapindicator(true),
@@ -1013,7 +1013,7 @@ void SnapManager::setup(SPDesktop const *desktop,
_snapindicator = snapindicator;
_unselected_nodes = unselected_nodes;
_guide_to_ignore = guide_to_ignore;
- _rotation_center_source_items = NULL;
+ _rotation_center_source_items.clear();
}
void SnapManager::setup(SPDesktop const *desktop,
@@ -1031,7 +1031,7 @@ void SnapManager::setup(SPDesktop const *desktop,
_snapindicator = snapindicator;
_unselected_nodes = unselected_nodes;
_guide_to_ignore = guide_to_ignore;
- _rotation_center_source_items = NULL;
+ _rotation_center_source_items.clear();
}
/// Setup, taking the list of items to ignore from the desktop's selection.
@@ -1049,13 +1049,13 @@ void SnapManager::setupIgnoreSelection(SPDesktop const *desktop,
_snapindicator = snapindicator;
_unselected_nodes = unselected_nodes;
_guide_to_ignore = guide_to_ignore;
- _rotation_center_source_items = NULL;
+ _rotation_center_source_items.clear();
_items_to_ignore.clear();
Inkscape::Selection *sel = _desktop->selection;
- GSList const *items = sel->itemList();
- for (GSList *i = const_cast<GSList*>(items); i; i = i->next) {
- _items_to_ignore.push_back(static_cast<SPItem const *>(i->data));
+ std::vector<SPItem*> const items = sel->itemList();
+ for (std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++) {
+ _items_to_ignore.push_back(*i);
}
}
diff --git a/src/snap.h b/src/snap.h
index 20b2b246f..49bdbfa7c 100644
--- a/src/snap.h
+++ b/src/snap.h
@@ -136,7 +136,7 @@ public:
std::vector<Inkscape::SnapCandidatePoint> *unselected_nodes = NULL,
SPGuide *guide_to_ignore = NULL);
- void unSetup() {_rotation_center_source_items = NULL;
+ void unSetup() {_rotation_center_source_items.clear();
_guide_to_ignore = NULL;
_desktop = NULL;
_unselected_nodes = NULL;}
@@ -145,8 +145,8 @@ public:
// of this rotation center; this reference is used to make sure that we do not snap a rotation
// center to itself
// NOTE: Must be called after calling setup(), not before!
- void setRotationCenterSource(GSList *items) {_rotation_center_source_items = items;}
- GSList const *getRotationCenterSource() {return _rotation_center_source_items;}
+ void setRotationCenterSource(const std::vector<SPItem*> &items) {_rotation_center_source_items = items;}
+ const std::vector<SPItem*> &getRotationCenterSource() {return _rotation_center_source_items;}
// freeSnapReturnByRef() is preferred over freeSnap(), because it only returns a
// point if snapping has occurred (by overwriting p); otherwise p is untouched
@@ -490,7 +490,7 @@ protected:
private:
std::vector<SPItem const *> _items_to_ignore; ///< Items that should not be snapped to, for example the items that are currently being dragged. Set using the setup() method
- GSList *_rotation_center_source_items; // to avoid snapping a rotation center to itself
+ std::vector<SPItem*> _rotation_center_source_items; // to avoid snapping a rotation center to itself
SPGuide *_guide_to_ignore; ///< A guide that should not be snapped to, e.g. the guide that is currently being dragged
SPDesktop const *_desktop;
bool _snapindicator; ///< When true, an indicator will be drawn at the position that was being snapped to
diff --git a/src/sp-conn-end.cpp b/src/sp-conn-end.cpp
index 7aace1849..fa5a57529 100644
--- a/src/sp-conn-end.cpp
+++ b/src/sp-conn-end.cpp
@@ -50,8 +50,9 @@ static bool try_get_intersect_point_with_item_recursive(Geom::PathVector& conn_p
// consider all first-order children
double child_pos = 0.0;
- for (GSList const* i = sp_item_group_item_list(group); i != NULL; i = i->next) {
- SPItem* child_item = SP_ITEM(i->data);
+ std::vector<SPItem*> g = sp_item_group_item_list(group);
+ for (std::vector<SPItem*>::const_iterator i = g.begin();i!=g.end();i++) {
+ SPItem* child_item = *i;
try_get_intersect_point_with_item_recursive(conn_pv, child_item,
item_transform * child_item->transform, child_pos);
if (intersect_pos < child_pos)
diff --git a/src/sp-defs.cpp b/src/sp-defs.cpp
index 8dd695867..2e341d3c6 100644
--- a/src/sp-defs.cpp
+++ b/src/sp-defs.cpp
@@ -36,11 +36,9 @@ void SPDefs::update(SPCtx *ctx, guint flags) {
}
flags &= SP_OBJECT_MODIFIED_CASCADE;
-
- GSList *l = g_slist_reverse(this->childList(true));
- while (l) {
- SPObject *child = SP_OBJECT(l->data);
- l = g_slist_remove(l, child);
+ std::vector<SPObject*> l(this->childList(true));
+ for(std::vector<SPObject*>::const_iterator i=l.begin();i!=l.end();i++){
+ SPObject *child = *i;
if (flags || (child->uflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
child->updateDisplay(ctx, flags);
}
diff --git a/src/sp-filter.cpp b/src/sp-filter.cpp
index a70fbd5bb..1bde69dd1 100644
--- a/src/sp-filter.cpp
+++ b/src/sp-filter.cpp
@@ -79,6 +79,7 @@ void SPFilter::build(SPDocument *document, Inkscape::XML::Node *repr) {
this->readAttr( "height" );
this->readAttr( "filterRes" );
this->readAttr( "xlink:href" );
+ this->_refcount = 0;
SPObject::build(document, repr);
@@ -190,6 +191,15 @@ void SPFilter::set(unsigned int key, gchar const *value) {
}
}
+
+/**
+ * Returns the number of references to the filter.
+ */
+guint SPFilter::getRefCount() {
+ // NOTE: this is currently updated by sp_style_filter_ref_changed() in style.cpp
+ return _refcount;
+}
+
/**
* Receives update notifications.
*/
@@ -235,11 +245,9 @@ void SPFilter::update(SPCtx *ctx, guint flags) {
childflags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
}
childflags &= SP_OBJECT_MODIFIED_CASCADE;
-
- GSList *l = g_slist_reverse(this->childList(true, SPObject::ActionUpdate));
- while (l) {
- SPObject *child = SP_OBJECT (l->data);
- l = g_slist_remove (l, child);
+ std::vector<SPObject*> l(this->childList(true, SPObject::ActionUpdate));
+ for(std::vector<SPObject*>::const_iterator i=l.begin();i!=l.end();i++){
+ SPObject *child = *i;
if( SP_IS_FILTER_PRIMITIVE( child ) ) {
child->updateDisplay(ctx, childflags);
}
diff --git a/src/sp-filter.h b/src/sp-filter.h
index e6318c569..1c214c6b7 100644
--- a/src/sp-filter.h
+++ b/src/sp-filter.h
@@ -54,6 +54,9 @@ public:
NumberOptNumber filterRes;
SPFilterReference *href;
sigc::connection modified_connection;
+
+ guint getRefCount();
+ guint _refcount;
Inkscape::Filters::Filter *_renderer;
diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp
index 55857dacf..72cd5d7fa 100644
--- a/src/sp-item-group.cpp
+++ b/src/sp-item-group.cpp
@@ -161,11 +161,9 @@ void SPGroup::update(SPCtx *ctx, unsigned int flags) {
childflags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
}
childflags &= SP_OBJECT_MODIFIED_CASCADE;
-
- GSList *l = g_slist_reverse(this->childList(true, SPObject::ActionUpdate));
- while (l) {
- SPObject *child = SP_OBJECT (l->data);
- l = g_slist_remove (l, child);
+ std::vector<SPObject*> l=this->childList(true, SPObject::ActionUpdate);
+ for(std::vector<SPObject*> ::const_iterator i=l.begin();i!=l.end();i++){
+ SPObject *child = *i;
if (childflags || (child->uflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
SPItem *item = dynamic_cast<SPItem *>(child);
@@ -201,20 +199,15 @@ void SPGroup::update(SPCtx *ctx, unsigned int flags) {
void SPGroup::modified(guint flags) {
// std::cout << "SPGroup::modified(): " << (getId()?getId():"null") << std::endl;
SPLPEItem::modified(flags);
-
- SPObject *child;
-
if (flags & SP_OBJECT_MODIFIED_FLAG) {
flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
}
flags &= SP_OBJECT_MODIFIED_CASCADE;
- GSList *l = g_slist_reverse(this->childList(true));
-
- while (l) {
- child = SP_OBJECT (l->data);
- l = g_slist_remove (l, child);
+ std::vector<SPObject*> l=this->childList(true);
+ for(std::vector<SPObject*>::const_iterator i=l.begin();i!=l.end();i++){
+ SPObject *child = *i;
if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
child->emitModified(flags);
@@ -286,35 +279,27 @@ Geom::OptRect SPGroup::bbox(Geom::Affine const &transform, SPItem::BBoxType bbox
Geom::OptRect bbox;
// TODO CPPIFY: replace this const_cast later
- GSList *l = const_cast<SPGroup*>(this)->childList(false, SPObject::ActionBBox);
-
- while (l) {
- SPObject *o = SP_OBJECT (l->data);
-
+ std::vector<SPObject*> l = const_cast<SPGroup*>(this)->childList(false, SPObject::ActionBBox);
+ for(std::vector<SPObject*>::const_iterator i=l.begin();i!=l.end();i++){
+ SPObject *o = *i;
SPItem *item = dynamic_cast<SPItem *>(o);
if (item && !item->isHidden()) {
Geom::Affine const ct(item->transform * transform);
bbox |= item->bounds(bboxtype, ct);
}
-
- l = g_slist_remove (l, o);
}
return bbox;
}
void SPGroup::print(SPPrintContext *ctx) {
- GSList *l = g_slist_reverse(this->childList(false));
-
- while (l) {
- SPObject *o = SP_OBJECT (l->data);
-
+ std::vector<SPObject*> l=this->childList(false);
+ for(std::vector<SPObject*>::const_iterator i=l.begin();i!=l.end();i++){
+ SPObject *o = *i;
SPItem *item = dynamic_cast<SPItem *>(o);
if (item) {
item->invoke_print(ctx);
}
-
- l = g_slist_remove (l, o);
}
}
@@ -362,17 +347,14 @@ Inkscape::DrawingItem *SPGroup::show (Inkscape::Drawing &drawing, unsigned int k
}
void SPGroup::hide (unsigned int key) {
- GSList *l = g_slist_reverse(this->childList(false, SPObject::ActionShow));
-
- while (l) {
- SPObject *o = SP_OBJECT (l->data);
+ std::vector<SPObject*> l=this->childList(false, SPObject::ActionShow);
+ for(std::vector<SPObject*>::const_iterator i=l.begin();i!=l.end();i++){
+ SPObject *o = *i;
SPItem *item = dynamic_cast<SPItem *>(o);
if (item) {
item->invoke_hide(key);
}
-
- l = g_slist_remove (l, o);
}
// SPLPEItem::onHide(key);
@@ -393,7 +375,7 @@ void sp_item_group_ungroup_handle_clones(SPItem *parent, Geom::Affine const g)
{
for(std::list<SPObject*>::const_iterator refd=parent->hrefList.begin();refd!=parent->hrefList.end();refd++){
SPItem *citem = dynamic_cast<SPItem *>(*refd);
- if (citem) {
+ if (citem && !citem->cloned) {
SPUse *useitem = dynamic_cast<SPUse *>(citem);
if (useitem && useitem->get_original() == parent) {
Geom::Affine ctrans;
@@ -407,7 +389,7 @@ void sp_item_group_ungroup_handle_clones(SPItem *parent, Geom::Affine const g)
}
void
-sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done)
+sp_item_group_ungroup (SPGroup *group, std::vector<SPItem*> &children, bool do_done)
{
g_return_if_fail (group != NULL);
@@ -559,15 +541,12 @@ sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done)
if (item) {
item->doWriteTransform(repr, item->transform, NULL, false);
+ children.insert(children.begin(),item);
} else {
g_assert_not_reached();
}
Inkscape::GC::release(repr);
- if (children && item) {
- *children = g_slist_prepend(*children, item);
- }
-
items = g_slist_remove (items, items->data);
}
@@ -580,19 +559,17 @@ sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done)
* some API for list aspect of SPGroup
*/
-GSList *sp_item_group_item_list(SPGroup * group)
+std::vector<SPItem*> sp_item_group_item_list(SPGroup * group)
{
- g_return_val_if_fail(group != NULL, NULL);
-
- GSList *s = NULL;
+ std::vector<SPItem*> s;
+ g_return_val_if_fail(group != NULL, s);
for (SPObject *o = group->firstChild() ; o ; o = o->getNext() ) {
if ( dynamic_cast<SPItem *>(o) ) {
- s = g_slist_prepend(s, o);
+ s.push_back((SPItem*)o);
}
}
-
- return g_slist_reverse (s);
+ return s;
}
SPObject *sp_item_group_get_child_by_name(SPGroup *group, SPObject *ref, const gchar *name)
@@ -807,9 +784,9 @@ gint SPGroup::getItemCount() const {
void SPGroup::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags) {
Inkscape::DrawingItem *ac = NULL;
- GSList *l = g_slist_reverse(this->childList(false, SPObject::ActionShow));
- while (l) {
- SPObject *o = SP_OBJECT (l->data);
+ std::vector<SPObject*> l=this->childList(false, SPObject::ActionShow);
+ for(std::vector<SPObject*>::const_iterator i=l.begin();i!=l.end();i++){
+ SPObject *o = *i;
SPItem * child = dynamic_cast<SPItem *>(o);
if (child) {
ac = child->invoke_show (drawing, key, flags);
@@ -817,7 +794,6 @@ void SPGroup::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *
ai->appendChild(ac);
}
}
- l = g_slist_remove (l, o);
}
}
@@ -826,10 +802,10 @@ void SPGroup::update_patheffect(bool write) {
g_message("sp_group_update_patheffect: %p\n", lpeitem);
#endif
- GSList const *item_list = sp_item_group_item_list(this);
+ std::vector<SPItem*> const item_list = sp_item_group_item_list(this);
- for ( GSList const *iter = item_list; iter; iter = iter->next ) {
- SPObject *subitem = static_cast<SPObject *>(iter->data);
+ for ( std::vector<SPItem*>::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) {
+ SPObject *subitem = *iter;
SPLPEItem *lpeItem = dynamic_cast<SPLPEItem *>(subitem);
if (lpeItem) {
@@ -854,10 +830,10 @@ void SPGroup::update_patheffect(bool write) {
static void
sp_group_perform_patheffect(SPGroup *group, SPGroup *topgroup, bool write)
{
- GSList const *item_list = sp_item_group_item_list(group);
+ std::vector<SPItem*> const item_list = sp_item_group_item_list(group);
- for ( GSList const *iter = item_list; iter; iter = iter->next ) {
- SPObject *subitem = static_cast<SPObject *>(iter->data);
+ for ( std::vector<SPItem*>::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) {
+ SPObject *subitem = *iter;
SPGroup *subGroup = dynamic_cast<SPGroup *>(subitem);
if (subGroup) {
diff --git a/src/sp-item-group.h b/src/sp-item-group.h
index f9a8b88f5..fc0b6382f 100644
--- a/src/sp-item-group.h
+++ b/src/sp-item-group.h
@@ -95,6 +95,7 @@ public:
virtual void update_patheffect(bool write);
};
+
/**
* finds clones of a child of the group going out of the group; and inverse the group transform on its clones
* Also called when moving objects between different layers
@@ -104,10 +105,11 @@ public:
*/
void sp_item_group_ungroup_handle_clones(SPItem *parent, Geom::Affine const g);
-void sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done = true);
+void sp_item_group_ungroup (SPGroup *group, std::vector<SPItem*> &children, bool do_done = true);
+
+std::vector<SPItem*> sp_item_group_item_list (SPGroup *group);
-GSList *sp_item_group_item_list (SPGroup *group);
SPObject *sp_item_group_get_child_by_name (SPGroup *group, SPObject *ref, const char *name);
#endif
diff --git a/src/sp-item-transform.cpp b/src/sp-item-transform.cpp
index 767f0ed91..f1c69cdf6 100644
--- a/src/sp-item-transform.cpp
+++ b/src/sp-item-transform.cpp
@@ -152,7 +152,7 @@ Geom::Affine get_scale_transform_for_uniform_stroke(Geom::Rect const &bbox_visua
gdouble scale_x = 1;
gdouble scale_y = 1;
- gdouble r1 = r0;
+ gdouble r1;
if ((fabs(w0 - stroke_x) < 1e-6) || w1 == 0) { // We have a vertical line at hand
scale_y = h1/h0;
@@ -310,8 +310,8 @@ Geom::Affine get_scale_transform_for_variable_stroke(Geom::Rect const &bbox_visu
gdouble scale_x = 1;
gdouble scale_y = 1;
- gdouble r1h = r0h;
- gdouble r1w = r0w;
+ gdouble r1h;
+ gdouble r1w;
if ((fabs(w0 - r0w) < 1e-6) || w1 == 0) { // We have a vertical line at hand
scale_y = h1/h0;
diff --git a/src/sp-lpe-item.cpp b/src/sp-lpe-item.cpp
index 12d85b3ed..9befd2a2b 100644
--- a/src/sp-lpe-item.cpp
+++ b/src/sp-lpe-item.cpp
@@ -353,9 +353,9 @@ sp_lpe_item_create_original_path_recursive(SPLPEItem *lpeitem)
sp_lpe_item_create_original_path_recursive(SP_LPE_ITEM(clipPath->firstChild()));
}
if (SP_IS_GROUP(lpeitem)) {
- GSList const *item_list = sp_item_group_item_list(SP_GROUP(lpeitem));
- for ( GSList const *iter = item_list; iter; iter = iter->next ) {
- SPObject *subitem = static_cast<SPObject *>(iter->data);
+ std::vector<SPItem*> item_list = sp_item_group_item_list(SP_GROUP(lpeitem));
+ for ( std::vector<SPItem*>::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) {
+ SPObject *subitem = *iter;
if (SP_IS_LPE_ITEM(subitem)) {
sp_lpe_item_create_original_path_recursive(SP_LPE_ITEM(subitem));
}
@@ -387,9 +387,9 @@ sp_lpe_item_cleanup_original_path_recursive(SPLPEItem *lpeitem)
sp_lpe_item_cleanup_original_path_recursive(SP_LPE_ITEM(clipPath->firstChild()));
}
}
- GSList const *item_list = sp_item_group_item_list(SP_GROUP(lpeitem));
- for ( GSList const *iter = item_list; iter; iter = iter->next ) {
- SPObject *subitem = static_cast<SPObject *>(iter->data);
+ std::vector<SPItem*> item_list = sp_item_group_item_list(SP_GROUP(lpeitem));
+ for ( std::vector<SPItem*>::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) {
+ SPObject *subitem = *iter;
if (SP_IS_LPE_ITEM(subitem)) {
sp_lpe_item_cleanup_original_path_recursive(SP_LPE_ITEM(subitem));
}
@@ -680,9 +680,9 @@ SPLPEItem::apply_to_clippath(SPItem *item)
}
}
if(SP_IS_GROUP(item)){
- GSList const *item_list = sp_item_group_item_list(SP_GROUP(item));
- for ( GSList const *iter = item_list; iter; iter = iter->next ) {
- SPObject *subitem = static_cast<SPObject *>(iter->data);
+ std::vector<SPItem*> item_list = sp_item_group_item_list(SP_GROUP(item));
+ for ( std::vector<SPItem*>::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) {
+ SPObject *subitem = *iter;
apply_to_clippath(SP_ITEM(subitem));
}
}
@@ -732,9 +732,9 @@ SPLPEItem::apply_to_mask(SPItem *item)
}
}
if(SP_IS_GROUP(item)){
- GSList const *item_list = sp_item_group_item_list(SP_GROUP(item));
- for ( GSList const *iter = item_list; iter; iter = iter->next ) {
- SPObject *subitem = static_cast<SPObject *>(iter->data);
+ std::vector<SPItem*> item_list = sp_item_group_item_list(SP_GROUP(item));
+ for ( std::vector<SPItem*>::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) {
+ SPObject *subitem = *iter;
apply_to_mask(SP_ITEM(subitem));
}
}
@@ -746,9 +746,9 @@ SPLPEItem::apply_to_clip_or_mask_group(SPItem *group, SPItem *item)
if (!SP_IS_GROUP(group)) {
return;
}
- GSList *item_list = sp_item_group_item_list(SP_GROUP(group));
- for ( GSList *iter = item_list; iter; iter = iter->next ) {
- SPObject *subitem = static_cast<SPObject *>(iter->data);
+ std::vector<SPItem*> item_list = sp_item_group_item_list(SP_GROUP(group));
+ for ( std::vector<SPItem*>::const_iterator iter=item_list.begin();iter!=item_list.end();iter++) {
+ SPObject *subitem = *iter;
if (SP_IS_GROUP(subitem)) {
apply_to_clip_or_mask_group(SP_ITEM(subitem), item);
} else if (SP_IS_SHAPE(subitem)) {
diff --git a/src/sp-marker.cpp b/src/sp-marker.cpp
index d3cf50fa7..9334614dc 100644
--- a/src/sp-marker.cpp
+++ b/src/sp-marker.cpp
@@ -419,7 +419,7 @@ sp_marker_hide (SPMarker *marker, unsigned int key)
}
-const gchar *generate_marker(GSList *reprs, Geom::Rect bounds, SPDocument *document, Geom::Point center, Geom::Affine move)
+const gchar *generate_marker(std::vector<Inkscape::XML::Node*> &reprs, Geom::Rect bounds, SPDocument *document, Geom::Point center, Geom::Affine move)
{
Inkscape::XML::Document *xml_doc = document->getReprDoc();
Inkscape::XML::Node *defsrepr = document->getDefs()->getRepr();
@@ -442,8 +442,8 @@ const gchar *generate_marker(GSList *reprs, Geom::Rect bounds, SPDocument *docum
const gchar *mark_id = repr->attribute("id");
SPObject *mark_object = document->getObjectById(mark_id);
- for (GSList *i = reprs; i != NULL; i = i->next) {
- Inkscape::XML::Node *node = (Inkscape::XML::Node *)(i->data);
+ for (std::vector<Inkscape::XML::Node*>::const_iterator i=reprs.begin();i!=reprs.end();i++){
+ Inkscape::XML::Node *node = *i;
SPItem *copy = SP_ITEM(mark_object->appendChildRepr(node));
Geom::Affine dup_transform;
diff --git a/src/sp-marker.h b/src/sp-marker.h
index e804fd7dc..56cbaf94f 100644
--- a/src/sp-marker.h
+++ b/src/sp-marker.h
@@ -101,7 +101,7 @@ Inkscape::DrawingItem *sp_marker_show_instance (SPMarker *marker, Inkscape::Draw
unsigned int key, unsigned int pos,
Geom::Affine const &base, float linewidth);
void sp_marker_hide (SPMarker *marker, unsigned int key);
-const char *generate_marker (GSList *reprs, Geom::Rect bounds, SPDocument *document, Geom::Point center, Geom::Affine move);
+const char *generate_marker (std::vector<Inkscape::XML::Node*> &reprs, Geom::Rect bounds, SPDocument *document, Geom::Point center, Geom::Affine move);
SPObject *sp_marker_fork_if_necessary(SPObject *marker);
#endif
diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp
index 3154c9e7b..12c2cdf8e 100644
--- a/src/sp-namedview.cpp
+++ b/src/sp-namedview.cpp
@@ -517,7 +517,7 @@ void SPNamedView::set(unsigned int key, const gchar* value) {
this->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_INKSCAPE_SNAP_NODE_CUSP:
- this->snap_manager.snapprefs.setTargetSnappable(Inkscape::SNAPTARGET_NODE_CUSP, value ? sp_str_to_bool(value) : FALSE);
+ this->snap_manager.snapprefs.setTargetSnappable(Inkscape::SNAPTARGET_NODE_CUSP, value ? sp_str_to_bool(value) : TRUE);
this->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_INKSCAPE_SNAP_BBOX_EDGE:
diff --git a/src/sp-object.cpp b/src/sp-object.cpp
index 343db435e..0bb8c240f 100644
--- a/src/sp-object.cpp
+++ b/src/sp-object.cpp
@@ -357,6 +357,10 @@ int sp_object_compare_position(SPObject const *first, SPObject const *second)
return result;
}
+bool sp_object_compare_position_bool(SPObject const *first, SPObject const *second){
+ return sp_object_compare_position(first,second)<0;
+}
+
SPObject *SPObject::appendChildRepr(Inkscape::XML::Node *repr) {
if ( !cloned ) {
@@ -380,14 +384,14 @@ void SPObject::changeCSS(SPCSSAttr *css, gchar const *attr)
sp_repr_css_change(this->getRepr(), css, attr);
}
-GSList *SPObject::childList(bool add_ref, Action) {
- GSList *l = NULL;
+std::vector<SPObject*> SPObject::childList(bool add_ref, Action) {
+ std::vector<SPObject*> l;
for ( SPObject *child = firstChild() ; child; child = child->getNext() ) {
if (add_ref) {
sp_object_ref (child);
}
- l = g_slist_prepend (l, child);
+ l.push_back(child);
}
return l;
diff --git a/src/sp-object.h b/src/sp-object.h
index ab0b444b6..7bc02fad5 100644
--- a/src/sp-object.h
+++ b/src/sp-object.h
@@ -52,6 +52,7 @@ class SPObject;
#include <sigc++/connection.h>
#include <sigc++/functors/slot.h>
#include <sigc++/signal.h>
+#include <vector>
#include "version.h"
#include "util/forward-pointer-iterator.h"
@@ -328,10 +329,10 @@ public:
enum Action { ActionGeneral, ActionBBox, ActionUpdate, ActionShow };
/**
- * Retrieves the children as a GSList object, optionally ref'ing the children
+ * Retrieves the children as a std vector object, optionally ref'ing the children
* in the process, if add_ref is specified.
*/
- GSList *childList(bool add_ref, Action action = ActionGeneral);
+ std::vector<SPObject*> childList(bool add_ref, Action action = ActionGeneral);
/**
* Append repr as child of this object.
@@ -875,6 +876,7 @@ public:
* -1 first object's position is less than the second \endverbatim
*/
int sp_object_compare_position(SPObject const *first, SPObject const *second);
+bool sp_object_compare_position_bool(SPObject const *first, SPObject const *second);
#endif // SP_OBJECT_H_SEEN
diff --git a/src/sp-pattern.cpp b/src/sp-pattern.cpp
index 987a86fe4..e89ed77ba 100644
--- a/src/sp-pattern.cpp
+++ b/src/sp-pattern.cpp
@@ -398,7 +398,7 @@ sp_pattern_transform_multiply (SPPattern *pattern, Geom::Affine postmul, bool se
g_free(c);
}
-const gchar *pattern_tile(GSList *reprs, Geom::Rect bounds, SPDocument *document, Geom::Affine transform, Geom::Affine move)
+const gchar *pattern_tile(const std::vector<Inkscape::XML::Node*> &reprs, Geom::Rect bounds, SPDocument *document, Geom::Affine transform, Geom::Affine move)
{
Inkscape::XML::Document *xml_doc = document->getReprDoc();
Inkscape::XML::Node *defsrepr = document->getDefs()->getRepr();
@@ -416,8 +416,8 @@ const gchar *pattern_tile(GSList *reprs, Geom::Rect bounds, SPDocument *document
const gchar *pat_id = repr->attribute("id");
SPObject *pat_object = document->getObjectById(pat_id);
- for (GSList *i = reprs; i != NULL; i = i->next) {
- Inkscape::XML::Node *node = (Inkscape::XML::Node *)(i->data);
+ for (std::vector<Inkscape::XML::Node*>::const_iterator i=reprs.begin();i!=reprs.end();i++){
+ Inkscape::XML::Node *node = *i;
SPItem *copy = SP_ITEM(pat_object->appendChildRepr(node));
Geom::Affine dup_transform;
diff --git a/src/sp-pattern.h b/src/sp-pattern.h
index f021101e2..34dd5a05b 100644
--- a/src/sp-pattern.h
+++ b/src/sp-pattern.h
@@ -89,7 +89,7 @@ SPPattern *pattern_chain (SPPattern *pattern);
SPPattern *sp_pattern_clone_if_necessary (SPItem *item, SPPattern *pattern, const char *property);
void sp_pattern_transform_multiply (SPPattern *pattern, Geom::Affine postmul, bool set);
-const char *pattern_tile (GSList *reprs, Geom::Rect bounds, SPDocument *document, Geom::Affine transform, Geom::Affine move);
+const char *pattern_tile (const std::vector<Inkscape::XML::Node*> &reprs, Geom::Rect bounds, SPDocument *document, Geom::Affine transform, Geom::Affine move);
SPPattern *pattern_getroot (SPPattern *pat);
diff --git a/src/sp-switch.cpp b/src/sp-switch.cpp
index 66cec3637..cfc0e7d8b 100644
--- a/src/sp-switch.cpp
+++ b/src/sp-switch.cpp
@@ -41,21 +41,22 @@ SPObject *SPSwitch::_evaluateFirst() {
return first;
}
-GSList *SPSwitch::_childList(bool add_ref, SPObject::Action action) {
+std::vector<SPObject*> SPSwitch::_childList(bool add_ref, SPObject::Action action) {
if ( action != SPObject::ActionGeneral ) {
return this->childList(add_ref, action);
}
SPObject *child = _evaluateFirst();
+ std::vector<SPObject*> x;
if (NULL == child)
- return NULL;
+ return x;
if (add_ref) {
//g_object_ref (G_OBJECT (child));
sp_object_ref(child);
}
-
- return g_slist_prepend (NULL, child);
+ x.push_back(child);
+ return x;
}
const char *SPSwitch::displayName() const {
@@ -95,10 +96,9 @@ void SPSwitch::_reevaluate(bool /*add_to_drawing*/) {
_releaseLastItem(_cached_item);
- for ( GSList *l = _childList(false, SPObject::ActionShow);
- NULL != l ; l = g_slist_remove (l, l->data))
- {
- SPObject *o = SP_OBJECT (l->data);
+ std::vector<SPObject*> item_list = _childList(false, SPObject::ActionShow);
+ for ( std::vector<SPObject*>::const_reverse_iterator iter=item_list.rbegin();iter!=item_list.rend();iter++) {
+ SPObject *o = *iter;
if ( !SP_IS_ITEM (o) ) {
continue;
}
@@ -130,10 +130,10 @@ void SPSwitch::_releaseLastItem(SPObject *obj)
void SPSwitch::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags) {
SPObject *evaluated_child = this->_evaluateFirst();
- GSList *l = this->_childList(false, SPObject::ActionShow);
+ std::vector<SPObject*> l = this->_childList(false, SPObject::ActionShow);
- while (l) {
- SPObject *o = SP_OBJECT (l->data);
+ for ( std::vector<SPObject*>::const_reverse_iterator iter=l.rbegin();iter!=l.rend();iter++) {
+ SPObject *o = *iter;
if (SP_IS_ITEM (o)) {
SPItem * child = SP_ITEM(o);
@@ -144,8 +144,6 @@ void SPSwitch::_showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem
ai->appendChild(ac);
}
}
-
- l = g_slist_remove (l, o);
}
}
diff --git a/src/sp-switch.h b/src/sp-switch.h
index 4fce1f5a6..7152e1b82 100644
--- a/src/sp-switch.h
+++ b/src/sp-switch.h
@@ -29,7 +29,7 @@ public:
void resetChildEvaluated() { _reevaluate(); }
- GSList *_childList(bool add_ref, SPObject::Action action);
+ std::vector<SPObject*> _childList(bool add_ref, SPObject::Action action);
virtual void _showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags);
SPObject *_evaluateFirst();
diff --git a/src/sp-text.cpp b/src/sp-text.cpp
index 0dca42bb4..d351e58e3 100644
--- a/src/sp-text.cpp
+++ b/src/sp-text.cpp
@@ -149,7 +149,7 @@ void SPText::remove_child(Inkscape::XML::Node *rch) {
void SPText::update(SPCtx *ctx, guint flags) {
unsigned childflags = (flags & SP_OBJECT_MODIFIED_CASCADE);
if (flags & SP_OBJECT_MODIFIED_FLAG) {
- childflags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
+ childflags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
}
// Create temporary list of children
@@ -519,7 +519,7 @@ unsigned SPText::_buildLayoutInput(SPObject *root, Inkscape::Text::Layout::Optio
}
}
}
-
+
if (SP_IS_TEXT(root)) {
SP_TEXT(root)->attributes.mergeInto(&optional_attrs, parent_optional_attrs, parent_attrs_offset, true, true);
if (SP_TEXT(root)->attributes.getTextLength()->_set) { // set textLength on the entire layout, see note in TNG-Layout.h
@@ -571,7 +571,7 @@ unsigned SPText::_buildLayoutInput(SPObject *root, Inkscape::Text::Layout::Optio
child_attrs_offset--;
}
}
-
+
for (SPObject *child = root->firstChild() ; child ; child = child->getNext() ) {
SPString *str = dynamic_cast<SPString *>(child);
if (str) {
@@ -691,15 +691,15 @@ bool TextTagAttributes::readSingleAttribute(unsigned key, gchar const *value)
case SP_ATTR_DX: attr_vector = &attributes.dx; break;
case SP_ATTR_DY: attr_vector = &attributes.dy; break;
case SP_ATTR_ROTATE: attr_vector = &attributes.rotate; break;
- case SP_ATTR_TEXTLENGTH:
- attributes.textLength.readOrUnset(value);
- return true;
+ case SP_ATTR_TEXTLENGTH:
+ attributes.textLength.readOrUnset(value);
+ return true;
break;
- case SP_ATTR_LENGTHADJUST:
- attributes.lengthAdjust = (value && !strcmp(value, "spacingAndGlyphs")?
- Inkscape::Text::Layout::LENGTHADJUST_SPACINGANDGLYPHS :
+ case SP_ATTR_LENGTHADJUST:
+ attributes.lengthAdjust = (value && !strcmp(value, "spacingAndGlyphs")?
+ Inkscape::Text::Layout::LENGTHADJUST_SPACINGANDGLYPHS :
Inkscape::Text::Layout::LENGTHADJUST_SPACING); // default is "spacing"
- return true;
+ return true;
break;
default: return false;
}
@@ -724,7 +724,7 @@ void TextTagAttributes::writeTo(Inkscape::XML::Node *node) const
node->setAttribute("lengthAdjust", "spacing");
} else if (attributes.lengthAdjust == Inkscape::Text::Layout::LENGTHADJUST_SPACINGANDGLYPHS) {
node->setAttribute("lengthAdjust", "spacingAndGlyphs");
- }
+ }
}
}
@@ -734,7 +734,7 @@ void TextTagAttributes::writeSingleAttributeLength(Inkscape::XML::Node *node, gc
gchar single_value_string[32];
g_ascii_formatd(single_value_string, sizeof (single_value_string), "%.8g", length.computed);
node->setAttribute(key, single_value_string);
- } else
+ } else
node->setAttribute(key, NULL);
}
@@ -802,7 +802,7 @@ void TextTagAttributes::mergeInto(Inkscape::Text::Layout::OptionalTextTagAttrs *
output->textLength.unit = attributes.textLength.unit;
output->textLength._set = attributes.textLength._set;
output->lengthAdjust = attributes.lengthAdjust;
- }
+ }
}
void TextTagAttributes::mergeSingleAttribute(std::vector<SVGLength> *output_list, std::vector<SVGLength> const &parent_list, unsigned parent_offset, std::vector<SVGLength> const *overlay_list)
diff --git a/src/splivarot.cpp b/src/splivarot.cpp
index 0c62cfe8a..726df6e20 100644
--- a/src/splivarot.cpp
+++ b/src/splivarot.cpp
@@ -328,21 +328,21 @@ void
sp_selected_path_boolop(Inkscape::Selection *selection, SPDesktop *desktop, bool_op bop, const unsigned int verb, const Glib::ustring description)
{
SPDocument *doc = selection->layers()->getDocument();
- GSList *il = (GSList *) selection->itemList();
+ std::vector<SPItem*> il= selection->itemList();
// allow union on a single object for the purpose of removing self overlapse (svn log, revision 13334)
- if ( (g_slist_length(il) < 2) && (bop != bool_op_union)) {
+ if ( (il.size() < 2) && (bop != bool_op_union)) {
boolop_display_error_message(desktop, _("Select <b>at least 2 paths</b> to perform a boolean operation."));
return;
}
- else if ( g_slist_length(il) < 1 ) {
+ else if ( il.size() < 1 ) {
boolop_display_error_message(desktop, _("Select <b>at least 1 path</b> to perform a boolean union."));
return;
}
- g_assert(il != NULL);
+ g_assert(!il.empty());
- if (g_slist_length(il) > 2) {
+ if (il.size() > 2) {
if (bop == bool_op_diff || bop == bool_op_cut || bop == bool_op_slice ) {
boolop_display_error_message(desktop, _("Select <b>exactly 2 paths</b> to perform difference, division, or path cut."));
return;
@@ -356,8 +356,8 @@ sp_selected_path_boolop(Inkscape::Selection *selection, SPDesktop *desktop, bool
if (bop == bool_op_diff || bop == bool_op_cut || bop == bool_op_slice) {
// check in the tree to find which element of the selection list is topmost (for 2-operand commands only)
- Inkscape::XML::Node *a = SP_OBJECT(il->data)->getRepr();
- Inkscape::XML::Node *b = SP_OBJECT(il->next->data)->getRepr();
+ Inkscape::XML::Node *a = il.front()->getRepr();
+ Inkscape::XML::Node *b = il.back()->getRepr();
if (a == NULL || b == NULL) {
boolop_display_error_message(desktop, _("Unable to determine the <b>z-order</b> of the objects selected for difference, XOR, division, or path cut."));
@@ -396,38 +396,36 @@ sp_selected_path_boolop(Inkscape::Selection *selection, SPDesktop *desktop, bool
}
}
- il = g_slist_copy(il);
- g_assert(il != NULL);
+ g_assert(!il.empty());
// first check if all the input objects have shapes
// otherwise bail out
- for (GSList *l = il; l != NULL; l = l->next)
+ for (std::vector<SPItem*>::const_iterator l = il.begin(); l != il.end(); l++)
{
- SPItem *item = SP_ITEM(l->data);
+ SPItem *item = *l;
if (!SP_IS_SHAPE(item) && !SP_IS_TEXT(item) && !SP_IS_FLOWTEXT(item))
{
boolop_display_error_message(desktop, _("One of the objects is <b>not a path</b>, cannot perform boolean operation."));
- g_slist_free(il);
return;
}
}
// extract the livarot Paths from the source objects
// also get the winding rule specified in the style
- int nbOriginaux = g_slist_length(il);
+ int nbOriginaux = il.size();
std::vector<Path *> originaux(nbOriginaux);
std::vector<FillRule> origWind(nbOriginaux);
int curOrig;
{
curOrig = 0;
- for (GSList *l = il; l != NULL; l = l->next)
+ for (std::vector<SPItem*>::const_iterator l = il.begin(); l != il.end(); l++)
{
// apply live path effects prior to performing boolean operation
- if (SP_IS_LPE_ITEM(l->data)) {
- SP_LPE_ITEM(l->data)->removeAllPathEffects(true);
+ if (SP_IS_LPE_ITEM(*l)) {
+ SP_LPE_ITEM(*l)->removeAllPathEffects(true);
}
- SPCSSAttr *css = sp_repr_css_attr(reinterpret_cast<SPObject *>(il->data)->getRepr(), "style");
+ SPCSSAttr *css = sp_repr_css_attr(reinterpret_cast<SPObject *>(il[0])->getRepr(), "style");
gchar const *val = sp_repr_css_property(css, "fill-rule", NULL);
if (val && strcmp(val, "nonzero") == 0) {
origWind[curOrig]= fill_nonZero;
@@ -437,11 +435,10 @@ sp_selected_path_boolop(Inkscape::Selection *selection, SPDesktop *desktop, bool
origWind[curOrig]= fill_nonZero;
}
- originaux[curOrig] = Path_for_item((SPItem *) l->data, true, true);
+ originaux[curOrig] = Path_for_item(*l, true, true);
if (originaux[curOrig] == NULL || originaux[curOrig]->descr_cmd.size() <= 1)
{
for (int i = curOrig; i >= 0; i--) delete originaux[i];
- g_slist_free(il);
return;
}
curOrig++;
@@ -475,7 +472,8 @@ sp_selected_path_boolop(Inkscape::Selection *selection, SPDesktop *desktop, bool
theShapeA->ConvertToShape(theShape, origWind[0]);
curOrig = 1;
- for (GSList *l = il->next; l != NULL; l = l->next) {
+ for (std::vector<SPItem*>::const_iterator l = il.begin(); l != il.end(); l++){
+ if(*l==il[0])continue;
originaux[curOrig]->ConvertWithBackData(0.1);
originaux[curOrig]->Fill(theShape, curOrig);
@@ -671,15 +669,13 @@ sp_selected_path_boolop(Inkscape::Selection *selection, SPDesktop *desktop, bool
if (res->descr_cmd.size() <= 1)
{
// only one command, presumably a moveto: it isn't a path
- for (GSList *l = il; l != NULL; l = l->next)
- {
- SP_OBJECT(l->data)->deleteObject();
+ for (std::vector<SPItem*>::const_iterator l = il.begin(); l != il.end(); l++){
+ (*l)->deleteObject();
}
DocumentUndo::done(doc, SP_VERB_NONE, description);
selection->clear();
delete res;
- g_slist_free(il);
return;
}
@@ -687,19 +683,17 @@ sp_selected_path_boolop(Inkscape::Selection *selection, SPDesktop *desktop, bool
SPObject *source;
if ( bop == bool_op_diff || bop == bool_op_cut || bop == bool_op_slice ) {
if (reverseOrderForOp) {
- source = SP_OBJECT(il->data);
+ source = il[0];
} else {
- source = SP_OBJECT(il->next->data);
+ source = il.back();
}
} else {
// find out the bottom object
- GSList *sorted = g_slist_copy((GSList *) selection->reprList());
-
- sorted = g_slist_sort(sorted, (GCompareFunc) sp_repr_compare_position);
+ std::vector<Inkscape::XML::Node*> sorted(selection->reprList());
- source = doc->getObjectByRepr((Inkscape::XML::Node *)sorted->data);
+ sort(sorted.begin(),sorted.end(),sp_repr_compare_position_bool);
- g_slist_free(sorted);
+ source = doc->getObjectByRepr(sorted.front());
}
// adjust style properties that depend on a possible transform in the source object in order
@@ -724,17 +718,16 @@ sp_selected_path_boolop(Inkscape::Selection *selection, SPDesktop *desktop, bool
gchar *desc = source->desc();
// remove source paths
selection->clear();
- for (GSList *l = il; l != NULL; l = l->next) {
+ for (std::vector<SPItem*>::const_iterator l = il.begin(); l != il.end(); l++){
// if this is the bottommost object,
- if (!strcmp(reinterpret_cast<SPObject *>(l->data)->getRepr()->attribute("id"), id)) {
+ if (!strcmp(reinterpret_cast<SPObject *>(*l)->getRepr()->attribute("id"), id)) {
// delete it so that its clones don't get alerted; this object will be restored shortly, with the same id
- SP_OBJECT(l->data)->deleteObject(false);
+ (*l)->deleteObject(false);
} else {
// delete the object for real, so that its clones can take appropriate action
- SP_OBJECT(l->data)->deleteObject();
+ (*l)->deleteObject();
}
}
- g_slist_free(il);
// premultiply by the inverse of parent's repr
SPItem *parent_item = SP_ITEM(doc->getObjectByRepr(parent));
@@ -1162,12 +1155,9 @@ sp_selected_path_outline(SPDesktop *desktop)
}
bool did = false;
-
- for (GSList *items = g_slist_copy((GSList *) selection->itemList());
- items != NULL;
- items = items->next) {
-
- SPItem *item = SP_ITEM(items->data);
+ std::vector<SPItem*> il(selection->itemList());
+ for (std::vector<SPItem*>::const_iterator l = il.begin(); l != il.end(); l++){
+ SPItem *item = *l;
if (!SP_IS_SHAPE(item) && !SP_IS_TEXT(item))
continue;
@@ -1779,12 +1769,9 @@ sp_selected_path_do_offset(SPDesktop *desktop, bool expand, double prefOffset)
}
bool did = false;
-
- for (GSList *items = g_slist_copy((GSList *) selection->itemList());
- items != NULL;
- items = items->next) {
-
- SPItem *item = SP_ITEM(items->data);
+ std::vector<SPItem*> il(selection->itemList());
+ for (std::vector<SPItem*>::const_iterator l = il.begin(); l != il.end(); l++){
+ SPItem *item = *l;
SPCurve *curve = NULL;
if (!SP_IS_SHAPE(item) && !SP_IS_TEXT(item))
@@ -1980,7 +1967,7 @@ sp_selected_path_do_offset(SPDesktop *desktop, bool expand, double prefOffset)
static bool
sp_selected_path_simplify_items(SPDesktop *desktop,
- Inkscape::Selection *selection, GSList *items,
+ Inkscape::Selection *selection, std::vector<SPItem*> &items,
float threshold, bool justCoalesce,
float angleLimit, bool breakableAngles,
bool modifySelection);
@@ -1999,7 +1986,7 @@ sp_selected_path_simplify_item(SPDesktop *desktop,
//If this is a group, do the children instead
if (SP_IS_GROUP(item)) {
- GSList *items = sp_item_group_item_list(SP_GROUP(item));
+ std::vector<SPItem*> items = sp_item_group_item_list(SP_GROUP(item));
return sp_selected_path_simplify_items(desktop, selection, items,
threshold, justCoalesce,
@@ -2124,7 +2111,7 @@ sp_selected_path_simplify_item(SPDesktop *desktop,
bool
sp_selected_path_simplify_items(SPDesktop *desktop,
- Inkscape::Selection *selection, GSList *items,
+ Inkscape::Selection *selection, std::vector<SPItem*> &items,
float threshold, bool justCoalesce,
float angleLimit, bool breakableAngles,
bool modifySelection)
@@ -2150,13 +2137,13 @@ sp_selected_path_simplify_items(SPDesktop *desktop,
gdouble simplifySize = selectionSize;
int pathsSimplified = 0;
- int totalPathCount = g_slist_length(items);
+ int totalPathCount = items.size();
// set "busy" cursor
desktop->setWaitingCursor();
- for (; items != NULL; items = items->next) {
- SPItem *item = (SPItem *) items->data;
+ for (std::vector<SPItem*>::const_iterator l = items.begin(); l != items.end(); l++){
+ SPItem *item = *l;
if (!(SP_IS_GROUP(item) || SP_IS_SHAPE(item) || SP_IS_TEXT(item)))
continue;
@@ -2204,7 +2191,7 @@ sp_selected_path_simplify_selection(SPDesktop *desktop, float threshold, bool ju
return;
}
- GSList *items = g_slist_copy((GSList *) selection->itemList());
+ std::vector<SPItem*> items(selection->itemList());
bool didSomething = sp_selected_path_simplify_items(desktop, selection,
items, threshold,
diff --git a/src/style-enums.h b/src/style-enums.h
index f52752018..f235b6699 100644
--- a/src/style-enums.h
+++ b/src/style-enums.h
@@ -72,6 +72,72 @@ enum SPCSSFontStretch {
SP_CSS_FONT_STRETCH_WIDER
};
+// Can select more than one
+enum SPCSSFontVariantLigatures {
+ SP_CSS_FONT_VARIANT_LIGATURES_NORMAL,
+ SP_CSS_FONT_VARIANT_LIGATURES_NONE,
+ SP_CSS_FONT_VARIANT_LIGATURES_COMMON,
+ SP_CSS_FONT_VARIANT_LIGATURES_NO_COMMON,
+ SP_CSS_FONT_VARIANT_LIGATURES_DISCRETIONARY,
+ SP_CSS_FONT_VARIANT_LIGATURES_NO_DISCRETIONARY,
+ SP_CSS_FONT_VARIANT_LIGATURES_HISTORICAL,
+ SP_CSS_FONT_VARIANT_LIGATURES_NO_HISTORICAL,
+ SP_CSS_FONT_VARIANT_LIGATURES_CONTEXTUAL,
+ SP_CSS_FONT_VARIANT_LIGATURES_NO_CONTEXTUAL
+};
+
+enum SPCSSFontVariantPosition {
+ SP_CSS_FONT_VARIANT_POSITION_NORMAL,
+ SP_CSS_FONT_VARIANT_POSITION_SUB,
+ SP_CSS_FONT_VARIANT_POSITION_SUPER
+};
+
+enum SPCSSFontVariantCaps {
+ SP_CSS_FONT_VARIANT_CAPS_NORMAL,
+ SP_CSS_FONT_VARIANT_CAPS_SMALL,
+ SP_CSS_FONT_VARIANT_CAPS_ALL_SMALL,
+ SP_CSS_FONT_VARIANT_CAPS_PETITE,
+ SP_CSS_FONT_VARIANT_CAPS_ALL_PETITE,
+ SP_CSS_FONT_VARIANT_CAPS_UNICASE,
+ SP_CSS_FONT_VARIANT_CAPS_TITLING,
+};
+
+enum SPCSSFontVariantNumeric {
+ SP_CSS_FONT_VARIANT_NUMERIC_NORMAL,
+ SP_CSS_FONT_VARIANT_NUMERIC_LINING_NUMS,
+ SP_CSS_FONT_VARIANT_NUMERIC_OLDSTYLE_NUMS,
+ SP_CSS_FONT_VARIANT_NUMERIC_PROPORTIONAL_NUMS,
+ SP_CSS_FONT_VARIANT_NUMERIC_TABULAR_NUMS,
+ SP_CSS_FONT_VARIANT_NUMERIC_DIAGONAL_FRACTIONS,
+ SP_CSS_FONT_VARIANT_NUMERIC_STACKED_FRACTIONS,
+ SP_CSS_FONT_VARIANT_NUMERIC_ORDINAL,
+ SP_CSS_FONT_VARIANT_NUMERIC_SLASHED_ZERO
+};
+
+enum SPCSSFontVariantAlternates {
+ SP_CSS_FONT_VARIANT_ALTERNATES_NORMAL,
+ SP_CSS_FONT_VARIANT_ALTERNATES_HISTORICAL_FORMS,
+ SP_CSS_FONT_VARIANT_ALTERNATES_STYLISTIC,
+ SP_CSS_FONT_VARIANT_ALTERNATES_STYLESET,
+ SP_CSS_FONT_VARIANT_ALTERNATES_CHARACTER_VARIANT,
+ SP_CSS_FONT_VARIANT_ALTERNATES_SWASH,
+ SP_CSS_FONT_VARIANT_ALTERNATES_ORNAMENTS,
+ SP_CSS_FONT_VARIANT_ALTERNATES_ANNOTATION
+};
+
+enum SPCSSFontVariantEastAsian {
+ SP_CSS_FONT_VARIANT_EAST_ASIAN_NORMAL,
+ SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS78,
+ SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS83,
+ SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS90,
+ SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS04,
+ SP_CSS_FONT_VARIANT_EAST_ASIAN_SIMPLIFIED,
+ SP_CSS_FONT_VARIANT_EAST_ASIAN_TRADITIONAL,
+ SP_CSS_FONT_VARIANT_EAST_ASIAN_FULL_WIDTH,
+ SP_CSS_FONT_VARIANT_EAST_ASIAN_PROPORTIONAL_WIDTH,
+ SP_CSS_FONT_VARIANT_EAST_ASIAN_RUBY
+};
+
enum SPCSSTextAlign {
SP_CSS_TEXT_ALIGN_START,
SP_CSS_TEXT_ALIGN_END,
@@ -309,6 +375,77 @@ static SPStyleEnum const enum_font_stretch[] = {
{NULL, -1}
};
+static SPStyleEnum const enum_font_variant_ligatures[] = {
+ {"normal", SP_CSS_FONT_VARIANT_LIGATURES_NORMAL},
+ {"none", SP_CSS_FONT_VARIANT_LIGATURES_NONE},
+ {"common-ligatures", SP_CSS_FONT_VARIANT_LIGATURES_COMMON},
+ {"no-common-ligatures", SP_CSS_FONT_VARIANT_LIGATURES_NO_COMMON},
+ {"discretionary-ligatures", SP_CSS_FONT_VARIANT_LIGATURES_DISCRETIONARY},
+ {"no-discretionary-ligatures", SP_CSS_FONT_VARIANT_LIGATURES_NO_DISCRETIONARY},
+ {"historical-ligatures", SP_CSS_FONT_VARIANT_LIGATURES_HISTORICAL},
+ {"nohistorical-ligatures", SP_CSS_FONT_VARIANT_LIGATURES_NO_HISTORICAL},
+ {"contextual", SP_CSS_FONT_VARIANT_LIGATURES_CONTEXTUAL},
+ {"no-contextual", SP_CSS_FONT_VARIANT_LIGATURES_NO_CONTEXTUAL},
+ {NULL, -1}
+};
+
+static SPStyleEnum const enum_font_variant_position[] = {
+ {"normal", SP_CSS_FONT_VARIANT_POSITION_NORMAL},
+ {"sub", SP_CSS_FONT_VARIANT_POSITION_SUB},
+ {"super", SP_CSS_FONT_VARIANT_POSITION_SUPER},
+ {NULL, -1}
+};
+
+static SPStyleEnum const enum_font_variant_caps[] = {
+ {"normal", SP_CSS_FONT_VARIANT_CAPS_NORMAL},
+ {"small-caps", SP_CSS_FONT_VARIANT_CAPS_SMALL},
+ {"all-small-caps", SP_CSS_FONT_VARIANT_CAPS_ALL_SMALL},
+ {"petite-caps", SP_CSS_FONT_VARIANT_CAPS_PETITE},
+ {"all_petite-caps", SP_CSS_FONT_VARIANT_CAPS_ALL_PETITE},
+ {"unicase", SP_CSS_FONT_VARIANT_CAPS_UNICASE},
+ {"titling", SP_CSS_FONT_VARIANT_CAPS_TITLING},
+ {NULL, -1}
+};
+
+static SPStyleEnum const enum_font_variant_numeric[] = {
+ {"normal", SP_CSS_FONT_VARIANT_NUMERIC_NORMAL},
+ {"lining-nums", SP_CSS_FONT_VARIANT_NUMERIC_LINING_NUMS},
+ {"oldstyle-nums", SP_CSS_FONT_VARIANT_NUMERIC_OLDSTYLE_NUMS},
+ {"proportional-nums", SP_CSS_FONT_VARIANT_NUMERIC_PROPORTIONAL_NUMS},
+ {"tabular-nums", SP_CSS_FONT_VARIANT_NUMERIC_TABULAR_NUMS},
+ {"diagonal-fractions", SP_CSS_FONT_VARIANT_NUMERIC_DIAGONAL_FRACTIONS},
+ {"stacked-fractions", SP_CSS_FONT_VARIANT_NUMERIC_STACKED_FRACTIONS},
+ {"ordinal", SP_CSS_FONT_VARIANT_NUMERIC_ORDINAL},
+ {"slashed-zero", SP_CSS_FONT_VARIANT_NUMERIC_SLASHED_ZERO},
+ {NULL, -1}
+};
+
+static SPStyleEnum const enum_font_variant_alternates[] = {
+ {"normal", SP_CSS_FONT_VARIANT_ALTERNATES_NORMAL},
+ {"historical-forms", SP_CSS_FONT_VARIANT_ALTERNATES_HISTORICAL_FORMS},
+ {"stylistic", SP_CSS_FONT_VARIANT_ALTERNATES_STYLISTIC},
+ {"styleset", SP_CSS_FONT_VARIANT_ALTERNATES_STYLESET},
+ {"character_variant", SP_CSS_FONT_VARIANT_ALTERNATES_CHARACTER_VARIANT},
+ {"swash", SP_CSS_FONT_VARIANT_ALTERNATES_SWASH},
+ {"ornaments", SP_CSS_FONT_VARIANT_ALTERNATES_ORNAMENTS},
+ {"annotation", SP_CSS_FONT_VARIANT_ALTERNATES_ANNOTATION},
+ {NULL, -1}
+};
+
+static SPStyleEnum const enum_font_variant_east_asian[] = {
+ {"normal", SP_CSS_FONT_VARIANT_EAST_ASIAN_NORMAL},
+ {"jis78", SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS78},
+ {"jis83", SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS83},
+ {"jis90", SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS90},
+ {"jis04", SP_CSS_FONT_VARIANT_EAST_ASIAN_JIS04},
+ {"simplified", SP_CSS_FONT_VARIANT_EAST_ASIAN_SIMPLIFIED},
+ {"traditional", SP_CSS_FONT_VARIANT_EAST_ASIAN_TRADITIONAL},
+ {"full-width", SP_CSS_FONT_VARIANT_EAST_ASIAN_FULL_WIDTH},
+ {"proportional-width", SP_CSS_FONT_VARIANT_EAST_ASIAN_PROPORTIONAL_WIDTH},
+ {"ruby", SP_CSS_FONT_VARIANT_EAST_ASIAN_RUBY},
+ {NULL, -1}
+};
+
static SPStyleEnum const enum_text_align[] = {
{"start", SP_CSS_TEXT_ALIGN_START},
{"end", SP_CSS_TEXT_ALIGN_END},
diff --git a/src/style.cpp b/src/style.cpp
index b65bff53f..49a13604b 100644
--- a/src/style.cpp
+++ b/src/style.cpp
@@ -14,7 +14,7 @@
* Copyright (C) 2001 Ximian, Inc.
* Copyright (C) 2005 Monash University
* Copyright (C) 2012 Kris De Gussem
- * Copyright (C) 2014 Tavmjong Bah
+ * Copyright (C) 2014-2015 Tavmjong Bah
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -118,6 +118,15 @@ SPStyle::SPStyle(SPDocument *document_in, SPObject *object_in) :
font(), // SPIFont
font_specification( "-inkscape-font-specification" ), // SPIString
+ // Font variants
+ font_variant_ligatures( "font-variant-ligatures", enum_font_variant_ligatures, SP_CSS_FONT_VARIANT_LIGATURES_NORMAL ),
+ font_variant_position( "font-variant-position", enum_font_variant_position, SP_CSS_FONT_VARIANT_POSITION_NORMAL ),
+ font_variant_caps( "font-variant-caps", enum_font_variant_caps, SP_CSS_FONT_VARIANT_CAPS_NORMAL ),
+ font_variant_numeric( "font-variant-numeric", enum_font_variant_numeric, SP_CSS_FONT_VARIANT_NUMERIC_NORMAL ),
+ font_variant_alternates("font-variant-alternates", enum_font_variant_alternates, SP_CSS_FONT_VARIANT_ALTERNATES_NORMAL ),
+ font_variant_east_asian("font-variant-east_asian", enum_font_variant_east_asian, SP_CSS_FONT_VARIANT_EAST_ASIAN_NORMAL ),
+ font_feature_settings( "font-feature-settings", "normal" ),
+
// Text related properties
text_indent( "text-indent", 0.0 ), // SPILength
text_align( "text-align", enum_text_align, SP_CSS_TEXT_ALIGN_START ),
@@ -288,6 +297,15 @@ SPStyle::SPStyle(SPDocument *document_in, SPObject *object_in) :
_properties.push_back( &font );
_properties.push_back( &font_specification );
+ // Font variants
+ _properties.push_back( &font_variant_ligatures );
+ _properties.push_back( &font_variant_position );
+ _properties.push_back( &font_variant_caps );
+ _properties.push_back( &font_variant_numeric );
+ _properties.push_back( &font_variant_alternates );
+ _properties.push_back( &font_variant_east_asian );
+ _properties.push_back( &font_feature_settings );
+
_properties.push_back( &text_indent );
_properties.push_back( &text_align );
@@ -374,6 +392,14 @@ SPStyle::SPStyle(SPDocument *document_in, SPObject *object_in) :
// _propmap.insert( std::make_pair( font.name, reinterpret_cast<SPIBasePtr>(&SPStyle::font ) ) );
// _propmap.insert( std::make_pair( font_specification.name, reinterpret_cast<SPIBasePtr>(&SPStyle::font_specification ) ) );
+ // font_variant_ligatures );
+ // font_variant_position );
+ // font_variant_caps );
+ // font_variant_numeric );
+ // font_variant_alternates );
+ // font_variant_east_asian );
+ // font_feature_settings );
+
// _propmap.insert( std::make_pair( text_indent.name, reinterpret_cast<SPIBasePtr>(&SPStyle::text_indent ) ) );
// _propmap.insert( std::make_pair( text_align.name, reinterpret_cast<SPIBasePtr>(&SPStyle::text_align ) ) );
@@ -573,7 +599,15 @@ SPStyle::read( SPObject *object, Inkscape::XML::Node *repr ) {
/* 3 Presentation attributes */
// std::cout << " MERGING PRESENTATION ATTRIBUTES" << std::endl;
for(std::vector<SPIBase*>::size_type i = 0; i != _properties.size(); ++i) {
- _properties[i]->readAttribute( repr );
+
+ // Shorthands are not allowed as presentation properites. Note: text-decoration and
+ // font-variant are converted to shorthands in CSS 3 but can still be read as a
+ // non-shorthand for compatability with older renders, so they should not be in this list.
+ // We could add a flag to SPIBase to avoid string comparison.
+ if( _properties[i]->name.compare( "font" ) != 0 &&
+ _properties[i]->name.compare( "marker" ) != 0 ) {
+ _properties[i]->readAttribute( repr );
+ }
}
// for(SPPropMap::iterator i = _propmap.begin(); i != _propmap.end(); ++i ) {
// (this->*(i->second)).readAttribute( repr );
@@ -686,6 +720,29 @@ SPStyle::readIfUnset( gint id, gchar const *val ) {
font.readIfUnset( val );
break;
+ /* Font Variants CSS 3 */
+ case SP_PROP_FONT_VARIANT_LIGATURES:
+ font_variant_ligatures.readIfUnset( val );
+ break;
+ case SP_PROP_FONT_VARIANT_POSITION:
+ font_variant_position.readIfUnset( val );
+ break;
+ case SP_PROP_FONT_VARIANT_CAPS:
+ font_variant_caps.readIfUnset( val );
+ break;
+ case SP_PROP_FONT_VARIANT_NUMERIC:
+ font_variant_numeric.readIfUnset( val );
+ break;
+ case SP_PROP_FONT_VARIANT_ALTERNATES:
+ font_variant_alternates.readIfUnset( val );
+ break;
+ case SP_PROP_FONT_VARIANT_EAST_ASIAN:
+ font_variant_east_asian.readIfUnset( val );
+ break;
+ case SP_PROP_FONT_FEATURE_SETTINGS:
+ font_feature_settings.readIfUnset( val );
+ break;
+
/* Text */
case SP_PROP_TEXT_INDENT:
text_indent.readIfUnset( val );
@@ -1169,10 +1226,12 @@ void
sp_style_filter_ref_changed(SPObject *old_ref, SPObject *ref, SPStyle *style)
{
if (old_ref) {
+ (dynamic_cast<SPFilter *>( old_ref ))->_refcount--;
style->filter_modified_connection.disconnect();
}
if ( SP_IS_FILTER(ref))
{
+ (dynamic_cast<SPFilter *>( ref ))->_refcount++;
style->filter_modified_connection =
ref->connectModified(sigc::bind(sigc::ptr_fun(&sp_style_filter_ref_modified), style));
}
diff --git a/src/style.h b/src/style.h
index ab34476b3..2618662f5 100644
--- a/src/style.h
+++ b/src/style.h
@@ -94,7 +94,7 @@ public:
/** Font style */
SPIEnum font_style;
- /** Which substyle of the font */
+ /** Which substyle of the font (CSS 2. CSS 3 redefines as shorthand) */
SPIEnum font_variant;
/** Weight of the font */
SPIEnum font_weight;
@@ -111,6 +111,22 @@ public:
/** Full font name, as font_factory::ConstructFontSpecification would give, for internal use. */
SPIString font_specification;
+ /* Font variants -------------------- */
+ /** Font variant ligatures */
+ SPIEnum font_variant_ligatures;
+ /** Font variant position (subscript/superscript) */
+ SPIEnum font_variant_position;
+ /** Font variant caps (small caps) */
+ SPIEnum font_variant_caps;
+ /** Font variant numeric (numerical formatting) */
+ SPIEnum font_variant_numeric;
+ /** Font variant alternates (alternates/swatches) */
+ SPIEnum font_variant_alternates;
+ /** Font variant East Asian */
+ SPIEnum font_variant_east_asian;
+ /** Font feature settings (Low level access to TrueType tables) */
+ SPIString font_feature_settings;
+
/* Text ----------------------------- */
/** First line indent of paragraphs (css2 16.1) */
diff --git a/src/text-chemistry.cpp b/src/text-chemistry.cpp
index 65b59f2ad..9fc862ad2 100644
--- a/src/text-chemistry.cpp
+++ b/src/text-chemistry.cpp
@@ -43,11 +43,10 @@ using Inkscape::DocumentUndo;
static SPItem *
flowtext_in_selection(Inkscape::Selection *selection)
{
- for (GSList *items = (GSList *) selection->itemList();
- items != NULL;
- items = items->next) {
- if (SP_IS_FLOWTEXT(items->data))
- return ((SPItem *) items->data);
+ std::vector<SPItem*> items = selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ if (SP_IS_FLOWTEXT(*i))
+ return *i;
}
return NULL;
}
@@ -55,11 +54,10 @@ flowtext_in_selection(Inkscape::Selection *selection)
static SPItem *
text_or_flowtext_in_selection(Inkscape::Selection *selection)
{
- for (GSList *items = (GSList *) selection->itemList();
- items != NULL;
- items = items->next) {
- if (SP_IS_TEXT(items->data) || SP_IS_FLOWTEXT(items->data))
- return ((SPItem *) items->data);
+ std::vector<SPItem*> items = selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ if (SP_IS_TEXT(*i) || SP_IS_FLOWTEXT(*i))
+ return *i;
}
return NULL;
}
@@ -67,11 +65,10 @@ text_or_flowtext_in_selection(Inkscape::Selection *selection)
static SPItem *
shape_in_selection(Inkscape::Selection *selection)
{
- for (GSList *items = (GSList *) selection->itemList();
- items != NULL;
- items = items->next) {
- if (SP_IS_SHAPE(items->data))
- return ((SPItem *) items->data);
+ std::vector<SPItem*> items = selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ if (SP_IS_SHAPE(*i))
+ return *i;
}
return NULL;
}
@@ -90,7 +87,7 @@ text_put_on_path()
Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc();
- if (!text || !shape || g_slist_length((GSList *) selection->itemList()) != 2) {
+ if (!text || !shape || selection->itemList().size() != 2) {
desktop->getMessageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>a text and a path</b> to put text on path."));
return;
}
@@ -199,11 +196,9 @@ text_remove_from_path()
}
bool did = false;
-
- for (GSList *items = g_slist_copy((GSList *) selection->itemList());
- items != NULL;
- items = items->next) {
- SPObject *obj = SP_OBJECT(items->data);
+ std::vector<SPItem*> items(selection->itemList());
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ SPObject *obj = *i;
if (SP_IS_TEXT_TEXTPATH(obj)) {
SPObject *tp = obj->firstChild();
@@ -219,7 +214,7 @@ text_remove_from_path()
} else {
DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_TEXT,
_("Remove text from path"));
- selection->setList(g_slist_copy((GSList *) selection->itemList())); // reselect to update statusbar description
+ selection->setList(selection->itemList()); // reselect to update statusbar description
}
}
@@ -265,10 +260,9 @@ text_remove_all_kerns()
bool did = false;
- for (GSList *items = g_slist_copy((GSList *) selection->itemList());
- items != NULL;
- items = items->next) {
- SPObject *obj = SP_OBJECT(items->data);
+ std::vector<SPItem*> items = selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ SPObject *obj = *i;
if (!SP_IS_TEXT(obj) && !SP_IS_TSPAN(obj) && !SP_IS_FLOWTEXT(obj)) {
continue;
@@ -302,7 +296,7 @@ text_flow_into_shape()
SPItem *text = text_or_flowtext_in_selection(selection);
SPItem *shape = shape_in_selection(selection);
- if (!text || !shape || g_slist_length((GSList *) selection->itemList()) < 2) {
+ if (!text || !shape || selection->itemList().size() < 2) {
desktop->getMessageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>a text</b> and one or more <b>paths or shapes</b> to flow text into frame."));
return;
}
@@ -326,10 +320,9 @@ text_flow_into_shape()
g_return_if_fail(SP_IS_FLOWREGION(object));
/* Add clones */
- for (GSList *items = (GSList *) selection->itemList();
- items != NULL;
- items = items->next) {
- SPItem *item = SP_ITEM(items->data);
+ std::vector<SPItem*> items = selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ SPItem *item = *i;
if (SP_IS_SHAPE(item)){
Inkscape::XML::Node *clone = xml_doc->createElement("svg:use");
clone->setAttribute("x", "0");
@@ -394,23 +387,22 @@ text_unflow ()
Inkscape::Selection *selection = desktop->getSelection();
- if (!flowtext_in_selection(selection) || g_slist_length((GSList *) selection->itemList()) < 1) {
+ if (!flowtext_in_selection(selection) || selection->itemList().size() < 1) {
desktop->getMessageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>a flowed text</b> to unflow it."));
return;
}
- GSList *new_objs = NULL;
+ std::vector<SPItem*> new_objs;
GSList *old_objs = NULL;
- for (GSList *items = g_slist_copy((GSList *) selection->itemList());
- items != NULL;
- items = items->next) {
+ std::vector<SPItem*> items = selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
- if (!SP_IS_FLOWTEXT(SP_OBJECT(items->data))) {
+ if (!SP_IS_FLOWTEXT(*i)) {
continue;
}
- SPItem *flowtext = SP_ITEM(items->data);
+ SPItem *flowtext = *i;
// we discard transform when unflowing, but we must preserve expansion which is visible as
// font size multiplier
@@ -451,7 +443,7 @@ text_unflow ()
SPText *text = SP_TEXT(text_object);
text->_adjustFontsizeRecursive(text, ex);
- new_objs = g_slist_prepend (new_objs, text_object);
+ new_objs.push_back((SPItem*)text_object);
old_objs = g_slist_prepend (old_objs, flowtext);
Inkscape::GC::release(rtext);
@@ -460,13 +452,13 @@ text_unflow ()
}
selection->clear();
+ reverse(new_objs.begin(),new_objs.end());
selection->setList(new_objs);
for (GSList *i = old_objs; i; i = i->next) {
SP_OBJECT(i->data)->deleteObject (true);
}
g_slist_free (old_objs);
- g_slist_free (new_objs);
DocumentUndo::done(doc, SP_VERB_CONTEXT_TEXT,
_("Unflow flowed text"));
@@ -487,11 +479,11 @@ flowtext_to_text()
bool did = false;
- GSList *reprs = NULL;
- GSList *items = g_slist_copy((GSList *) selection->itemList());
- for (; items != NULL; items = items->next) {
+ std::vector<Inkscape::XML::Node*> reprs;
+ std::vector<SPItem*> items(selection->itemList());
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
- SPItem *item = (SPItem *) items->data;
+ SPItem *item = *i;
if (!SP_IS_FLOWTEXT(item))
continue;
@@ -519,10 +511,9 @@ flowtext_to_text()
Inkscape::GC::release(repr);
item->deleteObject();
- reprs = g_slist_prepend(reprs, repr);
+ reprs.push_back(repr);
}
- g_slist_free(items);
if (did) {
DocumentUndo::done(desktop->getDocument(),
@@ -535,7 +526,6 @@ flowtext_to_text()
_("<b>No flowed text(s)</b> to convert in the selection."));
}
- g_slist_free(reprs);
}
diff --git a/src/text-editing.cpp b/src/text-editing.cpp
index 4a962ab4c..050e223eb 100644
--- a/src/text-editing.cpp
+++ b/src/text-editing.cpp
@@ -67,12 +67,11 @@ static void te_update_layout_now (SPItem *item)
void te_update_layout_now_recursive(SPItem *item)
{
if (SP_IS_GROUP(item)) {
- GSList *item_list = sp_item_group_item_list(SP_GROUP(item));
- for(GSList* elem = item_list; elem; elem = elem->next) {
- SPItem* list_item = static_cast<SPItem*>(elem->data);
+ std::vector<SPItem*> item_list = sp_item_group_item_list(SP_GROUP(item));
+ for(std::vector<SPItem*>::const_iterator i=item_list.begin();i!=item_list.end();i++){
+ SPItem* list_item = *i;
te_update_layout_now_recursive(list_item);
}
- g_slist_free(item_list);
} else if (SP_IS_TEXT(item))
SP_TEXT(item)->rebuildLayout();
else if (SP_IS_FLOWTEXT (item))
diff --git a/src/trace/siox.cpp b/src/trace/siox.cpp
index 065e891ed..9df4e561c 100644
--- a/src/trace/siox.cpp
+++ b/src/trace/siox.cpp
@@ -682,7 +682,7 @@ GdkPixbuf *SioxImage::getGdkPixbuf()
}
row += rowstride;
}
-
+ free(pixdata);
return buf;
}
diff --git a/src/trace/trace.cpp b/src/trace/trace.cpp
index cc3d000a3..91c230920 100644
--- a/src/trace/trace.cpp
+++ b/src/trace/trace.cpp
@@ -65,7 +65,7 @@ SPImage *Tracer::getSelectedSPImage()
if (sioxEnabled)
{
SPImage *img = NULL;
- GSList const *list = sel->itemList();
+ std::vector<SPItem*> const list = sel->itemList();
std::vector<SPItem *> items;
sioxShapes.clear();
@@ -74,13 +74,13 @@ SPImage *Tracer::getSelectedSPImage()
them as bottom-to-top so that we can discover the image and any
SPItems above it
*/
- for ( ; list ; list=list->next)
+ for (std::vector<SPItem*>::const_iterator i=list.begin() ; list.end()!=i ; i++)
{
- if (!SP_IS_ITEM(list->data))
+ if (!SP_IS_ITEM(*i))
{
continue;
}
- SPItem *item = SP_ITEM(list->data);
+ SPItem *item = *i;
items.insert(items.begin(), item);
}
std::vector<SPItem *>::iterator iter;
diff --git a/src/ui/clipboard.cpp b/src/ui/clipboard.cpp
index f1d0ff576..d6cf1f980 100644
--- a/src/ui/clipboard.cpp
+++ b/src/ui/clipboard.cpp
@@ -523,8 +523,9 @@ bool ClipboardManagerImpl::pasteSize(SPDesktop *desktop, bool separately, bool a
// resize each object in the selection
if (separately) {
- for (GSList *i = const_cast<GSList*>(selection->itemList()) ; i ; i = i->next) {
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(i->data));
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (item) {
Geom::OptRect obj_size = item->desktopVisualBounds();
if ( obj_size ) {
@@ -578,8 +579,9 @@ bool ClipboardManagerImpl::pastePathEffect(SPDesktop *desktop)
desktop->doc()->importDefs(tempdoc);
// make sure all selected items are converted to paths first (i.e. rectangles)
sp_selected_to_lpeitems(desktop);
- for (GSList *itemptr = const_cast<GSList *>(selection->itemList()) ; itemptr ; itemptr = itemptr->next) {
- SPItem *item = reinterpret_cast<SPItem*>(itemptr->data);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
_applyPathEffect(item, effectstack);
}
@@ -659,10 +661,10 @@ Glib::ustring ClipboardManagerImpl::getShapeOrTextObjectId(SPDesktop *desktop)
*/
void ClipboardManagerImpl::_copySelection(Inkscape::Selection *selection)
{
- GSList const *items = selection->itemList();
// copy the defs used by all items
- for (GSList *i = const_cast<GSList *>(items) ; i != NULL ; i = i->next) {
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(i->data));
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (item) {
_copyUsedDefs(item);
} else {
@@ -671,11 +673,11 @@ void ClipboardManagerImpl::_copySelection(Inkscape::Selection *selection)
}
// copy the representation of the items
- GSList *sorted_items = g_slist_copy(const_cast<GSList *>(items));
- sorted_items = g_slist_sort(sorted_items, (GCompareFunc) sp_object_compare_position);
+ std::vector<SPItem*> sorted_items(itemlist);
+ sort(sorted_items.begin(),sorted_items.end(),sp_object_compare_position_bool);
- for (GSList *i = sorted_items ; i ; i = i->next) {
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(i->data));
+ for(std::vector<SPItem*>::const_iterator i=sorted_items.begin();i!=sorted_items.end();i++){
+ SPItem *item = *i;
if (item) {
Inkscape::XML::Node *obj = item->getRepr();
Inkscape::XML::Node *obj_copy = _copyNode(obj, _doc, _root);
@@ -703,8 +705,8 @@ void ClipboardManagerImpl::_copySelection(Inkscape::Selection *selection)
}
// copy style for Paste Style action
- if (sorted_items) {
- SPObject *object = static_cast<SPObject *>(sorted_items->data);
+ if (!sorted_items.empty()) {
+ SPObject *object = sorted_items[0];
SPItem *item = dynamic_cast<SPItem *>(object);
if (item) {
SPCSSAttr *style = take_style_from_item(item);
@@ -727,7 +729,6 @@ void ClipboardManagerImpl::_copySelection(Inkscape::Selection *selection)
sp_repr_set_point(_clipnode, "max", size->max());
}
- g_slist_free(sorted_items);
}
@@ -1164,8 +1165,8 @@ void ClipboardManagerImpl::_onGet(Gtk::SelectionData &sel, guint /*info*/)
sp_repr_get_double(nv, "inkscape:pageopacity", &opacity);
bgcolor |= SP_COLOR_F_TO_U(opacity);
}
-
- sp_export_png_file(_clipboardSPDoc, filename, area, width, height, dpi, dpi, bgcolor, NULL, NULL, true, NULL);
+ std::vector<SPItem*> x;
+ sp_export_png_file(_clipboardSPDoc, filename, area, width, height, dpi, dpi, bgcolor, NULL, NULL, true, x);
}
else
{
diff --git a/src/ui/dialog-events.cpp b/src/ui/dialog-events.cpp
index 5bc8088a1..8856631c0 100644
--- a/src/ui/dialog-events.cpp
+++ b/src/ui/dialog-events.cpp
@@ -15,10 +15,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/entry.h>
#include <gtkmm/window.h>
#include <gdk/gdkkeysyms.h>
diff --git a/src/ui/dialog/aboutbox.h b/src/ui/dialog/aboutbox.h
index 015e344a1..f3234b88d 100644
--- a/src/ui/dialog/aboutbox.h
+++ b/src/ui/dialog/aboutbox.h
@@ -15,14 +15,6 @@
#ifndef INKSCAPE_UI_DIALOG_ABOUTBOX_H
#define INKSCAPE_UI_DIALOG_ABOUTBOX_H
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/dialog.h>
namespace Inkscape {
diff --git a/src/ui/dialog/align-and-distribute.cpp b/src/ui/dialog/align-and-distribute.cpp
index 65bc94011..882427912 100644
--- a/src/ui/dialog/align-and-distribute.cpp
+++ b/src/ui/dialog/align-and-distribute.cpp
@@ -97,9 +97,7 @@ void ActionAlign::do_action(SPDesktop *desktop, int index)
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
bool sel_as_group = prefs->getBool("/dialogs/align/sel-as-groups");
- using Inkscape::Util::GSListConstIterator;
- std::list<SPItem *> selected;
- selected.insert<GSListConstIterator<SPItem *> >(selected.end(), selection->itemList(), NULL);
+ std::vector<SPItem*> selected(selection->itemList());
if (selected.empty()) return;
const Coeffs &a = _allCoeffs[index];
@@ -149,18 +147,19 @@ void ActionAlign::do_action(SPDesktop *desktop, int index)
b = selection->preferredBounds();
//Move each item in the selected list separately
- for (std::list<SPItem *>::iterator it(selected.begin());
+ for (std::vector<SPItem*>::iterator it(selected.begin());
it != selected.end(); ++it)
{
+ SPItem* item= *it;
desktop->getDocument()->ensureUpToDate();
if (!sel_as_group)
- b = (*it)->desktopPreferredBounds();
- if (b && (!focus || (*it) != focus)) {
+ b = (item)->desktopPreferredBounds();
+ if (b && (!focus || (item) != focus)) {
Geom::Point const sp(a.sx0 * b->min()[Geom::X] + a.sx1 * b->max()[Geom::X],
a.sy0 * b->min()[Geom::Y] + a.sy1 * b->max()[Geom::Y]);
Geom::Point const mp_rel( mp - sp );
if (LInfty(mp_rel) > 1e-9) {
- sp_item_move_rel(*it, Geom::Translate(mp_rel));
+ sp_item_move_rel(item, Geom::Translate(mp_rel));
changed = true;
}
}
@@ -250,26 +249,24 @@ private :
Inkscape::Selection *selection = desktop->getSelection();
if (!selection) return;
- using Inkscape::Util::GSListConstIterator;
- std::list<SPItem *> selected;
- selected.insert<GSListConstIterator<SPItem *> >(selected.end(), selection->itemList(), NULL);
+ std::vector<SPItem*> selected(selection->itemList());
if (selected.empty()) return;
//Check 2 or more selected objects
- std::list<SPItem *>::iterator second(selected.begin());
+ std::vector<SPItem*>::iterator second(selected.begin());
++second;
if (second == selected.end()) return;
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
int prefs_bbox = prefs->getBool("/tools/bounding_box");
std::vector< BBoxSort > sorted;
- for (std::list<SPItem *>::iterator it(selected.begin());
+ for (std::vector<SPItem*>::iterator it(selected.begin());
it != selected.end();
- ++it)
- {
- Geom::OptRect bbox = !prefs_bbox ? (*it)->desktopVisualBounds() : (*it)->desktopGeometricBounds();
+ ++it){
+ SPItem *item = *it;
+ Geom::OptRect bbox = !prefs_bbox ? (item)->desktopVisualBounds() : (item)->desktopGeometricBounds();
if (bbox) {
- sorted.push_back(BBoxSort(*it, *bbox, _orientation, _kBegin, _kEnd));
+ sorted.push_back(BBoxSort(item, *bbox, _orientation, _kBegin, _kEnd));
}
}
//sort bbox by anchors
@@ -549,9 +546,7 @@ private :
Inkscape::Selection *selection = desktop->getSelection();
if (!selection) return;
- using Inkscape::Util::GSListConstIterator;
- std::list<SPItem *> selected;
- selected.insert<GSListConstIterator<SPItem *> >(selected.end(), selection->itemList(), NULL);
+ std::vector<SPItem*> selected(selection->itemList());
if (selected.empty()) return;
//Check 2 or more selected objects
@@ -569,15 +564,17 @@ private :
} else { // sorting by ZOrder is outomatically done by not setting the center
center.reset();
}
- selected.sort(ActionExchangePositions::sort_compare);
+ sort(selected.begin(),selected.end(),sort_compare);
}
- std::list<SPItem *>::iterator it(selected.begin());
- Geom::Point p1 = (*it)->getCenter();
+ std::vector<SPItem*>::iterator it(selected.begin());
+ SPItem* item = *it;
+ Geom::Point p1 = item->getCenter();
for (++it ;it != selected.end(); ++it)
{
- Geom::Point p2 = (*it)->getCenter();
+ item = *it;
+ Geom::Point p2 = item->getCenter();
Geom::Point delta = p1 - p2;
- sp_item_move_rel((*it),Geom::Translate(delta[Geom::X],delta[Geom::Y] ));
+ sp_item_move_rel(item,Geom::Translate(delta[Geom::X],delta[Geom::Y] ));
p1 = p2;
}
Geom::Point p2 = selected.front()->getCenter();
@@ -615,8 +612,8 @@ private :
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
int saved_compensation = prefs->getInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED);
prefs->setInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED);
-
- unclump ((GSList *) _dialog.getDesktop()->getSelection()->itemList());
+ std::vector<SPItem*> x(_dialog.getDesktop()->getSelection()->itemList());
+ unclump (x);
// restore compensation setting
prefs->setInt("/options/clonecompensation/value", saved_compensation);
@@ -646,9 +643,7 @@ private :
Inkscape::Selection *selection = desktop->getSelection();
if (!selection) return;
- using Inkscape::Util::GSListConstIterator;
- std::list<SPItem *> selected;
- selected.insert<GSListConstIterator<SPItem *> >(selected.end(), selection->itemList(), NULL);
+ std::vector<SPItem*> selected(selection->itemList());
if (selected.empty()) return;
//Check 2 or more selected objects
@@ -672,12 +667,13 @@ private :
int saved_compensation = prefs->getInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED);
prefs->setInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED);
- for (std::list<SPItem *>::iterator it(selected.begin());
+ for (std::vector<SPItem*>::iterator it(selected.begin());
it != selected.end();
++it)
{
+ SPItem* item = *it;
desktop->getDocument()->ensureUpToDate();
- Geom::OptRect item_box = !prefs_bbox ? (*it)->desktopVisualBounds() : (*it)->desktopGeometricBounds();
+ Geom::OptRect item_box = !prefs_bbox ? (item)->desktopVisualBounds() : (item)->desktopGeometricBounds();
if (item_box) {
// find new center, staying within bbox
double x = _dialog.randomize_bbox->min()[Geom::X] + (*item_box)[Geom::X].extent() /2 +
@@ -686,7 +682,7 @@ private :
g_random_double_range (0, (*_dialog.randomize_bbox)[Geom::Y].extent() - (*item_box)[Geom::Y].extent());
// displacement is the new center minus old:
Geom::Point t = Geom::Point (x, y) - 0.5*(item_box->max() + item_box->min());
- sp_item_move_rel(*it, Geom::Translate(t));
+ sp_item_move_rel(item, Geom::Translate(t));
}
}
@@ -745,9 +741,7 @@ private :
Inkscape::Selection *selection = desktop->getSelection();
if (!selection) return;
- using Inkscape::Util::GSListConstIterator;
- std::list<SPItem *> selected;
- selected.insert<GSListConstIterator<SPItem *> >(selected.end(), selection->itemList(), NULL);
+ std::vector<SPItem*> selected(selection->itemList());
if (selected.empty()) return;
//Check 2 or more selected objects
@@ -758,20 +752,21 @@ private :
std::vector<Baselines> sorted;
- for (std::list<SPItem *>::iterator it(selected.begin());
+ for (std::vector<SPItem*>::iterator it(selected.begin());
it != selected.end();
++it)
{
- if (SP_IS_TEXT (*it) || SP_IS_FLOWTEXT (*it)) {
- Inkscape::Text::Layout const *layout = te_get_layout(*it);
+ SPItem* item = *it;
+ if (SP_IS_TEXT (item) || SP_IS_FLOWTEXT (item)) {
+ Inkscape::Text::Layout const *layout = te_get_layout(item);
boost::optional<Geom::Point> pt = layout->baselineAnchorPoint();
if (pt) {
- Geom::Point base = *pt * (*it)->i2dt_affine();
+ Geom::Point base = *pt * (item)->i2dt_affine();
if (base[Geom::X] < b_min[Geom::X]) b_min[Geom::X] = base[Geom::X];
if (base[Geom::Y] < b_min[Geom::Y]) b_min[Geom::Y] = base[Geom::Y];
if (base[Geom::X] > b_max[Geom::X]) b_max[Geom::X] = base[Geom::X];
if (base[Geom::Y] > b_max[Geom::Y]) b_max[Geom::Y] = base[Geom::Y];
- Baselines b (*it, base, _orientation);
+ Baselines b (item, base, _orientation);
sorted.push_back(b);
}
}
@@ -801,18 +796,19 @@ private :
}
} else {
- for (std::list<SPItem *>::iterator it(selected.begin());
+ for (std::vector<SPItem*>::iterator it(selected.begin());
it != selected.end();
++it)
{
- if (SP_IS_TEXT (*it) || SP_IS_FLOWTEXT (*it)) {
- Inkscape::Text::Layout const *layout = te_get_layout(*it);
+ SPItem* item = *it;
+ if (SP_IS_TEXT (item) || SP_IS_FLOWTEXT (item)) {
+ Inkscape::Text::Layout const *layout = te_get_layout(item);
boost::optional<Geom::Point> pt = layout->baselineAnchorPoint();
if (pt) {
- Geom::Point base = *pt * (*it)->i2dt_affine();
+ Geom::Point base = *pt * (item)->i2dt_affine();
Geom::Point t(0.0, 0.0);
t[_orientation] = b_min[_orientation] - base[_orientation];
- sp_item_move_rel(*it, Geom::Translate(t));
+ sp_item_move_rel(item, Geom::Translate(t));
changed = true;
}
}
diff --git a/src/ui/dialog/calligraphic-profile-rename.h b/src/ui/dialog/calligraphic-profile-rename.h
index fa13db196..4ef71900b 100644
--- a/src/ui/dialog/calligraphic-profile-rename.h
+++ b/src/ui/dialog/calligraphic-profile-rename.h
@@ -15,10 +15,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-# include <glibmm/threads.h>
-#endif
-
#include <gtkmm/dialog.h>
#include <gtkmm/entry.h>
#include <gtkmm/label.h>
diff --git a/src/ui/dialog/clonetiler.cpp b/src/ui/dialog/clonetiler.cpp
index bd3ad0254..f84a2ffd6 100644
--- a/src/ui/dialog/clonetiler.cpp
+++ b/src/ui/dialog/clonetiler.cpp
@@ -1359,7 +1359,7 @@ void CloneTiler::clonetiler_change_selection(Inkscape::Selection *selection, Gtk
return;
}
- if (g_slist_length ((GSList *) selection->itemList()) > 1) {
+ if (selection->itemList().size() > 1) {
gtk_widget_set_sensitive (buttons, FALSE);
gtk_label_set_markup (GTK_LABEL(status), _("<small>More than one object selected.</small>"));
return;
@@ -2096,7 +2096,7 @@ void CloneTiler::clonetiler_unclump(GtkWidget */*widget*/, void *)
Inkscape::Selection *selection = desktop->getSelection();
// check if something is selected
- if (selection->isEmpty() || g_slist_length((GSList *) selection->itemList()) > 1) {
+ if (selection->isEmpty() || selection->itemList().size() > 1) {
desktop->getMessageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>one object</b> whose tiled clones to unclump."));
return;
}
@@ -2104,20 +2104,18 @@ void CloneTiler::clonetiler_unclump(GtkWidget */*widget*/, void *)
SPObject *obj = selection->singleItem();
SPObject *parent = obj->parent;
- GSList *to_unclump = NULL; // not including the original
+ std::vector<SPItem*> to_unclump; // not including the original
for (SPObject *child = parent->firstChild(); child != NULL; child = child->next) {
if (clonetiler_is_a_clone_of (child, obj)) {
- to_unclump = g_slist_prepend (to_unclump, child);
+ to_unclump.push_back((SPItem*)child);
}
}
desktop->getDocument()->ensureUpToDate();
-
+ reverse(to_unclump.begin(),to_unclump.end());
unclump (to_unclump);
- g_slist_free (to_unclump);
-
DocumentUndo::done(desktop->getDocument(), SP_VERB_DIALOG_CLONETILER,
_("Unclump tiled clones"));
}
@@ -2147,7 +2145,7 @@ void CloneTiler::clonetiler_remove(GtkWidget */*widget*/, GtkWidget *dlg, bool d
Inkscape::Selection *selection = desktop->getSelection();
// check if something is selected
- if (selection->isEmpty() || g_slist_length((GSList *) selection->itemList()) > 1) {
+ if (selection->isEmpty() || selection->itemList().size() > 1) {
desktop->getMessageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>one object</b> whose tiled clones to remove."));
return;
}
@@ -2225,7 +2223,7 @@ void CloneTiler::clonetiler_apply(GtkWidget */*widget*/, GtkWidget *dlg)
}
// Check if more than one object is selected.
- if (g_slist_length((GSList *) selection->itemList()) > 1) {
+ if (selection->itemList().size() > 1) {
desktop->getMessageStack()->flash(Inkscape::ERROR_MESSAGE, _("If you want to clone several objects, <b>group</b> them and <b>clone the group</b>."));
return;
}
diff --git a/src/ui/dialog/color-item.cpp b/src/ui/dialog/color-item.cpp
index a49a47d5c..6603d5c69 100644
--- a/src/ui/dialog/color-item.cpp
+++ b/src/ui/dialog/color-item.cpp
@@ -17,10 +17,6 @@
#include <errno.h>
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/label.h>
#include <glibmm/i18n.h>
#include <cairo.h>
diff --git a/src/ui/dialog/debug.cpp b/src/ui/dialog/debug.cpp
index 9e2287f80..d127261c0 100644
--- a/src/ui/dialog/debug.cpp
+++ b/src/ui/dialog/debug.cpp
@@ -13,10 +13,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/dialog.h>
#include <gtkmm/textview.h>
diff --git a/src/ui/dialog/document-properties.cpp b/src/ui/dialog/document-properties.cpp
index c381ed755..b04e8ecc1 100644
--- a/src/ui/dialog/document-properties.cpp
+++ b/src/ui/dialog/document-properties.cpp
@@ -1672,10 +1672,10 @@ void DocumentProperties::onDocUnitChange()
Inkscape::XML::Node *repr = getDesktop()->getNamedView()->getRepr();
- Inkscape::Util::Unit const *old_doc_unit = unit_table.getUnit("px");
+ /*Inkscape::Util::Unit const *old_doc_unit = unit_table.getUnit("px");
if(repr->attribute("inkscape:document-units")) {
old_doc_unit = unit_table.getUnit(repr->attribute("inkscape:document-units"));
- }
+ }*/
Inkscape::Util::Unit const *doc_unit = _rum_deflt.getUnit();
// Set document unit
diff --git a/src/ui/dialog/export.cpp b/src/ui/dialog/export.cpp
index 6d90c792e..384aec415 100644
--- a/src/ui/dialog/export.cpp
+++ b/src/ui/dialog/export.cpp
@@ -20,10 +20,6 @@
// This has to be included prior to anything that includes setjmp.h, it croaks otherwise
#include <png.h>
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/buttonbox.h>
#include <gtkmm/dialog.h>
@@ -605,7 +601,7 @@ void Export::onBatchClicked ()
void Export::updateCheckbuttons ()
{
- gint num = g_slist_length((GSList *) SP_ACTIVE_DESKTOP->getSelection()->itemList());
+ gint num = SP_ACTIVE_DESKTOP->getSelection()->itemList().size();
if (num >= 2) {
batch_export.set_sensitive(true);
batch_export.set_label(g_strdup_printf (ngettext("B_atch export %d selected object","B_atch export %d selected objects",num), num));
@@ -817,9 +813,9 @@ void Export::onAreaToggled ()
one that's nice */
if (filename.empty()) {
const gchar * id = "object";
- const GSList * reprlst = SP_ACTIVE_DESKTOP->getSelection()->reprList();
- for(; reprlst != NULL; reprlst = reprlst->next) {
- Inkscape::XML::Node * repr = (Inkscape::XML::Node *)reprlst->data;
+ const std::vector<XML::Node*> reprlst = SP_ACTIVE_DESKTOP->getSelection()->reprList();
+ for(std::vector<XML::Node*>::const_iterator i=reprlst.begin(); reprlst.end() != i; i++) {
+ Inkscape::XML::Node * repr = *i;
if (repr->attribute("id")) {
id = repr->attribute("id");
break;
@@ -1010,7 +1006,7 @@ void Export::onExport ()
if (batch_export.get_active ()) {
// Batch export of selected objects
- gint num = g_slist_length(const_cast<GSList *>(desktop->getSelection()->itemList()));
+ gint num = (desktop->getSelection()->itemList()).size();
gint n = 0;
if (num < 1) {
@@ -1024,8 +1020,9 @@ void Export::onExport ()
gint export_count = 0;
- for (GSList *i = const_cast<GSList *>(desktop->getSelection()->itemList()); i && !interrupted; i = i->next) {
- SPItem *item = reinterpret_cast<SPItem *>(i->data);
+ std::vector<SPItem*> itemlist=desktop->getSelection()->itemList();
+ for(std::vector<SPItem*>::const_iterator i = itemlist.begin();i!=itemlist.end() && !interrupted ;i++){
+ SPItem *item = *i;
prog_dlg->set_data("current", GINT_TO_POINTER(n));
prog_dlg->set_data("total", GINT_TO_POINTER(num));
@@ -1063,13 +1060,13 @@ void Export::onExport ()
_("Exporting file <b>%s</b>..."), safeFile), desktop);
MessageCleaner msgFlashCleanup(desktop->messageStack()->flashF(Inkscape::IMMEDIATE_MESSAGE,
_("Exporting file <b>%s</b>..."), safeFile), desktop);
-
+ std::vector<SPItem*> x;
if (!sp_export_png_file (doc, path.c_str(),
*area, width, height, dpi, dpi,
nv->pagecolor,
onProgressCallback, (void*)prog_dlg,
TRUE, // overwrite without asking
- hide ? const_cast<GSList *>(desktop->getSelection()->itemList()) : NULL
+ hide ? (desktop->getSelection()->itemList()) : x
)) {
gchar * error = g_strdup_printf(_("Could not export to filename %s.\n"), safeFile);
@@ -1153,12 +1150,13 @@ void Export::onExport ()
prog_dlg->set_data("total", GINT_TO_POINTER(0));
/* Do export */
+ std::vector<SPItem*> x;
ExportResult status = sp_export_png_file(desktop->getDocument(), path.c_str(),
Geom::Rect(Geom::Point(x0, y0), Geom::Point(x1, y1)), width, height, xdpi, ydpi,
nv->pagecolor,
onProgressCallback, (void*)prog_dlg,
FALSE,
- hide ? const_cast<GSList *>(desktop->getSelection()->itemList()) : NULL
+ hide ? (desktop->getSelection()->itemList()) : x
);
if (status == EXPORT_ERROR) {
gchar * safeFile = Inkscape::IO::sanitizeString(path.c_str());
@@ -1224,7 +1222,7 @@ void Export::onExport ()
break;
}
case SELECTION_SELECTION: {
- const GSList * reprlst;
+ std::vector<XML::Node*> reprlst;
SPDocument * doc = SP_ACTIVE_DOCUMENT;
bool modified = false;
@@ -1232,8 +1230,8 @@ void Export::onExport ()
DocumentUndo::setUndoSensitive(doc, false);
reprlst = desktop->getSelection()->reprList();
- for(; reprlst != NULL; reprlst = reprlst->next) {
- Inkscape::XML::Node * repr = static_cast<Inkscape::XML::Node *>(reprlst->data);
+ for(std::vector<Inkscape::XML::Node*>::const_iterator i=reprlst.begin(); reprlst.end() != i; i++) {
+ Inkscape::XML::Node * repr = *i;
const gchar * temp_string;
Glib::ustring dir = Glib::path_get_dirname(filename.c_str());
const gchar* docURI=SP_ACTIVE_DOCUMENT->getURI();
diff --git a/src/ui/dialog/filedialogimpl-gtkmm.h b/src/ui/dialog/filedialogimpl-gtkmm.h
index 6687915d7..7501b5e14 100644
--- a/src/ui/dialog/filedialogimpl-gtkmm.h
+++ b/src/ui/dialog/filedialogimpl-gtkmm.h
@@ -17,14 +17,6 @@
#ifndef __FILE_DIALOGIMPL_H__
#define __FILE_DIALOGIMPL_H__
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
//Gtk includes
#include <gtkmm/filechooserdialog.h>
#include <glib/gstdio.h>
diff --git a/src/ui/dialog/filedialogimpl-win32.h b/src/ui/dialog/filedialogimpl-win32.h
index 8c3b6bad6..b254c3ef6 100644
--- a/src/ui/dialog/filedialogimpl-win32.h
+++ b/src/ui/dialog/filedialogimpl-win32.h
@@ -16,11 +16,6 @@
#include <glibmm.h>
#ifdef WIN32
-#if WITH_GLIBMM_2_32
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-# include <glibmm/threads.h>
-#endif
-#endif
#include "filedialogimpl-gtkmm.h"
diff --git a/src/ui/dialog/filter-effects-dialog.cpp b/src/ui/dialog/filter-effects-dialog.cpp
index 077c6f5ca..1ff9e4a1b 100644
--- a/src/ui/dialog/filter-effects-dialog.cpp
+++ b/src/ui/dialog/filter-effects-dialog.cpp
@@ -8,6 +8,7 @@
* Felipe C. da S. Sanches <juca@members.fsf.org>
* Jon A. Cruz <jon@joncruz.org>
* Abhishek Sharma
+ * insaner
*
* Copyright (C) 2007 Authors
*
@@ -690,7 +691,7 @@ private:
void select_svg_element(){
Inkscape::Selection* sel = _desktop->getSelection();
if (sel->isEmpty()) return;
- Inkscape::XML::Node* node = (Inkscape::XML::Node*) g_slist_nth_data((GSList *)sel->reprList(), 0);
+ Inkscape::XML::Node* node = sel->reprList()[0];
if (!node || !node->matchAttributeName("id")) return;
std::ostringstream xlikhref;
@@ -1360,8 +1361,15 @@ FilterEffectsDialog::FilterModifier::FilterModifier(FilterEffectsDialog& d)
((Gtk::CellRendererText*)_list.get_column(1)->get_first_cell())->
signal_edited().connect(sigc::mem_fun(*this, &FilterEffectsDialog::FilterModifier::on_name_edited));
+ _list.append_column("#", _columns.count);
+ _list.get_column(2)->set_sizing(Gtk::TREE_VIEW_COLUMN_AUTOSIZE);
+ _list.get_column(2)->set_expand(false);
+
sw->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
_list.get_column(1)->set_resizable(true);
+ _list.get_column(1)->set_sizing(Gtk::TREE_VIEW_COLUMN_AUTOSIZE);
+ _list.get_column(1)->set_expand(true);
+
_list.set_reorderable(true);
_list.enable_model_drag_dest (Gdk::ACTION_MOVE);
@@ -1465,9 +1473,9 @@ void FilterEffectsDialog::FilterModifier::update_selection(Selection *sel)
}
std::set<SPObject*> used;
-
- for (GSList const *i = sel->itemList(); i != NULL; i = i->next) {
- SPObject *obj = SP_OBJECT (i->data);
+ std::vector<SPItem*> itemlist=sel->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin(); itemlist.end() != i; i++) {
+ SPObject *obj = *i;
SPStyle *style = obj->style;
if (!style || !SP_IS_ITEM(obj)) {
continue;
@@ -1494,6 +1502,7 @@ void FilterEffectsDialog::FilterModifier::update_selection(Selection *sel)
(*iter)[_columns.sel] = 0;
}
}
+ update_counts();
}
void FilterEffectsDialog::FilterModifier::on_filter_selection_changed()
@@ -1545,10 +1554,9 @@ void FilterEffectsDialog::FilterModifier::on_selection_toggled(const Glib::ustri
if((*iter)[_columns.sel] == 1)
filter = 0;
- GSList const *items = sel->itemList();
-
- for (GSList const *i = items; i != NULL; i = i->next) {
- SPItem * item = SP_ITEM(i->data);
+ std::vector<SPItem*> itemlist=sel->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin(); itemlist.end() != i; i++) {
+ SPItem * item = *i;
SPStyle *style = item->style;
g_assert(style != NULL);
@@ -1566,6 +1574,15 @@ void FilterEffectsDialog::FilterModifier::on_selection_toggled(const Glib::ustri
}
}
+
+void FilterEffectsDialog::FilterModifier::update_counts()
+{
+ for(Gtk::TreeModel::iterator i = _model->children().begin(); i != _model->children().end(); ++i) {
+ SPFilter* f = SP_FILTER((*i)[_columns.filter]);
+ (*i)[_columns.count] = f->getRefCount();
+ }
+}
+
/* Add all filters in the document to the combobox.
Keeps the same selection if possible, otherwise selects the first element */
void FilterEffectsDialog::FilterModifier::update_filters()
@@ -1650,12 +1667,13 @@ void FilterEffectsDialog::FilterModifier::remove_filter()
SPDocument* doc = filter->document;
// Delete all references to this filter
- GSList *all = get_all_items(NULL, _desktop->currentRoot(), _desktop, false, false, true, NULL);
- for (GSList *i = all; i != NULL; i = i->next) {
- if (!SP_IS_ITEM(i->data)) {
+ std::vector<SPItem*> x,y;
+ std::vector<SPItem*> all = get_all_items(x, _desktop->currentRoot(), _desktop, false, false, true, y);
+ for(std::vector<SPItem*>::const_iterator i=all.begin(); all.end() != i; i++) {
+ if (!SP_IS_ITEM(*i)) {
continue;
}
- SPItem *item = SP_ITEM(i->data);
+ SPItem *item = *i;
if (!item->style) {
continue;
}
@@ -1668,9 +1686,6 @@ void FilterEffectsDialog::FilterModifier::remove_filter()
}
}
}
- if (all) {
- g_slist_free(all);
- }
//XML Tree being used directly here while it shouldn't be.
sp_repr_unparent(filter->getRepr());
@@ -2422,7 +2437,7 @@ bool FilterEffectsDialog::PrimitiveList::on_motion_notify_event(GdkEventMotion*
get_visible_rect(vis);
int vis_x, vis_y;
- int vis_x2, vis_y2; // NOTE: insaner added -- necessary to get the scrolling while dragging to work
+ int vis_x2, vis_y2;
convert_widget_to_tree_coords(vis.get_x(), vis.get_y(), vis_x2, vis_y2);
convert_tree_to_widget_coords(vis.get_x(), vis.get_y(), vis_x, vis_y);
@@ -2442,7 +2457,6 @@ bool FilterEffectsDialog::PrimitiveList::on_motion_notify_event(GdkEventMotion*
else
_autoscroll_y = 0;
- // NOTE: insaner added -- necessary to get the scrolling while dragging to work
double e2 = ( e->x - vis_x2/2);
// horizontal scrolling
if(e2 < vis_x)
@@ -2755,20 +2769,22 @@ FilterEffectsDialog::FilterEffectsDialog()
Gtk::ScrolledWindow* sw_infobox = Gtk::manage(new Gtk::ScrolledWindow);
Gtk::HBox* infobox = Gtk::manage(new Gtk::HBox(/*homogeneous:*/false, /*spacing:*/4));
Gtk::HBox* hb_prims = Gtk::manage(new Gtk::HBox);
+ Gtk::VBox* vb_prims = Gtk::manage(new Gtk::VBox);
_getContents()->add(*hpaned);
hpaned->pack1(_filter_modifier);
hpaned->pack2(_primitive_box);
_primitive_box.pack_start(*sw_prims);
- _primitive_box.pack_start(*hb_prims, false, false);
_primitive_box.pack_start(*sw_infobox, false, false);
sw_prims->add(_primitive_list);
- sw_infobox->add(*infobox);
+ sw_infobox->add(*vb_prims);
infobox->pack_start(_infobox_icon, false, false);
infobox->pack_start(_infobox_desc, false, false);
_infobox_desc.set_line_wrap(true);
- _infobox_desc.set_size_request(200, -1);
+ _infobox_desc.set_size_request(250, -1);
+ vb_prims->pack_start(*hb_prims);
+ vb_prims->pack_start(*infobox);
hb_prims->pack_start(_add_primitive, false, false);
hb_prims->pack_start(_add_primitive_type, false, false);
@@ -2784,7 +2800,7 @@ FilterEffectsDialog::FilterEffectsDialog()
_add_primitive_type.signal_changed().connect(
sigc::mem_fun(*this, &FilterEffectsDialog::update_primitive_infobox));
- sw_prims->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); /* NOTE: insaner -- SCROLL the connections panel thing!!! */
+ sw_prims->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
sw_prims->set_shadow_type(Gtk::SHADOW_IN);
sw_infobox->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER);
diff --git a/src/ui/dialog/filter-effects-dialog.h b/src/ui/dialog/filter-effects-dialog.h
index 3fc19e7de..a067cd70c 100644
--- a/src/ui/dialog/filter-effects-dialog.h
+++ b/src/ui/dialog/filter-effects-dialog.h
@@ -4,6 +4,7 @@
/* Authors:
* Nicholas Bishop <nicholasbishop@gmail.com>
* Rodrigo Kumpera <kumpera@gmail.com>
+ * insaner
*
* Copyright (C) 2007 Authors
*
@@ -69,11 +70,13 @@ private:
add(filter);
add(label);
add(sel);
+ add(count);
}
Gtk::TreeModelColumn<SPFilter*> filter;
Gtk::TreeModelColumn<Glib::ustring> label;
Gtk::TreeModelColumn<int> sel;
+ Gtk::TreeModelColumn<int> count;
};
void setTargetDesktop(SPDesktop *desktop);
@@ -89,6 +92,7 @@ private:
bool on_filter_move(const Glib::RefPtr<Gdk::DragContext>& /*context*/, int x, int y, guint /*time*/);
void on_selection_toggled(const Glib::ustring&);
+ void update_counts();
void update_filters();
void filter_list_button_release(GdkEventButton*);
void add_filter();
diff --git a/src/ui/dialog/find.cpp b/src/ui/dialog/find.cpp
index 951cb01ea..a8ac42a1b 100644
--- a/src/ui/dialog/find.cpp
+++ b/src/ui/dialog/find.cpp
@@ -549,7 +549,7 @@ bool Find::item_font_match(SPItem *item, const gchar *text, bool exact, bool cas
}
-GSList *Find::filter_fields (GSList *l, bool exact, bool casematch)
+std::vector<SPItem*> Find::filter_fields (std::vector<SPItem*> &l, bool exact, bool casematch)
{
Glib::ustring tmp = entry_find.getEntry()->get_text();
if (tmp.empty()) {
@@ -557,17 +557,17 @@ GSList *Find::filter_fields (GSList *l, bool exact, bool casematch)
}
gchar* text = g_strdup(tmp.c_str());
- GSList *in = l;
- GSList *out = NULL;
+ std::vector<SPItem*> in = l;
+ std::vector<SPItem*> out;
if (check_searchin_text.get_active()) {
- for (GSList *i = in; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for(std::vector<SPItem*>::const_reverse_iterator i=in.rbegin(); in.rend() != i; i++) {
+ SPObject *obj = *i;
SPItem *item = dynamic_cast<SPItem *>(obj);
g_assert(item != NULL);
if (item_text_match(item, text, exact, casematch)) {
- if (!g_slist_find(out, i->data)) {
- out = g_slist_prepend (out, i->data);
+ if (out.end()==find(out.begin(),out.end(), *i)) {
+ out.push_back(*i);
if (_action_replace) {
item_text_match(item, text, exact, casematch, _action_replace);
}
@@ -584,12 +584,12 @@ GSList *Find::filter_fields (GSList *l, bool exact, bool casematch)
bool attrvalue = check_attributevalue.get_active();
if (ids) {
- for (GSList *i = in; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for(std::vector<SPItem*>::const_reverse_iterator i=in.rbegin(); in.rend() != i; i++) {
+ SPObject *obj = *i;
SPItem *item = dynamic_cast<SPItem *>(obj);
if (item_id_match(item, text, exact, casematch)) {
- if (!g_slist_find(out, i->data)) {
- out = g_slist_prepend (out, i->data);
+ if (out.end()==find(out.begin(),out.end(), *i)) {
+ out.push_back(*i);
if (_action_replace) {
item_id_match(item, text, exact, casematch, _action_replace);
}
@@ -600,14 +600,13 @@ GSList *Find::filter_fields (GSList *l, bool exact, bool casematch)
if (style) {
- for (GSList *i = in; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for(std::vector<SPItem*>::const_reverse_iterator i=in.rbegin(); in.rend() != i; i++) {
+ SPObject *obj = *i;
SPItem *item = dynamic_cast<SPItem *>(obj);
g_assert(item != NULL);
if (item_style_match(item, text, exact, casematch)) {
- if (!g_slist_find(out, i->data))
- if (!g_slist_find(out, i->data)) {
- out = g_slist_prepend (out, i->data);
+ if (out.end()==find(out.begin(),out.end(), *i)){
+ out.push_back(*i);
if (_action_replace) {
item_style_match(item, text, exact, casematch, _action_replace);
}
@@ -618,13 +617,13 @@ GSList *Find::filter_fields (GSList *l, bool exact, bool casematch)
if (attrname) {
- for (GSList *i = in; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for(std::vector<SPItem*>::const_reverse_iterator i=in.rbegin(); in.rend() != i; i++) {
+ SPObject *obj = *i;
SPItem *item = dynamic_cast<SPItem *>(obj);
g_assert(item != NULL);
if (item_attr_match(item, text, exact, casematch)) {
- if (!g_slist_find(out, i->data)) {
- out = g_slist_prepend (out, i->data);
+ if (out.end()==find(out.begin(),out.end(), *i)) {
+ out.push_back(*i);
if (_action_replace) {
item_attr_match(item, text, exact, casematch, _action_replace);
}
@@ -635,13 +634,13 @@ GSList *Find::filter_fields (GSList *l, bool exact, bool casematch)
if (attrvalue) {
- for (GSList *i = in; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for(std::vector<SPItem*>::const_reverse_iterator i=in.rbegin(); in.rend() != i; i++) {
+ SPObject *obj = *i;
SPItem *item = dynamic_cast<SPItem *>(obj);
g_assert(item != NULL);
if (item_attrvalue_match(item, text, exact, casematch)) {
- if (!g_slist_find(out, i->data)) {
- out = g_slist_prepend (out, i->data);
+ if (out.end()==find(out.begin(),out.end(), *i)) {
+ out.push_back(*i);
if (_action_replace) {
item_attrvalue_match(item, text, exact, casematch, _action_replace);
}
@@ -652,13 +651,13 @@ GSList *Find::filter_fields (GSList *l, bool exact, bool casematch)
if (font) {
- for (GSList *i = in; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ for(std::vector<SPItem*>::const_reverse_iterator i=in.rbegin(); in.rend() != i; i++) {
+ SPObject *obj = *i;
SPItem *item = dynamic_cast<SPItem *>(obj);
g_assert(item != NULL);
if (item_font_match(item, text, exact, casematch)) {
- if (!g_slist_find(out, i->data)) {
- out = g_slist_prepend (out, i->data);
+ if (out.end()==find(out.begin(),out.end(),*i)) {
+ out.push_back(*i);
if (_action_replace) {
item_font_match(item, text, exact, casematch, _action_replace);
}
@@ -716,29 +715,29 @@ bool Find::item_type_match (SPItem *item)
return false;
}
-GSList *Find::filter_types (GSList *l)
+std::vector<SPItem*> Find::filter_types (std::vector<SPItem*> &l)
{
- GSList *n = NULL;
- for (GSList *i = l; i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ std::vector<SPItem*> n;
+ for(std::vector<SPItem*>::const_reverse_iterator i=l.rbegin(); l.rend() != i; i++) {
+ SPObject *obj = *i;
SPItem *item = dynamic_cast<SPItem *>(obj);
g_assert(item != NULL);
if (item_type_match(item)) {
- n = g_slist_prepend (n, i->data);
+ n.push_back(*i);
}
}
return n;
}
-GSList *Find::filter_list (GSList *l, bool exact, bool casematch)
+std::vector<SPItem*> &Find::filter_list (std::vector<SPItem*> &l, bool exact, bool casematch)
{
l = filter_types (l);
l = filter_fields (l, exact, casematch);
return l;
}
-GSList *Find::all_items (SPObject *r, GSList *l, bool hidden, bool locked)
+std::vector<SPItem*> &Find::all_items (SPObject *r, std::vector<SPItem*> &l, bool hidden, bool locked)
{
if (dynamic_cast<SPDefs *>(r)) {
return l; // we're not interested in items in defs
@@ -752,7 +751,7 @@ GSList *Find::all_items (SPObject *r, GSList *l, bool hidden, bool locked)
SPItem *item = dynamic_cast<SPItem *>(child);
if (item && !child->cloned && !desktop->isLayer(item)) {
if ((hidden || !desktop->itemIsHidden(item)) && (locked || !item->isLocked())) {
- l = g_slist_prepend (l, child);
+ l.insert(l.begin(),(SPItem*)child);
}
}
l = all_items (child, l, hidden, locked);
@@ -760,16 +759,17 @@ GSList *Find::all_items (SPObject *r, GSList *l, bool hidden, bool locked)
return l;
}
-GSList *Find::all_selection_items (Inkscape::Selection *s, GSList *l, SPObject *ancestor, bool hidden, bool locked)
+std::vector<SPItem*> &Find::all_selection_items (Inkscape::Selection *s, std::vector<SPItem*> &l, SPObject *ancestor, bool hidden, bool locked)
{
- for (GSList *i = (GSList *) s->itemList(); i != NULL; i = i->next) {
- SPObject *obj = reinterpret_cast<SPObject *>(i->data);
+ std::vector<SPItem*> itemlist=s->itemList();
+ for(std::vector<SPItem*>::const_reverse_iterator i=itemlist.rbegin(); itemlist.rend() != i; i++) {
+ SPObject *obj = *i;
SPItem *item = dynamic_cast<SPItem *>(obj);
g_assert(item != NULL);
if (item && !item->cloned && !desktop->isLayer(item)) {
if (!ancestor || ancestor->isAncestorOf(item)) {
if ((hidden || !desktop->itemIsHidden(item)) && (locked || !item->isLocked())) {
- l = g_slist_prepend (l, i->data);
+ l.push_back(*i);
}
}
}
@@ -817,7 +817,7 @@ void Find::onAction()
bool casematch = check_case_sensitive.get_active();
blocked = true;
- GSList *l = NULL;
+ std::vector<SPItem*> l;
if (check_scope_selection.get_active()) {
if (check_scope_layer.get_active()) {
l = all_selection_items (desktop->selection, l, desktop->currentLayer(), hidden, locked);
@@ -831,12 +831,12 @@ void Find::onAction()
l = all_items(desktop->getDocument()->getRoot(), l, hidden, locked);
}
}
- guint all = g_slist_length (l);
+ guint all = l.size();
- GSList *n = filter_list (l, exact, casematch);
+ std::vector<SPItem*> n = filter_list (l, exact, casematch);
- if (n != NULL) {
- int count = g_slist_length (n);
+ if (!n.empty()) {
+ int count = n.size();
desktop->messageStack()->flashF(Inkscape::NORMAL_MESSAGE,
// TRANSLATORS: "%s" is replaced with "exact" or "partial" when this string is displayed
ngettext("<b>%d</b> object found (out of <b>%d</b>), %s match.",
@@ -857,7 +857,7 @@ void Find::onAction()
Inkscape::Selection *selection = desktop->getSelection();
selection->clear();
selection->setList(n);
- SPObject *obj = reinterpret_cast<SPObject *>(n->data);
+ SPObject *obj = n[0];
SPItem *item = dynamic_cast<SPItem *>(obj);
g_assert(item != NULL);
scroll_to_show_item(desktop, item);
diff --git a/src/ui/dialog/find.h b/src/ui/dialog/find.h
index c0c635f94..4bcb900b6 100644
--- a/src/ui/dialog/find.h
+++ b/src/ui/dialog/find.h
@@ -148,10 +148,10 @@ protected:
/**
* Function to filter a list of items based on the item type by calling each item_XXX_match function
*/
- GSList * filter_fields (GSList *l, bool exact, bool casematch);
+ std::vector<SPItem*> filter_fields (std::vector<SPItem*> &l, bool exact, bool casematch);
bool item_type_match (SPItem *item);
- GSList * filter_types (GSList *l);
- GSList * filter_list (GSList *l, bool exact, bool casematch);
+ std::vector<SPItem*> filter_types (std::vector<SPItem*> &l);
+ std::vector<SPItem*> & filter_list (std::vector<SPItem*> &l, bool exact, bool casematch);
/**
* Find a string within a string and returns true if found with options for exact and casematching
@@ -172,12 +172,12 @@ protected:
* recursive function to return a list of all the items in the SPObject tree
*
*/
- GSList * all_items (SPObject *r, GSList *l, bool hidden, bool locked);
+ std::vector<SPItem*> & all_items (SPObject *r, std::vector<SPItem*> &l, bool hidden, bool locked);
/**
* to return a list of all the selected items
*
*/
- GSList * all_selection_items (Inkscape::Selection *s, GSList *l, SPObject *ancestor, bool hidden, bool locked);
+ std::vector<SPItem*> & all_selection_items (Inkscape::Selection *s, std::vector<SPItem*> &l, SPObject *ancestor, bool hidden, bool locked);
/**
* Shrink the dialog size when the expander widget is closed
diff --git a/src/ui/dialog/floating-behavior.cpp b/src/ui/dialog/floating-behavior.cpp
index 11db14801..55ef0c5bb 100644
--- a/src/ui/dialog/floating-behavior.cpp
+++ b/src/ui/dialog/floating-behavior.cpp
@@ -14,10 +14,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/dialog.h>
#include <gtkmm/stock.h>
#include <glibmm/main.h>
@@ -116,7 +112,7 @@ bool FloatingBehavior::_trans_timer (void) {
}
float goal, current;
- goal = current = _d->get_opacity();
+ current = _d->get_opacity();
if (_dialog_active.get_value()) {
goal = _trans_focus;
diff --git a/src/ui/dialog/font-substitution.cpp b/src/ui/dialog/font-substitution.cpp
index ae03bdf0e..19506c6a3 100644
--- a/src/ui/dialog/font-substitution.cpp
+++ b/src/ui/dialog/font-substitution.cpp
@@ -10,10 +10,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/messagedialog.h>
#include <gtkmm/checkbutton.h>
#include <gtkmm/scrolledwindow.h>
@@ -70,19 +66,15 @@ FontSubstitution::checkFontSubstitutions(SPDocument* doc)
int show_dlg = prefs->getInt("/options/font/substitutedlg", 0);
if (show_dlg) {
Glib::ustring out;
- GSList *l = getFontReplacedItems(doc, &out);
+ std::vector<SPItem*> l = getFontReplacedItems(doc, &out);
if (out.length() > 0) {
show(out, l);
}
- if (l) {
- g_slist_free(l);
- l = NULL;
- }
}
}
void
-FontSubstitution::show(Glib::ustring out, GSList *l)
+FontSubstitution::show(Glib::ustring out, std::vector<SPItem*> &l)
{
Gtk::MessageDialog warning(_("\nSome fonts are not available and have been substituted."),
false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK, true);
@@ -152,20 +144,18 @@ FontSubstitution::show(Glib::ustring out, GSList *l)
* b. Build up a list of the objects rendered fonts - taken for the objects layout/spans
* If there are fonts in a. that are not in b. then those fonts have been substituted.
*/
-GSList * FontSubstitution::getFontReplacedItems(SPDocument* doc, Glib::ustring *out)
+std::vector<SPItem*> FontSubstitution::getFontReplacedItems(SPDocument* doc, Glib::ustring *out)
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
- GSList *allList = NULL;
- GSList *outList = NULL;
+ std::vector<SPItem*> allList;
+ std::vector<SPItem*> outList,x,y;
std::set<Glib::ustring> setErrors;
std::set<Glib::ustring> setFontSpans;
std::map<SPItem *, Glib::ustring> mapFontStyles;
- allList = get_all_items(NULL, doc->getRoot(), desktop, false, false, true, NULL);
-
- for (GSList *i = allList; i != NULL; i = i->next) {
-
- SPItem *item = SP_ITEM(i->data);
+ allList = get_all_items(x, doc->getRoot(), desktop, false, false, true, y);
+ for(std::vector<SPItem*>::const_iterator i = allList.begin();i!=allList.end();i++){
+ SPItem *item = *i;
SPStyle *style = item->style;
Glib::ustring family = "";
@@ -220,8 +210,8 @@ GSList * FontSubstitution::getFontReplacedItems(SPDocument* doc, Glib::ustring *
}
// Check if any document styles are not in the actual layout
- std::map<SPItem *, Glib::ustring>::const_iterator mapIter;
- for (mapIter = mapFontStyles.begin(); mapIter != mapFontStyles.end(); ++mapIter) {
+ std::map<SPItem *, Glib::ustring>::const_reverse_iterator mapIter;
+ for (mapIter = mapFontStyles.rbegin(); mapIter != mapFontStyles.rend(); ++mapIter) {
SPItem *item = mapIter->first;
Glib::ustring fonts = mapIter->second;
@@ -254,7 +244,7 @@ GSList * FontSubstitution::getFontReplacedItems(SPDocument* doc, Glib::ustring *
Glib::ustring err = Glib::ustring::compose(
_("Font '%1' substituted with '%2'"), fonts.c_str(), subName.c_str());
setErrors.insert(err);
- outList = g_slist_prepend (outList, item);
+ outList.push_back(item);
}
}
diff --git a/src/ui/dialog/font-substitution.h b/src/ui/dialog/font-substitution.h
index 1c445081b..0818d778c 100644
--- a/src/ui/dialog/font-substitution.h
+++ b/src/ui/dialog/font-substitution.h
@@ -14,6 +14,7 @@
#include <glibmm/ustring.h>
+class SPItem;
class SPDocument;
namespace Inkscape {
@@ -25,13 +26,13 @@ public:
FontSubstitution();
virtual ~FontSubstitution();
void checkFontSubstitutions(SPDocument* doc);
- void show(Glib::ustring out, GSList *l);
+ void show(Glib::ustring out, std::vector<SPItem*> &l);
static FontSubstitution &getInstance() { return *new FontSubstitution(); }
Glib::ustring getSubstituteFontName (Glib::ustring font);
protected:
- GSList *getFontReplacedItems(SPDocument* doc, Glib::ustring *out);
+ std::vector<SPItem*> getFontReplacedItems(SPDocument* doc, Glib::ustring *out);
private:
FontSubstitution(FontSubstitution const &d);
diff --git a/src/ui/dialog/glyphs.cpp b/src/ui/dialog/glyphs.cpp
index 2b9053da9..7ca277ea2 100644
--- a/src/ui/dialog/glyphs.cpp
+++ b/src/ui/dialog/glyphs.cpp
@@ -578,9 +578,10 @@ void GlyphsPanel::setTargetDesktop(SPDesktop *desktop)
void GlyphsPanel::insertText()
{
SPItem *textItem = 0;
- for (const GSList *item = targetDesktop->selection->itemList(); item; item = item->next ) {
- if (SP_IS_TEXT(item->data) || SP_IS_FLOWTEXT(item->data)) {
- textItem = SP_ITEM(item->data);
+ std::vector<SPItem*> itemlist=targetDesktop->selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin(); itemlist.end() != i; i++) {
+ if (SP_IS_TEXT(*i) || SP_IS_FLOWTEXT(*i)) {
+ textItem = *i;
break;
}
}
@@ -687,8 +688,9 @@ void GlyphsPanel::selectionModifiedCB(guint flags)
void GlyphsPanel::calcCanInsert()
{
int items = 0;
- for (const GSList *item = targetDesktop->selection->itemList(); item; item = item->next ) {
- if (SP_IS_TEXT(item->data) || SP_IS_FLOWTEXT(item->data)) {
+ std::vector<SPItem*> itemlist=targetDesktop->selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin(); itemlist.end() != i; i++) {
+ if (SP_IS_TEXT(*i) || SP_IS_FLOWTEXT(*i)) {
++items;
}
}
diff --git a/src/ui/dialog/grid-arrange-tab.cpp b/src/ui/dialog/grid-arrange-tab.cpp
index d3ccb9bde..c44f66a4d 100644
--- a/src/ui/dialog/grid-arrange-tab.cpp
+++ b/src/ui/dialog/grid-arrange-tab.cpp
@@ -48,7 +48,7 @@
* 0 *elem1 == *elem2
* >0 *elem1 goes after *elem2
*/
-static int sp_compare_x_position(SPItem *first, SPItem *second)
+static bool sp_compare_x_position(SPItem *first, SPItem *second)
{
using Geom::X;
using Geom::Y;
@@ -58,7 +58,7 @@ static int sp_compare_x_position(SPItem *first, SPItem *second)
if ( !a || !b ) {
// FIXME?
- return 0;
+ return false;
}
double const a_height = a->dimensions()[Y];
@@ -76,40 +76,41 @@ static int sp_compare_x_position(SPItem *first, SPItem *second)
}
if (!a_in_b_vert) {
- return -1;
+ return true;
}
if (a_in_b_vert && a->min()[X] > b->min()[X]) {
- return 1;
+ return false;
}
if (a_in_b_vert && a->min()[X] < b->min()[X]) {
- return -1;
+ return true;
}
- return 0;
+ return false;
}
/*
* Sort items by their y co-ordinates.
*/
-static int sp_compare_y_position(SPItem *first, SPItem *second)
+static bool sp_compare_y_position(SPItem *first, SPItem *second)
{
Geom::OptRect a = first->documentVisualBounds();
Geom::OptRect b = second->documentVisualBounds();
if ( !a || !b ) {
// FIXME?
- return 0;
+ return false;
}
if (a->min()[Geom::Y] > b->min()[Geom::Y]) {
- return 1;
+ return false;
}
if (a->min()[Geom::Y] < b->min()[Geom::Y]) {
- return -1;
+ return true;
}
- return 0;
+ return false;
}
+
namespace Inkscape {
namespace UI {
namespace Dialog {
@@ -168,10 +169,9 @@ void GridArrangeTab::arrange()
desktop->getDocument()->ensureUpToDate();
Inkscape::Selection *selection = desktop->getSelection();
- const GSList *items = selection ? selection->itemList() : 0;
- cnt=0;
- for (; items != NULL; items = items->next) {
- SPItem *item = SP_ITEM(items->data);
+ const std::vector<SPItem*> items = selection ? selection->itemList() : std::vector<SPItem*>();
+ for(std::vector<SPItem*>::const_iterator i = items.begin();i!=items.end();i++){
+ SPItem *item = *i;
Geom::OptRect b = item->documentVisualBounds();
if (!b) {
continue;
@@ -198,20 +198,18 @@ void GridArrangeTab::arrange()
// require the sorting done before we can calculate row heights etc.
g_return_if_fail(selection);
- const GSList *items2 = selection->itemList();
- GSList *rev = g_slist_copy(const_cast<GSList *>(items2));
- GSList *sorted = NULL;
- rev = g_slist_sort(rev, (GCompareFunc) sp_compare_y_position);
- sorted = g_slist_sort(rev, (GCompareFunc) sp_compare_x_position);
+ std::vector<SPItem*> sorted(selection->itemList());
+ sort(sorted.begin(),sorted.end(),sp_compare_y_position);
+ sort(sorted.begin(),sorted.end(),sp_compare_x_position);
// Calculate individual Row and Column sizes if necessary
cnt=0;
- const GSList *sizes = sorted;
- for (; sizes != NULL; sizes = sizes->next) {
- SPItem *item = SP_ITEM(sizes->data);
+ const std::vector<SPItem*> sizes(sorted);
+ for (std::vector<SPItem*>::const_iterator i = sizes.begin();i!=sizes.end();i++) {
+ SPItem *item = *i;
Geom::OptRect b = item->documentVisualBounds();
if (b) {
width = b->dimensions()[Geom::X];
@@ -308,12 +306,14 @@ g_print("\n row = %f col = %f selection x= %f selection y = %f", total_row_h
}
cnt=0;
- for (row_cnt=0; ((sorted != NULL) && (row_cnt<NoOfRows)); row_cnt++) {
+ std::vector<SPItem*>::iterator it = sorted.begin();
+ for (row_cnt=0; ((it != sorted.end()) && (row_cnt<NoOfRows)); row_cnt++) {
GSList *current_row = NULL;
- for (col_cnt = 0; ((sorted != NULL) && (col_cnt<NoOfCols)); col_cnt++) {
- current_row = g_slist_append (current_row, sorted->data);
- sorted = sorted->next;
+ col_cnt = 0;
+ for(;it!=sorted.end()&&col<NoOfCols;it++) {
+ current_row = g_slist_append (current_row, *it);
+ col_cnt++;
}
for (; current_row != NULL; current_row = current_row->next) {
@@ -374,8 +374,8 @@ void GridArrangeTab::on_row_spinbutton_changed()
Inkscape::Selection *selection = desktop ? desktop->selection : 0;
g_return_if_fail( selection );
- GSList const *items = selection->itemList();
- int selcount = g_slist_length((GSList *)items);
+ std::vector<SPItem*> const items = selection->itemList();
+ int selcount = items.size();
double PerCol = ceil(selcount / NoOfColsSpinner.get_value());
NoOfRowsSpinner.set_value(PerCol);
@@ -400,8 +400,7 @@ void GridArrangeTab::on_col_spinbutton_changed()
Inkscape::Selection *selection = desktop ? desktop->selection : 0;
g_return_if_fail(selection);
- GSList const *items = selection->itemList();
- int selcount = g_slist_length((GSList *)items);
+ int selcount = selection->itemList().size();
double PerRow = ceil(selcount / NoOfRowsSpinner.get_value());
NoOfColsSpinner.set_value(PerRow);
@@ -538,10 +537,10 @@ void GridArrangeTab::updateSelection()
updating = true;
SPDesktop *desktop = Parent->getDesktop();
Inkscape::Selection *selection = desktop ? desktop->selection : 0;
- GSList const *items = selection ? selection->itemList() : 0;
+ std::vector<SPItem*> const items = selection ? selection->itemList() : std::vector<SPItem*>();
- if (items) {
- int selcount = g_slist_length((GSList *)items);
+ if (!items.empty()) {
+ int selcount = items.size();
if (NoOfColsSpinner.get_value() > 1 && NoOfRowsSpinner.get_value() > 1){
// Update the number of rows assuming number of columns wanted remains same.
@@ -609,8 +608,7 @@ GridArrangeTab::GridArrangeTab(ArrangeDialog *parent)
g_return_if_fail( selection );
int selcount = 1;
if (!selection->isEmpty()) {
- GSList const *items = selection->itemList();
- selcount = g_slist_length((GSList *)items);
+ selcount = selection->itemList().size();
}
diff --git a/src/ui/dialog/guides.h b/src/ui/dialog/guides.h
index 22bf5097a..4ff7b4fde 100644
--- a/src/ui/dialog/guides.h
+++ b/src/ui/dialog/guides.h
@@ -15,10 +15,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/dialog.h>
#if WITH_GTKMM_3_0
diff --git a/src/ui/dialog/icon-preview.cpp b/src/ui/dialog/icon-preview.cpp
index b908a90cb..77f120e1a 100644
--- a/src/ui/dialog/icon-preview.cpp
+++ b/src/ui/dialog/icon-preview.cpp
@@ -17,10 +17,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/buttonbox.h>
#include <boost/scoped_ptr.hpp>
@@ -316,7 +312,7 @@ void IconPreviewPanel::setDesktop( SPDesktop* desktop )
if ( this->desktop ) {
docReplacedConn = this->desktop->connectDocumentReplaced(sigc::hide<0>(sigc::mem_fun(this, &IconPreviewPanel::setDocument)));
if ( this->desktop->selection && Inkscape::Preferences::get()->getBool("/iconpreview/autoRefresh", true) ) {
- selChangedConn = desktop->selection->connectChanged(sigc::hide(sigc::mem_fun(this, &IconPreviewPanel::queueRefresh)));
+ selChangedConn = this->desktop->selection->connectChanged(sigc::hide(sigc::mem_fun(this, &IconPreviewPanel::queueRefresh)));
}
}
}
@@ -366,16 +362,14 @@ void IconPreviewPanel::refreshPreview()
if ( sel ) {
//g_message("found a selection to play with");
- GSList const *items = sel->itemList();
- while ( items && !target ) {
- SPItem* item = SP_ITEM( items->data );
+ std::vector<SPItem*> const items = sel->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();!target && i!=items.end();i++){
+ SPItem* item = *i;
gchar const *id = item->getId();
if ( id ) {
targetId = id;
target = item;
}
-
- items = g_slist_next(items);
}
}
}
diff --git a/src/ui/dialog/layer-properties.h b/src/ui/dialog/layer-properties.h
index d114c6ba5..c75a7f190 100644
--- a/src/ui/dialog/layer-properties.h
+++ b/src/ui/dialog/layer-properties.h
@@ -16,10 +16,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/dialog.h>
#include <gtkmm/entry.h>
#include <gtkmm/label.h>
diff --git a/src/ui/dialog/layers.h b/src/ui/dialog/layers.h
index ae0ac6040..9cd2c3b92 100644
--- a/src/ui/dialog/layers.h
+++ b/src/ui/dialog/layers.h
@@ -16,10 +16,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/treeview.h>
#include <gtkmm/treestore.h>
diff --git a/src/ui/dialog/livepatheffect-add.h b/src/ui/dialog/livepatheffect-add.h
index 99ead878c..c686e8365 100644
--- a/src/ui/dialog/livepatheffect-add.h
+++ b/src/ui/dialog/livepatheffect-add.h
@@ -11,14 +11,6 @@
#ifndef INKSCAPE_DIALOG_LIVEPATHEFFECT_ADD_H
#define INKSCAPE_DIALOG_LIVEPATHEFFECT_ADD_H
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/dialog.h>
#include <gtkmm/liststore.h>
#include <gtkmm/treeview.h>
diff --git a/src/ui/dialog/lpe-fillet-chamfer-properties.cpp b/src/ui/dialog/lpe-fillet-chamfer-properties.cpp
index 7e5c17133..f63b19e86 100644
--- a/src/ui/dialog/lpe-fillet-chamfer-properties.cpp
+++ b/src/ui/dialog/lpe-fillet-chamfer-properties.cpp
@@ -8,10 +8,6 @@
#include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED &&HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm.h>
#include "lpe-fillet-chamfer-properties.h"
#include <boost/lexical_cast.hpp>
diff --git a/src/ui/dialog/lpe-powerstroke-properties.cpp b/src/ui/dialog/lpe-powerstroke-properties.cpp
index a9e57970d..0cf3e9706 100644
--- a/src/ui/dialog/lpe-powerstroke-properties.cpp
+++ b/src/ui/dialog/lpe-powerstroke-properties.cpp
@@ -17,10 +17,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include "lpe-powerstroke-properties.h"
#include <boost/lexical_cast.hpp>
#include <gtkmm/stock.h>
diff --git a/src/ui/dialog/messages.h b/src/ui/dialog/messages.h
index 54ca84f47..6ed246ece 100644
--- a/src/ui/dialog/messages.h
+++ b/src/ui/dialog/messages.h
@@ -16,14 +16,6 @@
#ifndef INKSCAPE_UI_DIALOG_MESSAGES_H
#define INKSCAPE_UI_DIALOG_MESSAGES_H
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/textview.h>
#include <gtkmm/button.h>
diff --git a/src/ui/dialog/object-attributes.cpp b/src/ui/dialog/object-attributes.cpp
index f43a15225..1bc570f43 100644
--- a/src/ui/dialog/object-attributes.cpp
+++ b/src/ui/dialog/object-attributes.cpp
@@ -127,7 +127,7 @@ void ObjectAttributes::widget_setup (void)
blocked = true;
// CPPIFY
- SPObject *obj = SP_OBJECT(item); //to get the selected item
+ SPObject *obj = item; //to get the selected item
// GObjectClass *klass = G_OBJECT_GET_CLASS(obj); //to deduce the object's type
// GType type = G_TYPE_FROM_CLASS(klass);
const SPAttrDesc *desc;
diff --git a/src/ui/dialog/object-properties.cpp b/src/ui/dialog/object-properties.cpp
index dfe211e94..fc21a30d4 100644
--- a/src/ui/dialog/object-properties.cpp
+++ b/src/ui/dialog/object-properties.cpp
@@ -467,14 +467,14 @@ void ObjectProperties::_labelChanged()
gchar *id = g_strdup(_entry_id.get_text().c_str());
g_strcanon(id, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.:", '_');
if (strcmp(id, item->getId()) == 0) {
- _label_id.set_markup_with_mnemonic(_("_ID:"));
+ _label_id.set_markup_with_mnemonic(_("_ID:") + Glib::ustring(" "));
} else if (!*id || !isalnum (*id)) {
_label_id.set_text(_("Id invalid! "));
} else if (SP_ACTIVE_DOCUMENT->getObjectById(id) != NULL) {
_label_id.set_text(_("Id exists! "));
} else {
SPException ex;
- _label_id.set_markup_with_mnemonic(_("_ID:"));
+ _label_id.set_markup_with_mnemonic(_("_ID:") + Glib::ustring(" "));
SP_EXCEPTION_INIT(&ex);
item->setAttribute("id", id, &ex);
DocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_ITEM, _("Set object ID"));
diff --git a/src/ui/dialog/objects.cpp b/src/ui/dialog/objects.cpp
index 9db0285d7..781c6ef93 100644
--- a/src/ui/dialog/objects.cpp
+++ b/src/ui/dialog/objects.cpp
@@ -477,15 +477,15 @@ void ObjectsPanel::_objectsSelected( Selection *sel ) {
_selectedConnection.block();
_tree.get_selection()->unselect_all();
SPItem *item = NULL;
- for (const GSList * iter = sel->itemList(); iter != NULL; iter = iter->next)
- {
- item = reinterpret_cast<SPItem *>(iter->data);
+ std::vector<SPItem*> const items = sel->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin(); i!=items.end();i++){
+ item = *i;
if (setOpacity)
{
_setCompositingValues(item);
setOpacity = false;
}
- _store->foreach(sigc::bind<SPItem *, bool>( sigc::mem_fun(*this, &ObjectsPanel::_checkForSelected), item, iter->next == NULL));
+ _store->foreach(sigc::bind<SPItem *, bool>( sigc::mem_fun(*this, &ObjectsPanel::_checkForSelected), item, (*i)==items.back()));
}
if (!item) {
if (_desktop->currentLayer() && SP_IS_ITEM(_desktop->currentLayer())) {
diff --git a/src/ui/dialog/objects.h b/src/ui/dialog/objects.h
index 74c2382ac..1842fea11 100644
--- a/src/ui/dialog/objects.h
+++ b/src/ui/dialog/objects.h
@@ -16,10 +16,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-# include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/treeview.h>
#include <gtkmm/treestore.h>
diff --git a/src/ui/dialog/ocaldialogs.h b/src/ui/dialog/ocaldialogs.h
index bd028c145..6ceceb9ef 100644
--- a/src/ui/dialog/ocaldialogs.h
+++ b/src/ui/dialog/ocaldialogs.h
@@ -17,10 +17,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
//Gtk includes
#include <gtkmm/box.h>
#include <gtkmm/eventbox.h>
diff --git a/src/ui/dialog/pixelartdialog.cpp b/src/ui/dialog/pixelartdialog.cpp
index 5113f172a..760391df6 100644
--- a/src/ui/dialog/pixelartdialog.cpp
+++ b/src/ui/dialog/pixelartdialog.cpp
@@ -372,12 +372,12 @@ void PixelArtDialogImpl::vectorize()
return;
}
- for ( GSList const *list = desktop->selection->itemList() ; list
- ; list = list->next ) {
- if ( !SP_IS_IMAGE(list->data) )
+ std::vector<SPItem*> const items = desktop->selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin(); i!=items.end();i++){
+ if ( !SP_IS_IMAGE(*i) )
continue;
- SPImage *img = SP_IMAGE(list->data);
+ SPImage *img = SP_IMAGE(*i);
Input input;
input.pixbuf = Glib::wrap(img->pixbuf->getPixbufRaw(), true);
input.x = img->x;
diff --git a/src/ui/dialog/polar-arrange-tab.cpp b/src/ui/dialog/polar-arrange-tab.cpp
index 281958998..af1386e27 100644
--- a/src/ui/dialog/polar-arrange-tab.cpp
+++ b/src/ui/dialog/polar-arrange-tab.cpp
@@ -297,19 +297,18 @@ static void moveToPoint(int anchor, SPItem *item, Geom::Point p)
void PolarArrangeTab::arrange()
{
Inkscape::Selection *selection = parent->getDesktop()->getSelection();
- const GSList *items, *tmp;
- tmp = items = selection->itemList();
+ const std::vector<SPItem*> tmp(selection->itemList());
SPGenericEllipse *referenceEllipse = NULL; // Last ellipse in selection
bool arrangeOnEllipse = !arrangeOnParametersRadio.get_active();
bool arrangeOnFirstEllipse = arrangeOnEllipse && arrangeOnFirstCircleRadio.get_active();
int count = 0;
- while(tmp)
+ for(std::vector<SPItem*>::const_iterator i=tmp.begin();i!=tmp.end();i++)
{
if(arrangeOnEllipse)
{
- SPItem *item = SP_ITEM(tmp->data);
+ SPItem *item = *i;
if(arrangeOnFirstEllipse)
{
@@ -322,7 +321,6 @@ void PolarArrangeTab::arrange()
referenceEllipse = SP_GENERICELLIPSE(item);
}
}
- tmp = tmp->next;
++count;
}
@@ -374,11 +372,10 @@ void PolarArrangeTab::arrange()
Geom::Point realCenter = Geom::Point(cx, cy) * transformation;
- tmp = items;
int i = 0;
- while(tmp)
+ for(std::vector<SPItem*>::const_iterator it=tmp.begin();it!=tmp.end();it++)
{
- SPItem *item = SP_ITEM(tmp->data);
+ SPItem *item = *it;
// Ignore the reference ellipse if any
if(item != referenceEllipse)
@@ -396,7 +393,6 @@ void PolarArrangeTab::arrange()
++i;
}
- tmp = tmp->next;
}
DocumentUndo::done(parent->getDesktop()->getDocument(), SP_VERB_SELECTION_ARRANGE,
diff --git a/src/ui/dialog/print.cpp b/src/ui/dialog/print.cpp
index ad979b570..c44d645a5 100644
--- a/src/ui/dialog/print.cpp
+++ b/src/ui/dialog/print.cpp
@@ -81,7 +81,7 @@ static void draw_page(
width, height,
(unsigned long)(Inkscape::Util::Quantity::convert(width, "px", "in") * dpi),
(unsigned long)(Inkscape::Util::Quantity::convert(height, "px", "in") * dpi),
- dpi, dpi, bgcolor, NULL, NULL, true, NULL);
+ dpi, dpi, bgcolor, NULL, NULL, true, std::vector<SPItem*>());
// This doesn't seem to work:
//context->set_cairo_context ( Cairo::Context::create (Cairo::ImageSurface::create_from_png (tmp_png) ), dpi, dpi );
diff --git a/src/ui/dialog/spellcheck.h b/src/ui/dialog/spellcheck.h
index 27b89e34e..e98a9d80e 100644
--- a/src/ui/dialog/spellcheck.h
+++ b/src/ui/dialog/spellcheck.h
@@ -16,10 +16,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/button.h>
#include <gtkmm/buttonbox.h>
diff --git a/src/ui/dialog/svg-fonts-dialog.cpp b/src/ui/dialog/svg-fonts-dialog.cpp
index bc228633d..12b423602 100644
--- a/src/ui/dialog/svg-fonts-dialog.cpp
+++ b/src/ui/dialog/svg-fonts-dialog.cpp
@@ -524,7 +524,7 @@ void SvgFontsDialog::set_glyph_description_from_selected_path(){
return;
}
- Inkscape::XML::Node* node = (Inkscape::XML::Node*) g_slist_nth_data((GSList *)sel->reprList(), 0);
+ Inkscape::XML::Node* node = sel->reprList().front();
if (!node) return;//TODO: should this be an assert?
if (!node->matchAttributeName("d") || !node->attribute("d")){
char *msg = _("The selected object does not have a <b>path</b> description.");
@@ -566,7 +566,7 @@ void SvgFontsDialog::missing_glyph_description_from_selected_path(){
return;
}
- Inkscape::XML::Node* node = (Inkscape::XML::Node*) g_slist_nth_data((GSList *)sel->reprList(), 0);
+ Inkscape::XML::Node* node = sel->reprList().front();
if (!node) return;//TODO: should this be an assert?
if (!node->matchAttributeName("d") || !node->attribute("d")){
char *msg = _("The selected object does not have a <b>path</b> description.");
diff --git a/src/ui/dialog/swatches.cpp b/src/ui/dialog/swatches.cpp
index 8759039c3..72677c07e 100644
--- a/src/ui/dialog/swatches.cpp
+++ b/src/ui/dialog/swatches.cpp
@@ -123,10 +123,10 @@ static void editGradientImpl( SPDesktop* desktop, SPGradient* gr )
bool shown = false;
if ( desktop && desktop->doc() ) {
Inkscape::Selection *selection = desktop->getSelection();
- GSList const *items = selection->itemList();
- if (items) {
+ std::vector<SPItem*> const items = selection->itemList();
+ if (!items.empty()) {
SPStyle query( desktop->doc() );
- int result = objects_query_fillstroke(const_cast<GSList *>(items), &query, true);
+ int result = objects_query_fillstroke((items), &query, true);
if ( (result == QUERY_STYLE_MULTIPLE_SAME) || (result == QUERY_STYLE_SINGLE) ) {
// could be pertinent
if (query.fill.isPaintserver()) {
diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp
index eeb4d6cbe..06c17611f 100644
--- a/src/ui/dialog/symbols.cpp
+++ b/src/ui/dialog/symbols.cpp
@@ -18,10 +18,6 @@
#include <functional>
#include <sstream>
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/buttonbox.h>
#include <gtkmm/label.h>
diff --git a/src/ui/dialog/tags.cpp b/src/ui/dialog/tags.cpp
index 7d3edaffb..ed71c826f 100644
--- a/src/ui/dialog/tags.cpp
+++ b/src/ui/dialog/tags.cpp
@@ -352,9 +352,10 @@ void TagsPanel::_objectsSelected( Selection *sel ) {
_selectedConnection.block();
_tree.get_selection()->unselect_all();
- for (const GSList * iter = sel->list(); iter != NULL; iter = iter->next)
+ std::vector<SPObject*> tmp=sel->list();
+ for(std::vector<SPObject*>::const_iterator i=tmp.begin();i!=tmp.end();i++)
{
- SPObject *obj = reinterpret_cast<SPObject *>(iter->data);
+ SPObject *obj = *i;
_store->foreach(sigc::bind<SPObject *>( sigc::mem_fun(*this, &TagsPanel::_checkForSelected), obj));
}
_selectedConnection.unblock();
@@ -649,9 +650,9 @@ bool TagsPanel::_handleButtonEvent(GdkEventButton* event)
if (col == _tree.get_column(COL_ADD - 1) && down_at_add) {
if (SP_IS_TAG(obj)) {
bool wasadded = false;
- for (const GSList * iter = _desktop->selection->itemList(); iter != NULL; iter = iter->next)
- {
- SPObject *newobj = reinterpret_cast<SPObject *>(iter->data);
+ std::vector<SPItem*> items=_desktop->selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ SPObject *newobj = *i;
bool addchild = true;
for ( SPObject *child = obj->children; child != NULL; child = child->next) {
if (SP_IS_TAG_USE(child) && SP_TAG_USE(child)->ref->getObject() == newobj) {
diff --git a/src/ui/dialog/text-edit.cpp b/src/ui/dialog/text-edit.cpp
index a8be8b543..815aa12ef 100644
--- a/src/ui/dialog/text-edit.cpp
+++ b/src/ui/dialog/text-edit.cpp
@@ -418,12 +418,11 @@ SPItem *TextEdit::getSelectedTextItem (void)
if (!SP_ACTIVE_DESKTOP)
return NULL;
- for (const GSList *item = SP_ACTIVE_DESKTOP->getSelection()->itemList();
- item != NULL;
- item = item->next)
+ std::vector<SPItem*> tmp=SP_ACTIVE_DESKTOP->getSelection()->itemList();
+ for(std::vector<SPItem*>::const_iterator i=tmp.begin();i!=tmp.end();i++)
{
- if (SP_IS_TEXT(item->data) || SP_IS_FLOWTEXT(item->data))
- return SP_ITEM (item->data);
+ if (SP_IS_TEXT(*i) || SP_IS_FLOWTEXT(*i))
+ return *i;
}
return NULL;
@@ -437,11 +436,10 @@ unsigned TextEdit::getSelectedTextCount (void)
unsigned int items = 0;
- for (const GSList *item = SP_ACTIVE_DESKTOP->getSelection()->itemList();
- item != NULL;
- item = item->next)
+ std::vector<SPItem*> tmp=SP_ACTIVE_DESKTOP->getSelection()->itemList();
+ for(std::vector<SPItem*>::const_iterator i=tmp.begin();i!=tmp.end();i++)
{
- if (SP_IS_TEXT(item->data) || SP_IS_FLOWTEXT(item->data))
+ if (SP_IS_TEXT(*i) || SP_IS_FLOWTEXT(*i))
++items;
}
@@ -542,20 +540,20 @@ void TextEdit::onApply()
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
unsigned items = 0;
- const GSList *item_list = desktop->getSelection()->itemList();
+ const std::vector<SPItem*> item_list = desktop->getSelection()->itemList();
SPCSSAttr *css = fillTextStyle ();
sp_desktop_set_style(desktop, css, true);
- for (; item_list != NULL; item_list = item_list->next) {
+ for(std::vector<SPItem*>::const_iterator i=item_list.begin();i!=item_list.end();i++){
// apply style to the reprs of all text objects in the selection
- if (SP_IS_TEXT (item_list->data)) {
+ if (SP_IS_TEXT (*i)) {
// backwards compatibility:
- reinterpret_cast<SPObject*>(item_list->data)->getRepr()->setAttribute("sodipodi:linespacing", sp_repr_css_property (css, "line-height", NULL));
+ (*i)->getRepr()->setAttribute("sodipodi:linespacing", sp_repr_css_property (css, "line-height", NULL));
++items;
}
- else if (SP_IS_FLOWTEXT (item_list->data))
+ else if (SP_IS_FLOWTEXT (*i))
// no need to set sodipodi:linespacing, because Inkscape never supported it on flowtext
++items;
}
diff --git a/src/ui/dialog/text-edit.h b/src/ui/dialog/text-edit.h
index 8683d80a3..117ad2e28 100644
--- a/src/ui/dialog/text-edit.h
+++ b/src/ui/dialog/text-edit.h
@@ -22,10 +22,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/notebook.h>
#include <gtkmm/button.h>
diff --git a/src/ui/dialog/tile.h b/src/ui/dialog/tile.h
index 2f75a8922..de1d3028b 100644
--- a/src/ui/dialog/tile.h
+++ b/src/ui/dialog/tile.h
@@ -20,10 +20,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/notebook.h>
#include <gtkmm/checkbutton.h>
diff --git a/src/ui/dialog/transformation.cpp b/src/ui/dialog/transformation.cpp
index 233d99750..498ad7822 100644
--- a/src/ui/dialog/transformation.cpp
+++ b/src/ui/dialog/transformation.cpp
@@ -15,10 +15,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/dialog.h>
#include <gtkmm/stock.h>
#include <2geom/transforms.h>
@@ -655,7 +651,7 @@ void Transformation::updatePageTransform(Inkscape::Selection *selection)
{
if (selection && !selection->isEmpty()) {
if (_check_replace_matrix.get_active()) {
- Geom::Affine current (SP_ITEM(selection->itemList()->data)->transform); // take from the first item in selection
+ Geom::Affine current (selection->itemList()[0]->transform); // take from the first item in selection
Geom::Affine new_displayed = current;
@@ -740,20 +736,19 @@ void Transformation::applyPageMove(Inkscape::Selection *selection)
if (_check_move_relative.get_active()) {
// shift each object relatively to the previous one
- using Inkscape::Util::GSListConstIterator;
- std::list<SPItem *> selected;
- selected.insert<GSListConstIterator<SPItem *> >(selected.end(), selection->itemList(), NULL);
+ std::vector<SPItem*> selected(selection->itemList());
if (selected.empty()) return;
if (fabs(x) > 1e-6) {
std::vector< BBoxSort > sorted;
- for (std::list<SPItem *>::iterator it(selected.begin());
+ for (std::vector<SPItem*>::iterator it(selected.begin());
it != selected.end();
++it)
{
- Geom::OptRect bbox = (*it)->desktopPreferredBounds();
+ SPItem* item = *it;
+ Geom::OptRect bbox = item->desktopPreferredBounds();
if (bbox) {
- sorted.push_back(BBoxSort(*it, *bbox, Geom::X, x > 0? 1. : 0., x > 0? 0. : 1.));
+ sorted.push_back(BBoxSort(item, *bbox, Geom::X, x > 0? 1. : 0., x > 0? 0. : 1.));
}
}
//sort bbox by anchors
@@ -771,13 +766,14 @@ void Transformation::applyPageMove(Inkscape::Selection *selection)
}
if (fabs(y) > 1e-6) {
std::vector< BBoxSort > sorted;
- for (std::list<SPItem *>::iterator it(selected.begin());
+ for (std::vector<SPItem*>::iterator it(selected.begin());
it != selected.end();
++it)
{
- Geom::OptRect bbox = (*it)->desktopPreferredBounds();
+ SPItem* item = *it;
+ Geom::OptRect bbox = item->desktopPreferredBounds();
if (bbox) {
- sorted.push_back(BBoxSort(*it, *bbox, Geom::Y, y > 0? 1. : 0., y > 0? 0. : 1.));
+ sorted.push_back(BBoxSort(item, *bbox, Geom::Y, y > 0? 1. : 0., y > 0? 0. : 1.));
}
}
//sort bbox by anchors
@@ -815,8 +811,9 @@ void Transformation::applyPageScale(Inkscape::Selection *selection)
bool transform_stroke = prefs->getBool("/options/transform/stroke", true);
bool preserve = prefs->getBool("/options/preservetransform/value", false);
if (prefs->getBool("/dialogs/transformation/applyseparately")) {
- for (GSList const *l = selection->itemList(); l != NULL; l = l->next) {
- SPItem *item = SP_ITEM(l->data);
+ std::vector<SPItem*> tmp=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=tmp.begin();i!=tmp.end();i++){
+ SPItem *item = *i;
Geom::OptRect bbox_pref = item->desktopPreferredBounds();
Geom::OptRect bbox_geom = item->desktopGeometricBounds();
if (bbox_pref && bbox_geom) {
@@ -878,8 +875,9 @@ void Transformation::applyPageRotate(Inkscape::Selection *selection)
}
if (prefs->getBool("/dialogs/transformation/applyseparately")) {
- for (GSList const *l = selection->itemList(); l != NULL; l = l->next) {
- SPItem *item = SP_ITEM(l->data);
+ std::vector<SPItem*> tmp=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=tmp.begin();i!=tmp.end();i++){
+ SPItem *item = *i;
sp_item_rotate_rel(item, Geom::Rotate (angle*M_PI/180.0));
}
} else {
@@ -897,8 +895,9 @@ void Transformation::applyPageSkew(Inkscape::Selection *selection)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
if (prefs->getBool("/dialogs/transformation/applyseparately")) {
- for (GSList const *l = selection->itemList(); l != NULL; l = l->next) {
- SPItem *item = SP_ITEM(l->data);
+ std::vector<SPItem*> items=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i = items.begin();i!=items.end();i++){
+ SPItem *item = *i;
if (!_units_skew.isAbsolute()) { // percentage
double skewX = _scalar_skew_horizontal.getValue("%");
@@ -998,10 +997,11 @@ void Transformation::applyPageTransform(Inkscape::Selection *selection)
}
if (_check_replace_matrix.get_active()) {
- for (GSList const *l = selection->itemList(); l != NULL; l = l->next) {
- SPItem *item = SP_ITEM(l->data);
+ std::vector<SPItem*> tmp=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=tmp.begin();i!=tmp.end();i++){
+ SPItem *item = *i;
item->set_item_transform(displayed);
- SP_OBJECT(item)->updateRepr();
+ item->updateRepr();
}
} else {
sp_selection_apply_affine(selection, displayed); // post-multiply each object's transform
@@ -1150,7 +1150,7 @@ void Transformation::onReplaceMatrixToggled()
double f = _scalar_transform_f.getValue();
Geom::Affine displayed (a, b, c, d, e, f);
- Geom::Affine current = SP_ITEM(selection->itemList()->data)->transform; // take from the first item in selection
+ Geom::Affine current = selection->itemList()[0]->transform; // take from the first item in selection
Geom::Affine new_displayed;
if (_check_replace_matrix.get_active()) {
diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp
index 87438ac01..a129d4b92 100644
--- a/src/ui/interface.cpp
+++ b/src/ui/interface.cpp
@@ -439,7 +439,7 @@ sp_ui_dialog_title_string(Inkscape::Verb *verb, gchar *c)
gchar* key = sp_shortcut_get_label(shortcut);
s = g_stpcpy(s, " (");
s = g_stpcpy(s, key);
- s = g_stpcpy(s, ")");
+ g_stpcpy(s, ")");
g_free(key);
}
}
@@ -1906,11 +1906,10 @@ void ContextMenu::ActivateGroup(void)
void ContextMenu::ActivateUngroup(void)
{
- GSList *children = NULL;
+ std::vector<SPItem*> children;
- sp_item_group_ungroup(static_cast<SPGroup*>(_item), &children);
+ sp_item_group_ungroup(static_cast<SPGroup*>(_item), children);
_desktop->selection->setList(children);
- g_slist_free(children);
}
void ContextMenu::MakeAnchorMenu(void)
@@ -1959,10 +1958,9 @@ void ContextMenu::AnchorLinkFollow(void)
void ContextMenu::AnchorLinkRemove(void)
{
- GSList *children = NULL;
- sp_item_group_ungroup(static_cast<SPAnchor*>(_item), &children, false);
+ std::vector<SPItem*> children;
+ sp_item_group_ungroup(static_cast<SPAnchor*>(_item), children, false);
DocumentUndo::done(_desktop->doc(), SP_VERB_NONE, _("Remove link"));
- g_slist_free(children);
}
void ContextMenu::MakeImageMenu (void)
@@ -2051,8 +2049,6 @@ void ContextMenu::ImageEdit(void)
_desktop->selection->set(_item);
}
- GSList const *selected = _desktop->selection->itemList();
-
GError* errThing = 0;
Glib::ustring cmdline = getImageEditorName();
Glib::ustring name;
@@ -2079,8 +2075,9 @@ void ContextMenu::ImageEdit(void)
}
#endif
- for (GSList const *iter = selected; iter != NULL; iter = iter->next) {
- Inkscape::XML::Node *ir = SP_ITEM(iter->data)->getRepr();
+ std::vector<SPItem*> itemlist=_desktop->selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ Inkscape::XML::Node *ir = (*i)->getRepr();
const gchar *href = ir->attribute("xlink:href");
if (strncmp (href,"file:",5) == 0) {
diff --git a/src/ui/previewholder.h b/src/ui/previewholder.h
index f9f923be4..f6d1985cc 100644
--- a/src/ui/previewholder.h
+++ b/src/ui/previewholder.h
@@ -16,10 +16,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/bin.h>
diff --git a/src/ui/tools/box3d-tool.cpp b/src/ui/tools/box3d-tool.cpp
index 538e0c7e2..27e755add 100644
--- a/src/ui/tools/box3d-tool.cpp
+++ b/src/ui/tools/box3d-tool.cpp
@@ -165,7 +165,7 @@ bool Box3dTool::item_handler(SPItem* item, GdkEvent* event) {
case GDK_BUTTON_PRESS:
if ( event->button.button == 1 && !this->space_panning) {
Inkscape::setup_for_drag_start(desktop, this, event);
- ret = TRUE;
+ //ret = TRUE;
}
break;
// motion and release are always on root (why?)
diff --git a/src/ui/tools/connector-tool.cpp b/src/ui/tools/connector-tool.cpp
index c3ef19507..0a36877ff 100644
--- a/src/ui/tools/connector-tool.cpp
+++ b/src/ui/tools/connector-tool.cpp
@@ -1303,12 +1303,12 @@ void cc_selection_set_avoid(bool const set_avoid)
Inkscape::Selection *selection = desktop->getSelection();
- GSList *l = const_cast<GSList *>(selection->itemList());
int changes = 0;
- while (l) {
- SPItem *item = SP_ITEM(l->data);
+ std::vector<SPItem*> l = selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=l.begin();i!=l.end();i++) {
+ SPItem *item = *i;
char const *value = (set_avoid) ? "true" : NULL;
@@ -1317,8 +1317,6 @@ void cc_selection_set_avoid(bool const set_avoid)
item->avoidRef->handleSettingChange();
changes++;
}
-
- l = l->next;
}
if (changes == 0) {
diff --git a/src/ui/tools/eraser-tool.cpp b/src/ui/tools/eraser-tool.cpp
index af0cbcb78..10f8c8694 100644
--- a/src/ui/tools/eraser-tool.cpp
+++ b/src/ui/tools/eraser-tool.cpp
@@ -666,8 +666,7 @@ void EraserTool::set_to_accumulated() {
Geom::OptRect eraserBbox = acid->visualBounds();
Geom::Rect bounds = (*eraserBbox) * desktop->doc2dt();
std::vector<SPItem*> remainingItems;
- GSList* toWorkOn = 0;
-
+ std::vector<SPItem*> toWorkOn;
if (selection->isEmpty()) {
if ( eraserMode ) {
toWorkOn = desktop->getDocument()->getItemsPartiallyInBox(desktop->dkey, bounds);
@@ -675,17 +674,16 @@ void EraserTool::set_to_accumulated() {
Inkscape::Rubberband *r = Inkscape::Rubberband::get(desktop);
toWorkOn = desktop->getDocument()->getItemsAtPoints(desktop->dkey, r->getPoints());
}
-
- toWorkOn = g_slist_remove( toWorkOn, acid );
+ toWorkOn.erase(std::remove(toWorkOn.begin(), toWorkOn.end(), acid), toWorkOn.end());
} else {
- toWorkOn = g_slist_copy(const_cast<GSList*>(selection->itemList()));
+ toWorkOn= selection->itemList();
wasSelection = true;
}
- if ( g_slist_length(toWorkOn) > 0 ) {
+ if ( !toWorkOn.empty() ) {
if ( eraserMode ) {
- for (GSList *i = toWorkOn ; i ; i = i->next ) {
- SPItem *item = SP_ITEM(i->data);
+ for (std::vector<SPItem*>::const_iterator i = toWorkOn.begin(); i != toWorkOn.end(); i++){
+ SPItem *item = *i;
if ( eraserMode ) {
Geom::OptRect bbox = item->visualBounds();
@@ -702,13 +700,10 @@ void EraserTool::set_to_accumulated() {
if ( !selection->isEmpty() ) {
// If the item was not completely erased, track the new remainder.
- GSList *nowSel = g_slist_copy(const_cast<GSList *>(selection->itemList()));
-
- for (GSList const *i2 = nowSel ; i2 ; i2 = i2->next ) {
- remainingItems.push_back(SP_ITEM(i2->data));
+ std::vector<SPItem*> nowSel(selection->itemList());
+ for (std::vector<SPItem*>::const_iterator i2 = nowSel.begin();i2!=nowSel.end();i2++) {
+ remainingItems.push_back(*i2);
}
-
- g_slist_free(nowSel);
}
} else {
remainingItems.push_back(item);
@@ -716,20 +711,18 @@ void EraserTool::set_to_accumulated() {
}
}
} else {
- for (GSList *i = toWorkOn ; i ; i = i->next ) {
- sp_object_ref( SP_ITEM(i->data), 0 );
+ for (std::vector<SPItem*> ::const_iterator i = toWorkOn.begin();i!=toWorkOn.end();i++) {
+ sp_object_ref( *i, 0 );
}
- for (GSList *i = toWorkOn ; i ; i = i->next ) {
- SPItem *item = SP_ITEM(i->data);
+ for (std::vector<SPItem*>::const_iterator i = toWorkOn.begin();i!=toWorkOn.end();i++) {
+ SPItem *item = *i;
item->deleteObject(true);
sp_object_unref(item);
workDone = true;
}
}
- g_slist_free(toWorkOn);
-
if ( !eraserMode ) {
//sp_selection_delete(desktop);
remainingItems.clear();
diff --git a/src/ui/tools/flood-tool.cpp b/src/ui/tools/flood-tool.cpp
index ffd41d97d..748c82717 100644
--- a/src/ui/tools/flood-tool.cpp
+++ b/src/ui/tools/flood-tool.cpp
@@ -932,7 +932,7 @@ static void sp_flood_do_flood_fill(ToolBase *event_context, GdkEvent *event, boo
std::deque<Geom::Point>::iterator start_sort = fill_queue.begin();
std::deque<Geom::Point>::iterator end_sort = fill_queue.begin();
unsigned int sort_y = (unsigned int)cp[Geom::Y];
- unsigned int current_y = sort_y;
+ unsigned int current_y;
for (std::deque<Geom::Point>::iterator i = fill_queue.begin(); i != fill_queue.end(); ++i) {
Geom::Point current = *i;
diff --git a/src/ui/tools/gradient-tool.cpp b/src/ui/tools/gradient-tool.cpp
index 61baa7d66..603458983 100644
--- a/src/ui/tools/gradient-tool.cpp
+++ b/src/ui/tools/gradient-tool.cpp
@@ -106,7 +106,7 @@ void GradientTool::selection_changed(Inkscape::Selection*) {
if (selection == NULL) {
return;
}
- guint n_obj = g_slist_length((GSList *) selection->itemList());
+ guint n_obj = selection->itemList().size();
if (!drag->isNonEmpty() || selection->isEmpty())
return;
@@ -492,10 +492,11 @@ bool GradientTool::root_handler(GdkEvent* event) {
if (over_line) {
// we take the first item in selection, because with doubleclick, the first click
// always resets selection to the single object under cursor
- sp_gradient_context_add_stop_near_point(this, SP_ITEM(selection->itemList()->data), this->mousepoint_doc, event->button.time);
+ sp_gradient_context_add_stop_near_point(this, SP_ITEM(selection->itemList().front()), this->mousepoint_doc, event->button.time);
} else {
- for (GSList const* i = selection->itemList(); i != NULL; i = i->next) {
- SPItem *item = SP_ITEM(i->data);
+ std::vector<SPItem*> items=selection->itemList();
+ for (std::vector<SPItem*>::const_iterator i = items.begin();i!=items.end();i++) {
+ SPItem *item = *i;
SPGradientType new_type = (SPGradientType) prefs->getInt("/tools/gradient/newgradient", SP_GRADIENT_TYPE_LINEAR);
Inkscape::PaintTarget fsmode = (prefs->getInt("/tools/gradient/newfillorstroke", 1) != 0) ? Inkscape::FOR_FILL : Inkscape::FOR_STROKE;
@@ -898,32 +899,32 @@ static void sp_gradient_drag(GradientTool &rc, Geom::Point const pt, guint /*sta
} else {
// Starting from empty space:
// Sort items so that the topmost comes last
- GSList *items = g_slist_copy ((GSList *) selection->itemList());
- items = g_slist_sort(items, (GCompareFunc) sp_item_repr_compare_position);
+ std::vector<SPItem*> items(selection->itemList());
+ sort(items.begin(),items.end(),sp_item_repr_compare_position);
// take topmost
- vector = sp_gradient_vector_for_object(document, desktop, SP_ITEM(g_slist_last(items)->data), fill_or_stroke);
- g_slist_free (items);
+ vector = sp_gradient_vector_for_object(document, desktop, SP_ITEM(items.back()), fill_or_stroke);
}
// HACK: reset fill-opacity - that 0.75 is annoying; BUT remove this when we have an opacity slider for all tabs
SPCSSAttr *css = sp_repr_css_attr_new();
sp_repr_css_set_property(css, "fill-opacity", "1.0");
- for (GSList const *i = selection->itemList(); i != NULL; i = i->next) {
+ std::vector<SPItem*> itemlist = selection->itemList();
+ for (std::vector<SPItem*>::const_iterator i = itemlist.begin();i!=itemlist.end();i++) {
//FIXME: see above
- sp_repr_css_change_recursive(SP_OBJECT(i->data)->getRepr(), css, "style");
+ sp_repr_css_change_recursive((*i)->getRepr(), css, "style");
- sp_item_set_gradient(SP_ITEM(i->data), vector, (SPGradientType) type, fill_or_stroke);
+ sp_item_set_gradient(*i, vector, (SPGradientType) type, fill_or_stroke);
if (type == SP_GRADIENT_TYPE_LINEAR) {
- sp_item_gradient_set_coords (SP_ITEM(i->data), POINT_LG_BEGIN, 0, rc.origin, fill_or_stroke, true, false);
- sp_item_gradient_set_coords (SP_ITEM(i->data), POINT_LG_END, 0, pt, fill_or_stroke, true, false);
+ sp_item_gradient_set_coords (*i, POINT_LG_BEGIN, 0, rc.origin, fill_or_stroke, true, false);
+ sp_item_gradient_set_coords (*i, POINT_LG_END, 0, pt, fill_or_stroke, true, false);
} else if (type == SP_GRADIENT_TYPE_RADIAL) {
- sp_item_gradient_set_coords (SP_ITEM(i->data), POINT_RG_CENTER, 0, rc.origin, fill_or_stroke, true, false);
- sp_item_gradient_set_coords (SP_ITEM(i->data), POINT_RG_R1, 0, pt, fill_or_stroke, true, false);
+ sp_item_gradient_set_coords (*i, POINT_RG_CENTER, 0, rc.origin, fill_or_stroke, true, false);
+ sp_item_gradient_set_coords (*i, POINT_RG_R1, 0, pt, fill_or_stroke, true, false);
}
- SP_OBJECT(i->data)->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ (*i)->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
if (ec->_grdrag) {
ec->_grdrag->updateDraggers();
@@ -932,7 +933,7 @@ static void sp_gradient_drag(GradientTool &rc, Geom::Point const pt, guint /*sta
ec->_grdrag->local_change = true;
// give the grab out-of-bounds values of xp/yp because we're already dragging
// and therefore are already out of tolerance
- ec->_grdrag->grabKnot (SP_ITEM(selection->itemList()->data),
+ ec->_grdrag->grabKnot (selection->itemList()[0],
type == SP_GRADIENT_TYPE_LINEAR? POINT_LG_END : POINT_RG_R1,
-1, // ignore number (though it is always 1)
fill_or_stroke, 99999, 99999, etime);
@@ -941,7 +942,7 @@ static void sp_gradient_drag(GradientTool &rc, Geom::Point const pt, guint /*sta
// status text; we do not track coords because this branch is run once, not all the time
// during drag
- int n_objects = g_slist_length((GSList *) selection->itemList());
+ int n_objects = selection->itemList().size();
rc.message_context->setF(Inkscape::NORMAL_MESSAGE,
ngettext("<b>Gradient</b> for %d object; with <b>Ctrl</b> to snap angle",
"<b>Gradient</b> for %d objects; with <b>Ctrl</b> to snap angle", n_objects),
diff --git a/src/ui/tools/lpe-tool.cpp b/src/ui/tools/lpe-tool.cpp
index c0517578d..13e47f3a6 100644
--- a/src/ui/tools/lpe-tool.cpp
+++ b/src/ui/tools/lpe-tool.cpp
@@ -396,10 +396,10 @@ lpetool_create_measuring_items(LpeTool *lc, Inkscape::Selection *selection)
SPCanvasGroup *tmpgrp = lc->desktop->getTempGroup();
gchar *arc_length;
double lengthval;
-
- for (GSList const *i = selection->itemList(); i != NULL; i = i->next) {
- if (SP_IS_PATH(i->data)) {
- path = SP_PATH(i->data);
+ std::vector<SPItem*> items=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ if (SP_IS_PATH(*i)) {
+ path = SP_PATH(*i);
curve = path->getCurve();
Geom::Piecewise<Geom::D2<Geom::SBasis> > pwd2 = paths_to_pw(curve->get_pathvector());
canvas_text = (SPCanvasText *) sp_canvastext_new(tmpgrp, lc->desktop, Geom::Point(0,0), "");
diff --git a/src/ui/tools/measure-tool.cpp b/src/ui/tools/measure-tool.cpp
index 0875c29e0..570f3e796 100644
--- a/src/ui/tools/measure-tool.cpp
+++ b/src/ui/tools/measure-tool.cpp
@@ -431,10 +431,10 @@ bool MeasureTool::root_handler(GdkEvent* event) {
// TODO switch to a different variable name. The single letter 'l' is easy to misread.
//select elements crossed by line segment:
- GSList *items = desktop->getDocument()->getItemsAtPoints(desktop->dkey, points);
+ std::vector<SPItem*> items = desktop->getDocument()->getItemsAtPoints(desktop->dkey, points);
std::vector<double> intersection_times;
- for (GSList *l = items; l != NULL; l = l->next) {
- SPItem *item = static_cast<SPItem*>(l->data);
+ for (std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++) {
+ SPItem *item = *i;
if (SP_IS_SHAPE(item)) {
calculate_intersections(desktop, item, lineseg, SP_SHAPE(item)->getCurve(), intersection_times);
diff --git a/src/ui/tools/mesh-tool.cpp b/src/ui/tools/mesh-tool.cpp
index 86d816e85..813d6ae5b 100644
--- a/src/ui/tools/mesh-tool.cpp
+++ b/src/ui/tools/mesh-tool.cpp
@@ -103,7 +103,7 @@ void MeshTool::selection_changed(Inkscape::Selection* /*sel*/) {
return;
}
- guint n_obj = g_slist_length((GSList *) selection->itemList());
+ guint n_obj = selection->itemList().size();
if (!drag->isNonEmpty() || selection->isEmpty()) {
return;
@@ -467,11 +467,12 @@ bool MeshTool::root_handler(GdkEvent* event) {
if (over_line) {
// We take the first item in selection, because with doubleclick, the first click
// always resets selection to the single object under cursor
- sp_mesh_context_split_near_point(this, SP_ITEM(selection->itemList()->data), this->mousepoint_doc, event->button.time);
+ sp_mesh_context_split_near_point(this, selection->itemList()[0], this->mousepoint_doc, event->button.time);
} else {
// Create a new gradient with default coordinates.
- for (GSList const* i = selection->itemList(); i != NULL; i = i->next) {
- SPItem *item = SP_ITEM(i->data);
+ std::vector<SPItem*> items=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ SPItem *item = *i;
SPGradientType new_type = SP_GRADIENT_TYPE_MESH;
Inkscape::PaintTarget fsmode = (prefs->getInt("/tools/gradient/newfillorstroke", 1) != 0) ? Inkscape::FOR_FILL : Inkscape::FOR_STROKE;
@@ -940,27 +941,27 @@ static void sp_mesh_drag(MeshTool &rc, Geom::Point const /*pt*/, guint /*state*/
} else {
// Starting from empty space:
// Sort items so that the topmost comes last
- GSList *items = g_slist_copy ((GSList *) selection->itemList());
- items = g_slist_sort(items, (GCompareFunc) sp_item_repr_compare_position);
+ std::vector<SPItem*> items(selection->itemList());
+ sort(items.begin(),items.end(),sp_item_repr_compare_position);
// take topmost
- vector = sp_gradient_vector_for_object(document, desktop, SP_ITEM(g_slist_last(items)->data), fill_or_stroke);
- g_slist_free (items);
+ vector = sp_gradient_vector_for_object(document, desktop, SP_ITEM(items.back()), fill_or_stroke);
}
// HACK: reset fill-opacity - that 0.75 is annoying; BUT remove this when we have an opacity slider for all tabs
SPCSSAttr *css = sp_repr_css_attr_new();
sp_repr_css_set_property(css, "fill-opacity", "1.0");
- for (GSList const *i = selection->itemList(); i != NULL; i = i->next) {
+ std::vector<SPItem*> items=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
//FIXME: see above
- sp_repr_css_change_recursive(SP_OBJECT(i->data)->getRepr(), css, "style");
+ sp_repr_css_change_recursive((*i)->getRepr(), css, "style");
- sp_item_set_gradient(SP_ITEM(i->data), vector, (SPGradientType) type, fill_or_stroke);
+ sp_item_set_gradient(*i, vector, (SPGradientType) type, fill_or_stroke);
// We don't need to do anything. Mesh is already sized appropriately.
- SP_OBJECT(i->data)->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ (*i)->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
// if (ec->_grdrag) {
// ec->_grdrag->updateDraggers();
@@ -978,7 +979,7 @@ static void sp_mesh_drag(MeshTool &rc, Geom::Point const /*pt*/, guint /*state*/
// status text; we do not track coords because this branch is run once, not all the time
// during drag
- int n_objects = g_slist_length((GSList *) selection->itemList());
+ int n_objects = selection->itemList().size();
rc.message_context->setF(Inkscape::NORMAL_MESSAGE,
ngettext("<b>Gradient</b> for %d object; with <b>Ctrl</b> to snap angle",
"<b>Gradient</b> for %d objects; with <b>Ctrl</b> to snap angle", n_objects),
diff --git a/src/ui/tools/node-tool.cpp b/src/ui/tools/node-tool.cpp
index a4b903960..ef00eaa40 100644
--- a/src/ui/tools/node-tool.cpp
+++ b/src/ui/tools/node-tool.cpp
@@ -410,10 +410,9 @@ void NodeTool::selection_changed(Inkscape::Selection *sel) {
std::set<ShapeRecord> shapes;
- GSList const *ilist = sel->itemList();
-
- for (GSList *i = const_cast<GSList*>(ilist); i; i = i->next) {
- SPObject *obj = static_cast<SPObject*>(i->data);
+ std::vector<SPItem*> items=sel->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ SPObject *obj = *i;
if (SP_IS_ITEM(obj)) {
gather_items(this, NULL, static_cast<SPItem*>(obj), SHAPE_ROLE_NORMAL, shapes);
@@ -658,9 +657,8 @@ void NodeTool::select_area(Geom::Rect const &sel, GdkEventButton *event) {
if (this->_multipath->empty()) {
// if multipath is empty, select rubberbanded items rather than nodes
Inkscape::Selection *selection = this->desktop->selection;
- GSList *items = this->desktop->getDocument()->getItemsInBox(this->desktop->dkey, sel);
+ std::vector<SPItem*> items = this->desktop->getDocument()->getItemsInBox(this->desktop->dkey, sel);
selection->setList(items);
- g_slist_free(items);
} else {
if (!held_shift(*event)) {
this->_selected_nodes->clear();
diff --git a/src/ui/tools/pen-tool.cpp b/src/ui/tools/pen-tool.cpp
index 3eb838089..38892517d 100644
--- a/src/ui/tools/pen-tool.cpp
+++ b/src/ui/tools/pen-tool.cpp
@@ -761,14 +761,12 @@ bool PenTool::_handleButtonRelease(GdkEventButton const &revent) {
}
}
this->state = PenTool::CONTROL;
- ret = true;
break;
case PenTool::CONTROL:
// End current segment
this->_endpointSnap(p, revent.state);
this->_finishSegment(p, revent.state);
this->state = PenTool::POINT;
- ret = true;
break;
case PenTool::CLOSE:
// End current segment
@@ -782,12 +780,10 @@ bool PenTool::_handleButtonRelease(GdkEventButton const &revent) {
}
this->_finish(true);
this->state = PenTool::POINT;
- ret = true;
break;
case PenTool::STOP:
// This is allowed, if we just canceled curve
this->state = PenTool::POINT;
- ret = true;
break;
default:
break;
@@ -822,7 +818,6 @@ bool PenTool::_handleButtonRelease(GdkEventButton const &revent) {
break;
}
this->state = PenTool::POINT;
- ret = true;
break;
default:
break;
@@ -1431,8 +1426,7 @@ void PenTool::_bsplineSpiroStartAnchorOn()
{
using Geom::X;
using Geom::Y;
- SPCurve *tmp_curve = new SPCurve();
- tmp_curve = this->sa->curve->copy();
+ SPCurve *tmp_curve = this->sa->curve->copy();
if(this->sa->start)
tmp_curve = tmp_curve ->create_reverse();
Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const*>(&*tmp_curve ->last_segment());
@@ -1464,8 +1458,7 @@ void PenTool::_bsplineSpiroStartAnchorOn()
void PenTool::_bsplineSpiroStartAnchorOff()
{
- SPCurve *tmp_curve = new SPCurve();
- tmp_curve = this->sa->curve->copy();
+ SPCurve *tmp_curve = this->sa->curve->copy();
if(this->sa->start)
tmp_curve = tmp_curve ->create_reverse();
Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const*>(&*tmp_curve ->last_segment());
@@ -1563,7 +1556,7 @@ void PenTool::_bsplineSpiroEndAnchorOn()
using Geom::Y;
this->p[2] = this->p[3] + (1./3)*(this->p[0] - this->p[3]);
this->p[2] = Geom::Point(this->p[2][X] + HANDLE_CUBIC_GAP,this->p[2][Y] + HANDLE_CUBIC_GAP);
- SPCurve *tmp_curve = new SPCurve();
+ SPCurve *tmp_curve;
SPCurve *last_segment = new SPCurve();
Geom::Point point_c(0,0);
bool reverse = false;
@@ -1620,7 +1613,7 @@ void PenTool::_bsplineSpiroEndAnchorOn()
void PenTool::_bsplineSpiroEndAnchorOff()
{
- SPCurve *tmp_curve = new SPCurve();
+ SPCurve *tmp_curve;
SPCurve *last_segment = new SPCurve();
bool reverse = false;
this->p[2] = this->p[3];
diff --git a/src/ui/tools/pencil-tool.cpp b/src/ui/tools/pencil-tool.cpp
index 008804162..ba103fa8e 100644
--- a/src/ui/tools/pencil-tool.cpp
+++ b/src/ui/tools/pencil-tool.cpp
@@ -357,7 +357,6 @@ bool PencilTool::_handleButtonRelease(GdkEventButton const &revent) {
// Ctrl+click creates a single point so only set context in ADDLINE mode when Ctrl isn't pressed
this->state = SP_PENCIL_CONTEXT_ADDLINE;
}
- ret = true;
break;
case SP_PENCIL_CONTEXT_ADDLINE:
/* Finish segment now */
@@ -371,7 +370,6 @@ bool PencilTool::_handleButtonRelease(GdkEventButton const &revent) {
this->_finishEndpoint();
this->state = SP_PENCIL_CONTEXT_IDLE;
sp_event_context_discard_delayed_snap_event(this);
- ret = true;
break;
case SP_PENCIL_CONTEXT_FREEHAND:
if (revent.state & GDK_MOD1_MASK) {
@@ -413,7 +411,6 @@ bool PencilTool::_handleButtonRelease(GdkEventButton const &revent) {
// reset sketch mode too
this->sketch_n = 0;
}
- ret = true;
break;
case SP_PENCIL_CONTEXT_SKETCH:
default:
diff --git a/src/ui/tools/rect-tool.cpp b/src/ui/tools/rect-tool.cpp
index 62a9006ea..844965c4d 100644
--- a/src/ui/tools/rect-tool.cpp
+++ b/src/ui/tools/rect-tool.cpp
@@ -143,7 +143,6 @@ bool RectTool::item_handler(SPItem* item, GdkEvent* event) {
case GDK_BUTTON_PRESS:
if ( event->button.button == 1 && !this->space_panning) {
Inkscape::setup_for_drag_start(desktop, this, event);
- ret = TRUE;
}
break;
// motion and release are always on root (why?)
diff --git a/src/ui/tools/select-tool.cpp b/src/ui/tools/select-tool.cpp
index 40b994968..f06b03d91 100644
--- a/src/ui/tools/select-tool.cpp
+++ b/src/ui/tools/select-tool.cpp
@@ -472,7 +472,7 @@ bool SelectTool::root_handler(GdkEvent* event) {
case GDK_2BUTTON_PRESS:
if (event->button.button == 1) {
if (!selection->isEmpty()) {
- SPItem *clicked_item = static_cast<SPItem *>(selection->itemList()->data);
+ SPItem *clicked_item = selection->itemList()[0];
if (dynamic_cast<SPGroup *>(clicked_item) && !dynamic_cast<SPBox3D *>(clicked_item)) { // enter group if it's not a 3D box
desktop->setCurrentLayer(clicked_item);
@@ -709,7 +709,7 @@ bool SelectTool::root_handler(GdkEvent* event) {
if (r->is_started() && !within_tolerance) {
// this was a rubberband drag
- GSList *items = NULL;
+ std::vector<SPItem*> items;
if (r->getMode() == RUBBERBAND_MODE_RECT) {
Geom::OptRect const b = r->getRectangle();
@@ -730,7 +730,6 @@ bool SelectTool::root_handler(GdkEvent* event) {
selection->setList (items);
}
- g_slist_free (items);
} else { // it was just a click, or a too small rubberband
r->stop();
@@ -778,7 +777,6 @@ bool SelectTool::root_handler(GdkEvent* event) {
}
rb_escaped = 0;
- ret = TRUE;
}
}
}
diff --git a/src/ui/tools/spray-tool.cpp b/src/ui/tools/spray-tool.cpp
index 0399b1e55..26d74733a 100644
--- a/src/ui/tools/spray-tool.cpp
+++ b/src/ui/tools/spray-tool.cpp
@@ -178,7 +178,7 @@ void SprayTool::update_cursor(bool /*with_shift*/) {
gchar *sel_message = NULL;
if (!desktop->selection->isEmpty()) {
- num = g_slist_length(const_cast<GSList *>(desktop->selection->itemList()));
+ num = desktop->selection->itemList().size();
sel_message = g_strdup_printf(ngettext("<b>%i</b> object selected","<b>%i</b> objects selected",num), num);
} else {
sel_message = g_strdup_printf("%s", _("<b>Nothing</b> selected"));
@@ -426,11 +426,9 @@ static bool sp_spray_recursive(SPDesktop *desktop,
SPItem *unionResult = NULL; // Previous union
int i=1;
- for (GSList *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
- items != NULL;
- items = items->next) {
-
- SPItem *item1 = dynamic_cast<SPItem *>(static_cast<SPObject *>(items->data));
+ std::vector<SPItem*> items=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator it=items.begin();it!=items.end();it++){
+ SPItem *item1 = *it;
if (i == 1) {
parent_item = item1;
}
@@ -544,20 +542,16 @@ static bool sp_spray_dilate(SprayTool *tc, Geom::Point /*event_p*/, Geom::Point
double move_standard_deviation = get_move_standard_deviation(tc);
{
- GSList *const original_selection = g_slist_copy(const_cast<GSList *>(selection->itemList()));
+ std::vector<SPItem*> const items(selection->itemList());
- for (GSList *items = original_selection;
- items != NULL;
- items = items->next) {
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(items->data));
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ SPItem *item = *i;
g_assert(item != NULL);
sp_object_ref(item);
}
- for (GSList *items = original_selection;
- items != NULL;
- items = items->next) {
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(items->data));
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ SPItem *item = *i;
g_assert(item != NULL);
if (is_transform_modes(tc->mode)) {
@@ -571,10 +565,8 @@ static bool sp_spray_dilate(SprayTool *tc, Geom::Point /*event_p*/, Geom::Point
}
}
- for (GSList *items = original_selection;
- items != NULL;
- items = items->next) {
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(items->data));
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ SPItem *item = *i;
g_assert(item != NULL);
sp_object_unref(item);
}
@@ -650,7 +642,7 @@ bool SprayTool::root_handler(GdkEvent* event) {
guint num = 0;
if (!desktop->selection->isEmpty()) {
- num = g_slist_length(const_cast<GSList *>(desktop->selection->itemList()));
+ num = desktop->selection->itemList().size();
}
if (num == 0) {
this->message_context->flash(Inkscape::ERROR_MESSAGE, _("<b>Nothing selected!</b> Select objects to spray."));
diff --git a/src/ui/tools/text-tool.cpp b/src/ui/tools/text-tool.cpp
index a2c0c81ae..1888551cf 100644
--- a/src/ui/tools/text-tool.cpp
+++ b/src/ui/tools/text-tool.cpp
@@ -1461,7 +1461,7 @@ int TextTool::_styleQueried(SPStyle *style, int property)
}
sp_text_context_validate_cursor_iterators(this);
- GSList *styles_list = NULL;
+ std::vector<SPItem*> styles_list;
Inkscape::Text::Layout::iterator begin_it, end_it;
if (this->text_sel_start < this->text_sel_end) {
@@ -1477,7 +1477,7 @@ int TextTool::_styleQueried(SPStyle *style, int property)
}
}
for (Inkscape::Text::Layout::iterator it = begin_it ; it < end_it ; it.nextStartOfSpan()) {
- SPObject const *pos_obj = 0;
+ SPObject *pos_obj = 0;
void *rawptr = 0;
layout->getSourceOfCharacter(it, &rawptr);
if (!rawptr || !SP_IS_OBJECT(rawptr)) {
@@ -1487,12 +1487,11 @@ int TextTool::_styleQueried(SPStyle *style, int property)
while (SP_IS_STRING(pos_obj) && pos_obj->parent) {
pos_obj = pos_obj->parent; // SPStrings don't have style
}
- styles_list = g_slist_prepend(styles_list, (gpointer)pos_obj);
+ styles_list.insert(styles_list.begin(),(SPItem*)pos_obj);
}
int result = sp_desktop_query_style_from_list (styles_list, style, property);
- g_slist_free(styles_list);
return result;
}
diff --git a/src/ui/tools/tool-base.cpp b/src/ui/tools/tool-base.cpp
index a07f2fb86..0f9b3ee7a 100644
--- a/src/ui/tools/tool-base.cpp
+++ b/src/ui/tools/tool-base.cpp
@@ -20,10 +20,6 @@
#include "widgets/desktop-widget.h"
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include "shortcuts.h"
#include "file.h"
#include "ui/tools/tool-base.h"
@@ -1178,11 +1174,9 @@ SPItem *sp_event_context_find_item(SPDesktop *desktop, Geom::Point const &p,
SPItem *
sp_event_context_over_item(SPDesktop *desktop, SPItem *item,
Geom::Point const &p) {
- GSList *temp = NULL;
- temp = g_slist_prepend(temp, item);
+ std::vector<SPItem*> temp;
+ temp.push_back(item);
SPItem *item_at_point = desktop->getItemFromListAtPointBottom(temp, p);
- g_slist_free(temp);
-
return item_at_point;
}
diff --git a/src/ui/tools/tweak-tool.cpp b/src/ui/tools/tweak-tool.cpp
index 80b52fba6..76b52f9be 100644
--- a/src/ui/tools/tweak-tool.cpp
+++ b/src/ui/tools/tweak-tool.cpp
@@ -153,7 +153,7 @@ void TweakTool::update_cursor (bool with_shift) {
gchar *sel_message = NULL;
if (!desktop->selection->isEmpty()) {
- num = g_slist_length(const_cast<GSList *>(desktop->selection->itemList()));
+ num = desktop->selection->itemList().size();
sel_message = g_strdup_printf(ngettext("<b>%i</b> object selected","<b>%i</b> objects selected",num), num);
} else {
sel_message = g_strdup_printf("%s", _("<b>Nothing</b> selected"));
@@ -372,14 +372,13 @@ sp_tweak_dilate_recursive (Inkscape::Selection *selection, SPItem *item, Geom::P
}
if (dynamic_cast<SPText *>(item) || dynamic_cast<SPFlowtext *>(item)) {
- GSList *items = g_slist_prepend (NULL, item);
- GSList *selected = NULL;
- GSList *to_select = NULL;
+ std::vector<SPItem*> items;
+ items.push_back(item);
+ std::vector<SPItem*> selected;
+ std::vector<Inkscape::XML::Node*> to_select;
SPDocument *doc = item->document;
- sp_item_list_to_curves (items, &selected, &to_select);
- g_slist_free (items);
- SPObject* newObj = doc->getObjectByRepr(static_cast<Inkscape::XML::Node *>(to_select->data));
- g_slist_free (to_select);
+ sp_item_list_to_curves (items, selected, to_select);
+ SPObject* newObj = doc->getObjectByRepr(to_select[0]);
item = dynamic_cast<SPItem *>(newObj);
g_assert(item != NULL);
selection->add(item);
@@ -1078,11 +1077,9 @@ sp_tweak_dilate (TweakTool *tc, Geom::Point event_p, Geom::Point p, Geom::Point
double move_force = get_move_force(tc);
double color_force = MIN(sqrt(path_force)/20.0, 1);
- for (GSList *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
- items != NULL;
- items = items->next) {
-
- SPItem *item = dynamic_cast<SPItem *>(static_cast<SPObject *>(items->data));
+ std::vector<SPItem*> items=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ SPItem *item = *i;
if (is_color_mode (tc->mode)) {
if (do_fill || do_stroke || do_opacity) {
@@ -1189,7 +1186,7 @@ bool TweakTool::root_handler(GdkEvent* event) {
guint num = 0;
if (!desktop->selection->isEmpty()) {
- num = g_slist_length(const_cast<GSList *>(desktop->selection->itemList()));
+ num = desktop->selection->itemList().size();
}
if (num == 0) {
this->message_context->flash(Inkscape::ERROR_MESSAGE, _("<b>Nothing selected!</b> Select objects to tweak."));
diff --git a/src/ui/widget/addtoicon.cpp b/src/ui/widget/addtoicon.cpp
index f15d7abf7..823e24a00 100644
--- a/src/ui/widget/addtoicon.cpp
+++ b/src/ui/widget/addtoicon.cpp
@@ -12,10 +12,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-# include <glibmm/threads.h>
-#endif
-
#include "ui/widget/addtoicon.h"
#include <gtkmm/icontheme.h>
diff --git a/src/ui/widget/button.h b/src/ui/widget/button.h
index 471b7d8a2..d3c9afa02 100644
--- a/src/ui/widget/button.h
+++ b/src/ui/widget/button.h
@@ -10,14 +10,6 @@
#ifndef INKSCAPE_UI_WIDGET_BUTTON_H
#define INKSCAPE_UI_WIDGET_BUTTON_H
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/checkbutton.h>
#include <gtkmm/radiobutton.h>
diff --git a/src/ui/widget/clipmaskicon.cpp b/src/ui/widget/clipmaskicon.cpp
index 943b1bebc..421f1df1e 100644
--- a/src/ui/widget/clipmaskicon.cpp
+++ b/src/ui/widget/clipmaskicon.cpp
@@ -11,10 +11,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-# include <glibmm/threads.h>
-#endif
-
#include "ui/widget/clipmaskicon.h"
#include <gtkmm/icontheme.h>
diff --git a/src/ui/widget/color-picker.h b/src/ui/widget/color-picker.h
index b4da5dbf2..99904b081 100644
--- a/src/ui/widget/color-picker.h
+++ b/src/ui/widget/color-picker.h
@@ -13,16 +13,8 @@
#ifndef __COLOR_PICKER_H__
#define __COLOR_PICKER_H__
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
#include <stddef.h>
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/dialog.h>
#include <gtkmm/button.h>
#include <sigc++/sigc++.h>
diff --git a/src/ui/widget/color-preview.h b/src/ui/widget/color-preview.h
index 959b5e09b..caddfb9a2 100644
--- a/src/ui/widget/color-preview.h
+++ b/src/ui/widget/color-preview.h
@@ -15,10 +15,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/widget.h>
namespace Inkscape {
diff --git a/src/ui/widget/dock-item.h b/src/ui/widget/dock-item.h
index cc0c13eea..25a69d94c 100644
--- a/src/ui/widget/dock-item.h
+++ b/src/ui/widget/dock-item.h
@@ -15,10 +15,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/frame.h>
#include <gtkmm/window.h>
diff --git a/src/ui/widget/dock.h b/src/ui/widget/dock.h
index 33e60b836..74b072d22 100644
--- a/src/ui/widget/dock.h
+++ b/src/ui/widget/dock.h
@@ -12,14 +12,6 @@
#ifndef INKSCAPE_UI_WIDGET_DOCK_H
#define INKSCAPE_UI_WIDGET_DOCK_H
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <list>
#include "ui/widget/dock-item.h"
diff --git a/src/ui/widget/entity-entry.cpp b/src/ui/widget/entity-entry.cpp
index c7d5efe29..69173fa25 100644
--- a/src/ui/widget/entity-entry.cpp
+++ b/src/ui/widget/entity-entry.cpp
@@ -17,10 +17,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/scrolledwindow.h>
#include <gtkmm/entry.h>
diff --git a/src/ui/widget/filter-effect-chooser.h b/src/ui/widget/filter-effect-chooser.h
index 6092c61a5..0bcf97433 100644
--- a/src/ui/widget/filter-effect-chooser.h
+++ b/src/ui/widget/filter-effect-chooser.h
@@ -12,14 +12,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/combobox.h>
diff --git a/src/ui/widget/frame.h b/src/ui/widget/frame.h
index 55638ad40..a04666651 100644
--- a/src/ui/widget/frame.h
+++ b/src/ui/widget/frame.h
@@ -10,14 +10,6 @@
#ifndef INKSCAPE_UI_WIDGET_FRAME_H
#define INKSCAPE_UI_WIDGET_FRAME_H
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/alignment.h>
#include <gtkmm/frame.h>
#include <gtkmm/label.h>
diff --git a/src/ui/widget/imageicon.h b/src/ui/widget/imageicon.h
index 8faf13cb1..2ea8b8533 100644
--- a/src/ui/widget/imageicon.h
+++ b/src/ui/widget/imageicon.h
@@ -12,14 +12,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <glibmm/ustring.h>
diff --git a/src/ui/widget/imagetoggler.h b/src/ui/widget/imagetoggler.h
index df6eb7ded..7b02fa4dc 100644
--- a/src/ui/widget/imagetoggler.h
+++ b/src/ui/widget/imagetoggler.h
@@ -14,10 +14,6 @@
#include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/cellrendererpixbuf.h>
#include <gtkmm/widget.h>
#include <glibmm/property.h>
diff --git a/src/ui/widget/insertordericon.h b/src/ui/widget/insertordericon.h
index fb3412d3f..bf8ac4fa7 100644
--- a/src/ui/widget/insertordericon.h
+++ b/src/ui/widget/insertordericon.h
@@ -13,10 +13,11 @@
# include "config.h"
#endif
-#include <glibmm.h>
#include <gtkmm/cellrendererpixbuf.h>
#include <gtkmm/widget.h>
+#include <glibmm/property.h>
+
namespace Inkscape {
namespace UI {
namespace Widget {
diff --git a/src/ui/widget/labelled.h b/src/ui/widget/labelled.h
index 5334454bc..88eb3ce19 100644
--- a/src/ui/widget/labelled.h
+++ b/src/ui/widget/labelled.h
@@ -11,14 +11,6 @@
#ifndef INKSCAPE_UI_WIDGET_LABELLED_H
#define INKSCAPE_UI_WIDGET_LABELLED_H
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
namespace Gtk {
diff --git a/src/ui/widget/layertypeicon.cpp b/src/ui/widget/layertypeicon.cpp
index 3d6182bf8..672c607e5 100644
--- a/src/ui/widget/layertypeicon.cpp
+++ b/src/ui/widget/layertypeicon.cpp
@@ -11,10 +11,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-# include <glibmm/threads.h>
-#endif
-
#include "ui/widget/layertypeicon.h"
#include <gtkmm/icontheme.h>
diff --git a/src/ui/widget/licensor.h b/src/ui/widget/licensor.h
index c75c5fe9e..b96162589 100644
--- a/src/ui/widget/licensor.h
+++ b/src/ui/widget/licensor.h
@@ -10,14 +10,6 @@
#ifndef INKSCAPE_UI_WIDGET_LICENSOR_H
#define INKSCAPE_UI_WIDGET_LICENSOR_H
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
class SPDocument;
diff --git a/src/ui/widget/notebook-page.h b/src/ui/widget/notebook-page.h
index 4f7915423..c11de1b5b 100644
--- a/src/ui/widget/notebook-page.h
+++ b/src/ui/widget/notebook-page.h
@@ -14,10 +14,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
namespace Gtk {
diff --git a/src/ui/widget/object-composite-settings.cpp b/src/ui/widget/object-composite-settings.cpp
index 00a74c4fe..8acf083d0 100644
--- a/src/ui/widget/object-composite-settings.cpp
+++ b/src/ui/widget/object-composite-settings.cpp
@@ -125,7 +125,8 @@ ObjectCompositeSettings::_blendBlurValueChanged()
const Glib::ustring blendmode = _fe_cb.get_blend_mode();
//apply created filter to every selected item
- for (StyleSubject::iterator i = _subject->begin() ; i != _subject->end() ; ++i ) {
+ std::vector<SPObject*> sel=_subject->list();
+ for (std::vector<SPObject*>::const_iterator i = sel.begin() ; i != sel.end() ; ++i ) {
if (!SP_IS_ITEM(*i)) {
continue;
}
diff --git a/src/ui/widget/object-composite-settings.h b/src/ui/widget/object-composite-settings.h
index 5a723a2fd..ae16564e1 100644
--- a/src/ui/widget/object-composite-settings.h
+++ b/src/ui/widget/object-composite-settings.h
@@ -11,14 +11,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/alignment.h>
#include <gtkmm/adjustment.h>
diff --git a/src/ui/widget/panel.cpp b/src/ui/widget/panel.cpp
index 0cff25d88..8a1e98a63 100644
--- a/src/ui/widget/panel.cpp
+++ b/src/ui/widget/panel.cpp
@@ -15,10 +15,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/dialog.h> // for Gtk::RESPONSE_*
#include <gtkmm/menu.h>
#include <gtkmm/stock.h>
diff --git a/src/ui/widget/panel.h b/src/ui/widget/panel.h
index 5680cac30..a90060e17 100644
--- a/src/ui/widget/panel.h
+++ b/src/ui/widget/panel.h
@@ -17,10 +17,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/arrow.h>
#include <gtkmm/button.h>
diff --git a/src/ui/widget/preferences-widget.cpp b/src/ui/widget/preferences-widget.cpp
index 98028ed78..72597e4d9 100644
--- a/src/ui/widget/preferences-widget.cpp
+++ b/src/ui/widget/preferences-widget.cpp
@@ -14,10 +14,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/frame.h>
#include <gtkmm/alignment.h>
diff --git a/src/ui/widget/preferences-widget.h b/src/ui/widget/preferences-widget.h
index 5d9816e74..8b75b8368 100644
--- a/src/ui/widget/preferences-widget.h
+++ b/src/ui/widget/preferences-widget.h
@@ -22,10 +22,6 @@
#include <iostream>
#include <vector>
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/filechooserbutton.h>
#include "ui/widget/spinbutton.h"
#include <stddef.h>
diff --git a/src/ui/widget/rotateable.cpp b/src/ui/widget/rotateable.cpp
index 2d7597d7c..5e938dee6 100644
--- a/src/ui/widget/rotateable.cpp
+++ b/src/ui/widget/rotateable.cpp
@@ -11,10 +11,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/eventbox.h>
#include <glibmm/i18n.h>
diff --git a/src/ui/widget/selected-style.h b/src/ui/widget/selected-style.h
index 0b6a14762..804a6fef6 100644
--- a/src/ui/widget/selected-style.h
+++ b/src/ui/widget/selected-style.h
@@ -15,10 +15,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#if WITH_GTKMM_3_0
diff --git a/src/ui/widget/spin-scale.h b/src/ui/widget/spin-scale.h
index d0447e4a6..50e4fc953 100644
--- a/src/ui/widget/spin-scale.h
+++ b/src/ui/widget/spin-scale.h
@@ -13,10 +13,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/adjustment.h>
#include <gtkmm/box.h>
#include <gtkmm/scale.h>
diff --git a/src/ui/widget/spin-slider.h b/src/ui/widget/spin-slider.h
index 74982ea58..a5999f14f 100644
--- a/src/ui/widget/spin-slider.h
+++ b/src/ui/widget/spin-slider.h
@@ -14,10 +14,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/adjustment.h>
#include <gtkmm/box.h>
#include <gtkmm/scale.h>
diff --git a/src/ui/widget/spinbutton.h b/src/ui/widget/spinbutton.h
index cbe33e8ea..30ffc7d77 100644
--- a/src/ui/widget/spinbutton.h
+++ b/src/ui/widget/spinbutton.h
@@ -10,14 +10,6 @@
#ifndef INKSCAPE_UI_WIDGET_SPINBUTTON_H
#define INKSCAPE_UI_WIDGET_SPINBUTTON_H
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/spinbutton.h>
namespace Inkscape {
diff --git a/src/ui/widget/style-subject.cpp b/src/ui/widget/style-subject.cpp
index a48370d9b..da3bbcd20 100644
--- a/src/ui/widget/style-subject.cpp
+++ b/src/ui/widget/style-subject.cpp
@@ -55,13 +55,11 @@ Inkscape::Selection *StyleSubject::Selection::_getSelection() const {
}
}
-StyleSubject::iterator StyleSubject::Selection::begin() {
+std::vector<SPObject*> StyleSubject::Selection::list(){
Inkscape::Selection *selection = _getSelection();
- if (selection) {
- return iterator(selection->list());
- } else {
- return iterator(NULL);
- }
+ if(selection)
+ return selection->list();
+ else return std::vector<SPObject*>();
}
Geom::OptRect StyleSubject::Selection::getBounds(SPItem::BBoxType type) {
@@ -104,8 +102,7 @@ void StyleSubject::Selection::setCSS(SPCSSAttr *css) {
}
StyleSubject::CurrentLayer::CurrentLayer() {
- _element.data = NULL;
- _element.next = NULL;
+ _element = NULL;
}
StyleSubject::CurrentLayer::~CurrentLayer() {
@@ -114,10 +111,10 @@ StyleSubject::CurrentLayer::~CurrentLayer() {
void StyleSubject::CurrentLayer::_setLayer(SPObject *layer) {
_layer_release.disconnect();
_layer_modified.disconnect();
- if (_element.data) {
- sp_object_unref(static_cast<SPObject *>(_element.data), NULL);
+ if (_element) {
+ sp_object_unref(_element, NULL);
}
- _element.data = layer;
+ _element = layer;
if (layer) {
sp_object_ref(layer, NULL);
_layer_release = layer->connectRelease(sigc::hide(sigc::bind(sigc::mem_fun(*this, &CurrentLayer::_setLayer), (SPObject *)NULL)));
@@ -127,19 +124,18 @@ void StyleSubject::CurrentLayer::_setLayer(SPObject *layer) {
}
SPObject *StyleSubject::CurrentLayer::_getLayer() const {
- return static_cast<SPObject *>(_element.data);
+ return _element;
}
-GSList *StyleSubject::CurrentLayer::_getLayerSList() const {
- if (_element.data) {
- return &_element;
- } else {
- return NULL;
- }
+SPObject *StyleSubject::CurrentLayer::_getLayerSList() const {
+ return _element;
+
}
-StyleSubject::iterator StyleSubject::CurrentLayer::begin() {
- return iterator(_getLayerSList());
+std::vector<SPObject*> StyleSubject::CurrentLayer::list(){
+ std::vector<SPObject*> list;
+ list.push_back(_element);
+ return list;
}
Geom::OptRect StyleSubject::CurrentLayer::getBounds(SPItem::BBoxType type) {
@@ -152,8 +148,10 @@ Geom::OptRect StyleSubject::CurrentLayer::getBounds(SPItem::BBoxType type) {
}
int StyleSubject::CurrentLayer::queryStyle(SPStyle *query, int property) {
- GSList *list = _getLayerSList();
- if (list) {
+ std::vector<SPItem*> list;
+ SPObject* i=_getLayerSList();
+ if (i) {
+ list.push_back((SPItem*)i);
return sp_desktop_query_style_from_list(list, query, property);
} else {
return QUERY_STYLE_NOTHING;
diff --git a/src/ui/widget/style-subject.h b/src/ui/widget/style-subject.h
index 47da91732..15a072f44 100644
--- a/src/ui/widget/style-subject.h
+++ b/src/ui/widget/style-subject.h
@@ -10,7 +10,6 @@
#ifndef SEEN_INKSCAPE_UI_WIDGET_STYLE_SUBJECT_H
#define SEEN_INKSCAPE_UI_WIDGET_STYLE_SUBJECT_H
-#include "util/glib-list-iterators.h"
#include <boost/optional.hpp>
#include <2geom/rect.h>
#include "sp-item.h"
@@ -35,7 +34,6 @@ public:
class Selection;
class CurrentLayer;
- typedef Util::GSListConstIterator<SPObject *> iterator;
StyleSubject();
virtual ~StyleSubject();
@@ -43,11 +41,10 @@ public:
void setDesktop(SPDesktop *desktop);
SPDesktop *getDesktop() const { return _desktop; }
- virtual iterator begin() = 0;
- virtual iterator end() { return iterator(NULL); }
virtual Geom::OptRect getBounds(SPItem::BBoxType type) = 0;
virtual int queryStyle(SPStyle *query, int property) = 0;
virtual void setCSS(SPCSSAttr *css) = 0;
+ virtual std::vector<SPObject*> list(){return std::vector<SPObject*>();};
sigc::connection connectChanged(sigc::signal<void>::slot_type slot) {
return _changed_signal.connect(slot);
@@ -67,10 +64,10 @@ public:
Selection();
~Selection();
- virtual iterator begin();
virtual Geom::OptRect getBounds(SPItem::BBoxType type);
virtual int queryStyle(SPStyle *query, int property);
virtual void setCSS(SPCSSAttr *css);
+ virtual std::vector<SPObject*> list();
protected:
virtual void _afterDesktopSwitch(SPDesktop *desktop);
@@ -88,10 +85,10 @@ public:
CurrentLayer();
~CurrentLayer();
- virtual iterator begin();
virtual Geom::OptRect getBounds(SPItem::BBoxType type);
virtual int queryStyle(SPStyle *query, int property);
virtual void setCSS(SPCSSAttr *css);
+ virtual std::vector<SPObject*> list();
protected:
virtual void _afterDesktopSwitch(SPDesktop *desktop);
@@ -99,12 +96,12 @@ protected:
private:
SPObject *_getLayer() const;
void _setLayer(SPObject *layer);
- GSList *_getLayerSList() const;
+ SPObject *_getLayerSList() const;
sigc::connection _layer_switched;
sigc::connection _layer_release;
sigc::connection _layer_modified;
- mutable GSList _element;
+ mutable SPObject* _element;
};
}
diff --git a/src/ui/widget/style-swatch.h b/src/ui/widget/style-swatch.h
index 582d2ebb3..0016e0256 100644
--- a/src/ui/widget/style-swatch.h
+++ b/src/ui/widget/style-swatch.h
@@ -17,10 +17,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/label.h>
#include <gtkmm/eventbox.h>
diff --git a/src/ui/widget/tolerance-slider.cpp b/src/ui/widget/tolerance-slider.cpp
index ff525c679..ced811c57 100644
--- a/src/ui/widget/tolerance-slider.cpp
+++ b/src/ui/widget/tolerance-slider.cpp
@@ -12,10 +12,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/adjustment.h>
#include <gtkmm/box.h>
#include <gtkmm/label.h>
diff --git a/src/ui/widget/unit-menu.h b/src/ui/widget/unit-menu.h
index 2fd25a6a9..f414660f7 100644
--- a/src/ui/widget/unit-menu.h
+++ b/src/ui/widget/unit-menu.h
@@ -10,14 +10,6 @@
#ifndef INKSCAPE_UI_WIDGET_UNIT_H
#define INKSCAPE_UI_WIDGET_UNIT_H
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/comboboxtext.h>
#include "util/units.h"
diff --git a/src/unclump.cpp b/src/unclump.cpp
index 940369d7a..81c958937 100644
--- a/src/unclump.cpp
+++ b/src/unclump.cpp
@@ -168,13 +168,12 @@ unclump_dist (SPItem *item1, SPItem *item2)
/**
Average unclump_dist from item to others
*/
-static double unclump_average (SPItem *item, GSList *others)
+static double unclump_average (SPItem *item, std::list<SPItem*> &others)
{
int n = 0;
double sum = 0;
-
- for (GSList *i = others; i != NULL; i = i->next) {
- SPItem *other = SP_ITEM (i->data);
+ for (std::list<SPItem*>::const_iterator i = others.begin(); i != others.end();i++) {
+ SPItem *other = *i;
if (other == item)
continue;
@@ -192,13 +191,13 @@ static double unclump_average (SPItem *item, GSList *others)
/**
Closest to item among others
*/
-static SPItem *unclump_closest (SPItem *item, GSList *others)
+static SPItem *unclump_closest (SPItem *item, std::list<SPItem*> &others)
{
double min = HUGE_VAL;
SPItem *closest = NULL;
- for (GSList *i = others; i != NULL; i = i->next) {
- SPItem *other = SP_ITEM (i->data);
+ for (std::list<SPItem*>::const_iterator i = others.begin(); i != others.end();i++) {
+ SPItem *other = *i;
if (other == item)
continue;
@@ -216,13 +215,12 @@ static SPItem *unclump_closest (SPItem *item, GSList *others)
/**
Most distant from item among others
*/
-static SPItem *unclump_farest (SPItem *item, GSList *others)
+static SPItem *unclump_farest (SPItem *item, std::list<SPItem*> &others)
{
double max = -HUGE_VAL;
SPItem *farest = NULL;
-
- for (GSList *i = others; i != NULL; i = i->next) {
- SPItem *other = SP_ITEM (i->data);
+ for (std::list<SPItem*>::const_iterator i = others.begin(); i != others.end();i++) {
+ SPItem *other = *i;
if (other == item)
continue;
@@ -242,8 +240,8 @@ Removes from the \a rest list those items that are "behind" \a closest as seen f
i.e. those on the other side of the line through \a closest perpendicular to the direction from \a
item to \a closest. Returns a newly created list which must be freed.
*/
-static GSList *
-unclump_remove_behind (SPItem *item, SPItem *closest, GSList *rest)
+static std::vector<SPItem*>
+unclump_remove_behind (SPItem *item, SPItem *closest, std::list<SPItem*> &rest)
{
Geom::Point it = unclump_center (item);
Geom::Point p1 = unclump_center (closest);
@@ -260,10 +258,9 @@ unclump_remove_behind (SPItem *item, SPItem *closest, GSList *rest)
// substitute the item into it:
double val_item = A * it[Geom::X] + B * it[Geom::Y] + C;
- GSList *out = NULL;
-
- for (GSList *i = rest; i != NULL; i = i->next) {
- SPItem *other = SP_ITEM (i->data);
+ std::vector<SPItem*> out;
+ for (std::list<SPItem*>::const_reverse_iterator i = rest.rbegin(); i != rest.rend();i++) {
+ SPItem *other = *i;
if (other == item)
continue;
@@ -274,7 +271,7 @@ unclump_remove_behind (SPItem *item, SPItem *closest, GSList *rest)
if (val_item * val_other <= 1e-6) {
// different signs, which means item and other are on the different sides of p1-p2 line; skip
} else {
- out = g_slist_prepend (out, other);
+ out.push_back(other);
}
}
@@ -334,34 +331,34 @@ similar to "engraver dots". The only distribution which is unchanged by unclumpi
grid. May be called repeatedly for stronger effect.
*/
void
-unclump (GSList *items)
+unclump (std::vector<SPItem*> &items)
{
c_cache.clear();
wh_cache.clear();
- for (GSList *i = items; i != NULL; i = i->next) { // for each original/clone x:
- SPItem *item = SP_ITEM (i->data);
+ for (std::vector<SPItem*>::const_iterator i = items.begin(); i != items.end();i++) { // for each original/clone x:
+ SPItem *item = *i;
- GSList *nei = NULL;
+ std::list<SPItem*> nei;
- GSList *rest = g_slist_copy (items);
- rest = g_slist_remove (rest, item);
+ std::list<SPItem*> rest;
+ for(int i=0;i<items.size();i++)rest.push_front(items[items.size()-i-1]);
+ rest.remove(item);
- while (rest != NULL) {
+ while (!rest.empty()) {
SPItem *closest = unclump_closest (item, rest);
if (closest) {
- nei = g_slist_prepend (nei, closest);
- rest = g_slist_remove (rest, closest);
- GSList *new_rest = unclump_remove_behind (item, closest, rest);
- g_slist_free (rest);
- rest = new_rest;
+ nei.push_front(closest);
+ rest.remove(closest);
+ std::vector<SPItem*> new_rest = unclump_remove_behind (item, closest, rest);
+ rest.clear();
+ for(int i=0;i<new_rest.size();i++)rest.push_front(new_rest[new_rest.size()-i-1]);
} else {
- g_slist_free (rest);
break;
}
}
- if (g_slist_length (nei) >= 2) {
+ if ( (nei.size()) >= 2) {
double ave = unclump_average (item, nei);
SPItem *closest = unclump_closest (item, nei);
diff --git a/src/unclump.h b/src/unclump.h
index 2411cb713..461e99d0b 100644
--- a/src/unclump.h
+++ b/src/unclump.h
@@ -13,7 +13,7 @@
typedef struct _GSList GSList;
-void unclump(GSList *items);
+void unclump(std::vector<SPItem*> &items);
#endif /* !UNCLUMP_H_SEEN */
diff --git a/src/util/ziptool.cpp b/src/util/ziptool.cpp
index cf024008f..2eb516b2e 100644
--- a/src/util/ziptool.cpp
+++ b/src/util/ziptool.cpp
@@ -2605,7 +2605,7 @@ bool ZipFile::readFileData()
if (gpBitFlag & 0x8)//bit 3 was set. means we dont know compressed size
{
unsigned char c1, c2, c3, c4;
- c1 = c2 = c3 = c4 = 0;
+ c2 = c3 = c4 = 0;
while (true)
{
unsigned char ch;
diff --git a/src/vanishing-point.cpp b/src/vanishing-point.cpp
index b62aacbc5..46f895c06 100644
--- a/src/vanishing-point.cpp
+++ b/src/vanishing-point.cpp
@@ -256,8 +256,9 @@ VanishingPoint::set_pos(Proj::Pt2 const &pt) {
std::list<SPBox3D *>
VanishingPoint::selectedBoxes(Inkscape::Selection *sel) {
std::list<SPBox3D *> sel_boxes;
- for (GSList const* i = sel->itemList(); i != NULL; i = i->next) {
- SPItem *item = static_cast<SPItem *>(i->data);
+ std::vector<SPItem*> itemlist=sel->itemList();
+ for (std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++) {
+ SPItem *item = *i;
SPBox3D *box = dynamic_cast<SPBox3D *>(item);
if (box && this->hasBox(box)) {
sel_boxes.push_back(box);
@@ -395,8 +396,9 @@ VPDragger::VPsOfSelectedBoxes() {
VanishingPoint *vp;
// FIXME: Should we take the selection from the parent VPDrag? I guess it shouldn't make a difference.
Inkscape::Selection *sel = SP_ACTIVE_DESKTOP->getSelection();
- for (GSList const* i = sel->itemList(); i != NULL; i = i->next) {
- SPItem *item = static_cast<SPItem *>(i->data);
+ std::vector<SPItem*> itemlist=sel->itemList();
+ for (std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++) {
+ SPItem *item = *i;
SPBox3D *box = dynamic_cast<SPBox3D *>(item);
if (box) {
vp = this->findVPWithBox(box);
@@ -577,8 +579,9 @@ VPDrag::updateDraggers ()
g_return_if_fail (this->selection != NULL);
- for (GSList const* i = this->selection->itemList(); i != NULL; i = i->next) {
- SPItem *item = static_cast<SPItem *>(i->data);
+ std::vector<SPItem*> itemlist=this->selection->itemList();
+ for (std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++) {
+ SPItem *item = *i;
SPBox3D *box = dynamic_cast<SPBox3D *>(item);
if (box) {
VanishingPoint vp;
@@ -609,8 +612,9 @@ VPDrag::updateLines ()
g_return_if_fail (this->selection != NULL);
- for (GSList const* i = this->selection->itemList(); i != NULL; i = i->next) {
- SPItem *item = static_cast<SPItem *>(i->data);
+ std::vector<SPItem*> itemlist=this->selection->itemList();
+ for (std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++) {
+ SPItem *item = *i;
SPBox3D *box = dynamic_cast<SPBox3D *>(item);
if (box) {
this->drawLinesForFace (box, Proj::X);
@@ -626,11 +630,11 @@ VPDrag::updateBoxHandles ()
// FIXME: Is there a way to update the knots without accessing the
// (previously) statically linked function KnotHolder::update_knots?
- GSList *sel = (GSList *) selection->itemList();
- if (!sel)
+ std::vector<SPItem*> sel = selection->itemList();
+ if (sel.empty())
return; // no selection
- if (g_slist_length (sel) > 1) {
+ if (sel.size() > 1) {
// Currently we only show handles if a single box is selected
return;
}
diff --git a/src/verbs.cpp b/src/verbs.cpp
index 5febeeb7c..ea2c06dcf 100644
--- a/src/verbs.cpp
+++ b/src/verbs.cpp
@@ -32,10 +32,9 @@
#include <cstring>
#include <string>
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
+// Note that gtkmm headers must be included before gtk+ C headers
+// in all files. The same applies for glibmm/glib etc.
+// If this is not done, then errors will be generate relating to Glib::Threads being undefined
#include <gtkmm/filechooserdialog.h>
#include <gtkmm/messagedialog.h>
#include <gtkmm/stock.h>
diff --git a/src/widgets/arc-toolbar.cpp b/src/widgets/arc-toolbar.cpp
index 8a64854be..71418e238 100644
--- a/src/widgets/arc-toolbar.cpp
+++ b/src/widgets/arc-toolbar.cpp
@@ -97,12 +97,9 @@ sp_arctb_startend_value_changed(GtkAdjustment *adj, GObject *tbl, gchar const *v
gchar* namespaced_name = g_strconcat("sodipodi:", value_name, NULL);
bool modmade = false;
- for (GSList const *items = desktop->getSelection()->itemList();
- items != NULL;
- items = items->next)
- {
- SPItem *item = SP_ITEM(items->data);
-
+ std::vector<SPItem*> itemlist=desktop->getSelection()->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (SP_IS_GENERICELLIPSE(item)) {
SPGenericEllipse *ge = SP_GENERICELLIPSE(item);
@@ -166,11 +163,9 @@ static void sp_arctb_open_state_changed( EgeSelectOneAction *act, GObject *tbl )
bool modmade = false;
if ( ege_select_one_action_get_active(act) != 0 ) {
- for (GSList const *items = desktop->getSelection()->itemList();
- items != NULL;
- items = items->next)
- {
- SPItem *item = reinterpret_cast<SPItem*>(items->data);
+ std::vector<SPItem*> itemlist=desktop->getSelection()->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (SP_IS_GENERICELLIPSE(item)) {
Inkscape::XML::Node *repr = item->getRepr();
repr->setAttribute("sodipodi:open", "true");
@@ -179,11 +174,9 @@ static void sp_arctb_open_state_changed( EgeSelectOneAction *act, GObject *tbl )
}
}
} else {
- for (GSList const *items = desktop->getSelection()->itemList();
- items != NULL;
- items = items->next)
- {
- SPItem *item = reinterpret_cast<SPItem *>(items->data);
+ std::vector<SPItem*> itemlist=desktop->getSelection()->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (SP_IS_GENERICELLIPSE(item)) {
Inkscape::XML::Node *repr = item->getRepr();
repr->setAttribute("sodipodi:open", NULL);
@@ -271,11 +264,9 @@ static void sp_arc_toolbox_selection_changed(Inkscape::Selection *selection, GOb
purge_repr_listener( tbl, tbl );
- for (GSList const *items = selection->itemList();
- items != NULL;
- items = items->next)
- {
- SPItem *item = reinterpret_cast<SPItem *>(items->data);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (SP_IS_GENERICELLIPSE(item)) {
n_selected++;
repr = item->getRepr();
diff --git a/src/widgets/connector-toolbar.cpp b/src/widgets/connector-toolbar.cpp
index c906f7de4..1c99f283d 100644
--- a/src/widgets/connector-toolbar.cpp
+++ b/src/widgets/connector-toolbar.cpp
@@ -76,7 +76,6 @@ static void sp_connector_path_set_ignore(void)
static void sp_connector_orthogonal_toggled( GtkToggleAction* act, GObject *tbl )
{
SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( tbl, "desktop" ));
- Inkscape::Selection * selection = desktop->getSelection();
SPDocument *doc = desktop->getDocument();
if (!DocumentUndo::getUndoSensitive(doc)) {
@@ -98,9 +97,9 @@ static void sp_connector_orthogonal_toggled( GtkToggleAction* act, GObject *tbl
gchar *value = is_orthog ? orthog_str : polyline_str ;
bool modmade = false;
- GSList *l = (GSList *) selection->itemList();
- while (l) {
- SPItem *item = SP_ITEM(l->data);
+ std::vector<SPItem*> itemlist=desktop->getSelection()->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (Inkscape::UI::Tools::cc_item_is_connector(item)) {
item->setAttribute( "inkscape:connector-type",
@@ -108,7 +107,6 @@ static void sp_connector_orthogonal_toggled( GtkToggleAction* act, GObject *tbl
item->avoidRef->handleSettingChange();
modmade = true;
}
- l = l->next;
}
if (!modmade) {
@@ -126,7 +124,6 @@ static void sp_connector_orthogonal_toggled( GtkToggleAction* act, GObject *tbl
static void connector_curvature_changed(GtkAdjustment *adj, GObject* tbl)
{
SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( tbl, "desktop" ));
- Inkscape::Selection * selection = desktop->getSelection();
SPDocument *doc = desktop->getDocument();
if (!DocumentUndo::getUndoSensitive(doc)) {
@@ -147,9 +144,9 @@ static void connector_curvature_changed(GtkAdjustment *adj, GObject* tbl)
g_ascii_dtostr(value, G_ASCII_DTOSTR_BUF_SIZE, newValue);
bool modmade = false;
- GSList *l = (GSList *) selection->itemList();
- while (l) {
- SPItem *item = SP_ITEM(l->data);
+ std::vector<SPItem*> itemlist=desktop->getSelection()->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (Inkscape::UI::Tools::cc_item_is_connector(item)) {
item->setAttribute( "inkscape:connector-curvature",
@@ -157,7 +154,6 @@ static void connector_curvature_changed(GtkAdjustment *adj, GObject* tbl)
item->avoidRef->handleSettingChange();
modmade = true;
}
- l = l->next;
}
if (!modmade) {
diff --git a/src/widgets/dash-selector.h b/src/widgets/dash-selector.h
index 5b9ebfa2b..ec5a1cbd5 100644
--- a/src/widgets/dash-selector.h
+++ b/src/widgets/dash-selector.h
@@ -14,10 +14,6 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/combobox.h>
#include <gtkmm/liststore.h>
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index fd3756220..e19f56e48 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -1433,8 +1433,10 @@ sp_desktop_widget_maximize(SPDesktopWidget *dtw)
if (!dtw->desktop->is_iconified() && !dtw->desktop->is_fullscreen())
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gint w, h, x, y;
+ gint w = -1;
+ gint h, x, y;
dtw->getWindowGeometry(x, y, w, h);
+ g_assert(w != -1);
prefs->setInt("/desktop/geometry/width", w);
prefs->setInt("/desktop/geometry/height", h);
prefs->setInt("/desktop/geometry/x", x);
diff --git a/src/widgets/desktop-widget.h b/src/widgets/desktop-widget.h
index a77d56fc3..489217d9a 100644
--- a/src/widgets/desktop-widget.h
+++ b/src/widgets/desktop-widget.h
@@ -12,14 +12,6 @@
* ? -2004
*/
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/window.h>
#include "message.h"
#include "ui/view/view-widget.h"
diff --git a/src/widgets/ege-adjustment-action.cpp b/src/widgets/ege-adjustment-action.cpp
index d89a6e3f1..a91149f4c 100644
--- a/src/widgets/ege-adjustment-action.cpp
+++ b/src/widgets/ege-adjustment-action.cpp
@@ -742,7 +742,7 @@ static GtkWidget* create_popup_number_menu( EgeAdjustmentAction* act )
if ( act->private_data->descriptions ) {
gdouble value = ((EgeAdjustmentDescr*)act->private_data->descriptions->data)->value;
- addOns = flush_explicit_items( addOns, G_CALLBACK(process_menu_action), BUMP_CUSTOM, menu, act, &single, &group, value );
+ flush_explicit_items( addOns, G_CALLBACK(process_menu_action), BUMP_CUSTOM, menu, act, &single, &group, value );
}
return menu;
diff --git a/src/widgets/fill-style.cpp b/src/widgets/fill-style.cpp
index d60a92b8b..b1f812338 100644
--- a/src/widgets/fill-style.cpp
+++ b/src/widgets/fill-style.cpp
@@ -22,10 +22,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <glibmm/i18n.h>
@@ -481,7 +477,7 @@ void FillNStroke::updateFromPaint()
SPDocument *document = desktop->getDocument();
Inkscape::Selection *selection = desktop->getSelection();
- GSList const *items = selection->itemList();
+ std::vector<SPItem*> const items = selection->itemList();
switch (psel->mode) {
case SPPaintSelector::MODE_EMPTY:
@@ -543,7 +539,7 @@ void FillNStroke::updateFromPaint()
case SPPaintSelector::MODE_GRADIENT_LINEAR:
case SPPaintSelector::MODE_GRADIENT_RADIAL:
case SPPaintSelector::MODE_SWATCH:
- if (items) {
+ if (!items.empty()) {
SPGradientType const gradient_type = ( psel->mode != SPPaintSelector::MODE_GRADIENT_RADIAL
? SP_GRADIENT_TYPE_LINEAR
: SP_GRADIENT_TYPE_RADIAL );
@@ -561,7 +557,7 @@ void FillNStroke::updateFromPaint()
/* No vector in paint selector should mean that we just changed mode */
SPStyle query(desktop->doc());
- int result = objects_query_fillstroke(const_cast<GSList *>(items), &query, kind == FILL);
+ int result = objects_query_fillstroke(items, &query, kind == FILL);
if (result == QUERY_STYLE_MULTIPLE_SAME) {
SPIPaint &targPaint = (kind == FILL) ? query.fill : query.stroke;
SPColor common;
@@ -576,39 +572,39 @@ void FillNStroke::updateFromPaint()
}
}
- for (GSList const *i = items; i != NULL; i = i->next) {
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
//FIXME: see above
if (kind == FILL) {
- sp_repr_css_change_recursive(reinterpret_cast<SPObject*>(i->data)->getRepr(), css, "style");
+ sp_repr_css_change_recursive((*i)->getRepr(), css, "style");
}
if (!vector) {
SPGradient *gr = sp_gradient_vector_for_object( document,
desktop,
- reinterpret_cast<SPObject*>(i->data),
+ reinterpret_cast<SPObject*>(*i),
(kind == FILL) ? Inkscape::FOR_FILL : Inkscape::FOR_STROKE,
createSwatch );
if ( gr && createSwatch ) {
gr->setSwatch();
}
- sp_item_set_gradient(SP_ITEM(i->data),
+ sp_item_set_gradient(*i,
gr,
gradient_type, (kind == FILL) ? Inkscape::FOR_FILL : Inkscape::FOR_STROKE);
} else {
- sp_item_set_gradient(SP_ITEM(i->data), vector, gradient_type, (kind == FILL) ? Inkscape::FOR_FILL : Inkscape::FOR_STROKE);
+ sp_item_set_gradient(*i, vector, gradient_type, (kind == FILL) ? Inkscape::FOR_FILL : Inkscape::FOR_STROKE);
}
}
} else {
// We have changed from another gradient type, or modified spread/units within
// this gradient type.
vector = sp_gradient_ensure_vector_normalized(vector);
- for (GSList const *i = items; i != NULL; i = i->next) {
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
//FIXME: see above
if (kind == FILL) {
- sp_repr_css_change_recursive(reinterpret_cast<SPObject*>(i->data)->getRepr(), css, "style");
+ sp_repr_css_change_recursive((*i)->getRepr(), css, "style");
}
- SPGradient *gr = sp_item_set_gradient(SP_ITEM(i->data), vector, gradient_type, (kind == FILL) ? Inkscape::FOR_FILL : Inkscape::FOR_STROKE);
+ SPGradient *gr = sp_item_set_gradient(*i, vector, gradient_type, (kind == FILL) ? Inkscape::FOR_FILL : Inkscape::FOR_STROKE);
psel->pushAttrsToGradient( gr );
}
}
@@ -625,7 +621,7 @@ void FillNStroke::updateFromPaint()
case SPPaintSelector::MODE_PATTERN:
- if (items) {
+ if (!items.empty()) {
SPPattern *pattern = psel->getPattern();
if (!pattern) {
@@ -648,12 +644,12 @@ void FillNStroke::updateFromPaint()
// cannot just call sp_desktop_set_style, because we don't want to touch those
// objects who already have the same root pattern but through a different href
// chain. FIXME: move this to a sp_item_set_pattern
- for (GSList const *i = items; i != NULL; i = i->next) {
- Inkscape::XML::Node *selrepr = reinterpret_cast<SPObject*>(i->data)->getRepr();
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
+ Inkscape::XML::Node *selrepr = (*i)->getRepr();
if ( (kind == STROKE) && !selrepr) {
continue;
}
- SPObject *selobj = reinterpret_cast<SPObject*>(i->data);
+ SPObject *selobj = *i;
SPStyle *style = selobj->style;
if (style && ((kind == FILL) ? style->fill : style->stroke).isPaintserver()) {
@@ -686,7 +682,7 @@ void FillNStroke::updateFromPaint()
break;
case SPPaintSelector::MODE_UNSET:
- if (items) {
+ if (!items.empty()) {
SPCSSAttr *css = sp_repr_css_attr_new();
if (kind == FILL) {
sp_repr_css_unset_property(css, "fill");
diff --git a/src/widgets/gradient-toolbar.cpp b/src/widgets/gradient-toolbar.cpp
index 7ce04403b..6743dd23a 100644
--- a/src/widgets/gradient-toolbar.cpp
+++ b/src/widgets/gradient-toolbar.cpp
@@ -116,8 +116,9 @@ void gr_apply_gradient(Inkscape::Selection *selection, GrDrag *drag, SPGradient
}
// If no drag or no dragger selected, act on selection
- for (GSList const* i = selection->itemList(); i != NULL; i = i->next) {
- gr_apply_gradient_to_item(SP_ITEM(i->data), gr, initialType, initialMode, initialMode);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ gr_apply_gradient_to_item(*i, gr, initialType, initialMode, initialMode);
}
}
@@ -217,8 +218,9 @@ void gr_get_dt_selected_gradient(Inkscape::Selection *selection, SPGradient *&gr
{
SPGradient *gradient = 0;
- for (GSList const* i = selection->itemList(); i; i = i->next) {
- SPItem *item = SP_ITEM(i->data); // get the items gradient, not the getVector() version
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;// get the items gradient, not the getVector() version
SPStyle *style = item->style;
SPPaintServer *server = 0;
@@ -284,8 +286,9 @@ void gr_read_selection( Inkscape::Selection *selection,
}
// If no selected dragger, read desktop selection
- for (GSList const* i = selection->itemList(); i; i = i->next) {
- SPItem *item = SP_ITEM(i->data);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
SPStyle *style = item->style;
if (style && (style->fill.isPaintserver())) {
diff --git a/src/widgets/gradient-vector.cpp b/src/widgets/gradient-vector.cpp
index d2c46ffec..10d1cc107 100644
--- a/src/widgets/gradient-vector.cpp
+++ b/src/widgets/gradient-vector.cpp
@@ -548,6 +548,7 @@ static void verify_grad(SPGradient *gradient)
child->setAttribute("style", os.str().c_str());
gradient->getRepr()->addChild(child, NULL);
Inkscape::GC::release(child);
+ return;
}
if (i < 2) {
sp_repr_set_css_double(stop->getRepr(), "offset", 0.0);
diff --git a/src/widgets/icon.cpp b/src/widgets/icon.cpp
index afc4fcfb0..542d16797 100644
--- a/src/widgets/icon.cpp
+++ b/src/widgets/icon.cpp
@@ -16,10 +16,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/icontheme.h>
#include <cstring>
#include <glib.h>
diff --git a/src/widgets/mesh-toolbar.cpp b/src/widgets/mesh-toolbar.cpp
index bf406e632..1af55d9cd 100644
--- a/src/widgets/mesh-toolbar.cpp
+++ b/src/widgets/mesh-toolbar.cpp
@@ -87,8 +87,9 @@ void ms_read_selection( Inkscape::Selection *selection,
bool first = true;
ms_type = SP_MESH_TYPE_COONS;
- for (GSList const* i = selection->itemList(); i; i = i->next) {
- SPItem *item = SP_ITEM(i->data);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
SPStyle *style = item->style;
if (style && (style->fill.isPaintserver())) {
@@ -213,8 +214,9 @@ void ms_get_dt_selected_gradient(Inkscape::Selection *selection, SPMesh *&ms_sel
{
SPMesh *gradient = 0;
- for (GSList const* i = selection->itemList(); i; i = i->next) {
- SPItem *item = SP_ITEM(i->data); // get the items gradient, not the getVector() version
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;// get the items gradient, not the getVector() version
SPStyle *style = item->style;
SPPaintServer *server = 0;
diff --git a/src/widgets/paint-selector.cpp b/src/widgets/paint-selector.cpp
index 948c80db3..221344296 100644
--- a/src/widgets/paint-selector.cpp
+++ b/src/widgets/paint-selector.cpp
@@ -24,10 +24,6 @@
#include <cstring>
#include <string>
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include "widgets/swatch-selector.h"
#include "sp-pattern.h"
#include <glibmm/i18n.h>
@@ -39,6 +35,7 @@
#include "sp-linear-gradient.h"
#include "sp-radial-gradient.h"
#include "sp-mesh.h"
+#include "sp-stop.h"
/* fixme: Move it from dialogs to here */
#include "gradient-selector.h"
#include <inkscape.h>
@@ -662,6 +659,20 @@ sp_paint_selector_color_changed(SPColorSelector *csel, SPPaintSelector *psel)
static void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelector::Mode /*mode*/)
{
GtkWidget *csel;
+
+ SPColor newcolor = psel->color;
+ float newalpha = psel->alpha;
+
+ if ((psel->mode == SPPaintSelector::MODE_SWATCH)
+ || (psel->mode == SPPaintSelector::MODE_GRADIENT_LINEAR)
+ || (psel->mode == SPPaintSelector::MODE_GRADIENT_RADIAL) ) {
+ SPGradientSelector *gsel = getGradientFromData(psel);
+ if (gsel) {
+ SPGradient *gradient = gsel->getVector();
+ newcolor = gradient->getFirstStop()->specified_color;
+ newalpha = gradient->getFirstStop()->opacity;
+ }
+ }
sp_paint_selector_set_style_buttons(psel, psel->solid);
gtk_widget_set_sensitive(psel->style, TRUE);
@@ -697,8 +708,7 @@ static void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelec
psel->selector = vb;
/* Set color */
- SP_COLOR_SELECTOR( csel )->base->setColorAlpha( psel->color, psel->alpha );
-
+ SP_COLOR_SELECTOR( csel )->base->setColorAlpha( newcolor, newalpha );
}
gtk_label_set_markup(GTK_LABEL(psel->label), _("<b>Flat color</b>"));
diff --git a/src/widgets/rect-toolbar.cpp b/src/widgets/rect-toolbar.cpp
index 46f6d1c23..96ba699dc 100644
--- a/src/widgets/rect-toolbar.cpp
+++ b/src/widgets/rect-toolbar.cpp
@@ -106,12 +106,13 @@ static void sp_rtb_value_changed(GtkAdjustment *adj, GObject *tbl, gchar const *
bool modmade = false;
Inkscape::Selection *selection = desktop->getSelection();
- for (GSList const *items = selection->itemList(); items != NULL; items = items->next) {
- if (SP_IS_RECT(items->data)) {
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ if (SP_IS_RECT(*i)) {
if (gtk_adjustment_get_value(adj) != 0) {
- (SP_RECT(items->data)->*setter)(Quantity::convert(gtk_adjustment_get_value(adj), unit, "px"));
+ (SP_RECT(*i)->*setter)(Quantity::convert(gtk_adjustment_get_value(adj), unit, "px"));
} else {
- SP_OBJECT(items->data)->getRepr()->setAttribute(value_name, NULL);
+ (*i)->getRepr()->setAttribute(value_name, NULL);
}
modmade = true;
}
@@ -242,12 +243,11 @@ static void sp_rect_toolbox_selection_changed(Inkscape::Selection *selection, GO
}
purge_repr_listener( tbl, tbl );
- for (GSList const *items = selection->itemList();
- items != NULL;
- items = items->next) {
- if (SP_IS_RECT(reinterpret_cast<SPItem *>(items->data))) {
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ if (SP_IS_RECT(*i)) {
n_selected++;
- item = reinterpret_cast<SPItem *>(items->data);
+ item = *i;
repr = item->getRepr();
}
}
diff --git a/src/widgets/shrink-wrap-button.cpp b/src/widgets/shrink-wrap-button.cpp
index 3558780ed..941a0466c 100644
--- a/src/widgets/shrink-wrap-button.cpp
+++ b/src/widgets/shrink-wrap-button.cpp
@@ -13,10 +13,6 @@
#include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/button.h>
#include <gtk/gtk.h>
diff --git a/src/widgets/sp-attribute-widget.h b/src/widgets/sp-attribute-widget.h
index 4bd6c6959..d9b972201 100644
--- a/src/widgets/sp-attribute-widget.h
+++ b/src/widgets/sp-attribute-widget.h
@@ -19,10 +19,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/widget.h>
#include <stddef.h>
#include <sigc++/connection.h>
diff --git a/src/widgets/spiral-toolbar.cpp b/src/widgets/spiral-toolbar.cpp
index 3fb0015c1..751a60f06 100644
--- a/src/widgets/spiral-toolbar.cpp
+++ b/src/widgets/spiral-toolbar.cpp
@@ -79,11 +79,9 @@ static void sp_spl_tb_value_changed(GtkAdjustment *adj, GObject *tbl, Glib::ustr
gchar* namespaced_name = g_strconcat("sodipodi:", value_name.data(), NULL);
bool modmade = false;
- for (GSList const *items = desktop->getSelection()->itemList();
- items != NULL;
- items = items->next)
- {
- SPItem *item = reinterpret_cast<SPItem*>(items->data);
+ std::vector<SPItem*> itemlist=desktop->getSelection()->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (SP_IS_SPIRAL(item)) {
Inkscape::XML::Node *repr = item->getRepr();
sp_repr_set_svg_double( repr, namespaced_name,
@@ -197,11 +195,9 @@ static void sp_spiral_toolbox_selection_changed(Inkscape::Selection *selection,
purge_repr_listener( tbl, tbl );
- for (GSList const *items = selection->itemList();
- items != NULL;
- items = items->next)
- {
- SPItem *item = reinterpret_cast<SPItem*>(items->data);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (SP_IS_SPIRAL(item)) {
n_selected++;
repr = item->getRepr();
diff --git a/src/widgets/spw-utilities.cpp b/src/widgets/spw-utilities.cpp
index f87889bb1..7030753a5 100644
--- a/src/widgets/spw-utilities.cpp
+++ b/src/widgets/spw-utilities.cpp
@@ -17,10 +17,6 @@
#include <cstring>
#include <string>
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/label.h>
diff --git a/src/widgets/star-toolbar.cpp b/src/widgets/star-toolbar.cpp
index cf12391c1..96005d7df 100644
--- a/src/widgets/star-toolbar.cpp
+++ b/src/widgets/star-toolbar.cpp
@@ -83,9 +83,9 @@ static void sp_stb_magnitude_value_changed( GtkAdjustment *adj, GObject *dataKlu
bool modmade = false;
Inkscape::Selection *selection = desktop->getSelection();
- GSList const *items = selection->itemList();
- for (; items != NULL; items = items->next) {
- SPItem *item = reinterpret_cast<SPItem*>(items->data);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (SP_IS_STAR(item)) {
Inkscape::XML::Node *repr = item->getRepr();
sp_repr_set_int(repr,"sodipodi:sides",
@@ -128,9 +128,9 @@ static void sp_stb_proportion_value_changed( GtkAdjustment *adj, GObject *dataKl
bool modmade = false;
Inkscape::Selection *selection = desktop->getSelection();
- GSList const *items = selection->itemList();
- for (; items != NULL; items = items->next) {
- SPItem *item = reinterpret_cast<SPItem *>(items->data);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (SP_IS_STAR(item)) {
Inkscape::XML::Node *repr = item->getRepr();
@@ -178,7 +178,6 @@ static void sp_stb_sides_flat_state_changed( EgeSelectOneAction *act, GObject *d
g_object_set_data( dataKludge, "freeze", GINT_TO_POINTER(TRUE) );
Inkscape::Selection *selection = desktop->getSelection();
- GSList const *items = selection->itemList();
GtkAction* prop_action = GTK_ACTION( g_object_get_data( dataKludge, "prop_action" ) );
bool modmade = false;
@@ -186,8 +185,9 @@ static void sp_stb_sides_flat_state_changed( EgeSelectOneAction *act, GObject *d
gtk_action_set_sensitive( prop_action, !flat );
}
- for (; items != NULL; items = items->next) {
- SPItem *item = reinterpret_cast<SPItem *>(items->data);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (SP_IS_STAR(item)) {
Inkscape::XML::Node *repr = item->getRepr();
repr->setAttribute("inkscape:flatsided", flat ? "true" : "false" );
@@ -224,9 +224,9 @@ static void sp_stb_rounded_value_changed( GtkAdjustment *adj, GObject *dataKludg
bool modmade = false;
Inkscape::Selection *selection = desktop->getSelection();
- GSList const *items = selection->itemList();
- for (; items != NULL; items = items->next) {
- SPItem *item = reinterpret_cast<SPItem*>(items->data);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (SP_IS_STAR(item)) {
Inkscape::XML::Node *repr = item->getRepr();
sp_repr_set_svg_double(repr, "inkscape:rounded",
@@ -264,9 +264,9 @@ static void sp_stb_randomized_value_changed( GtkAdjustment *adj, GObject *dataKl
bool modmade = false;
Inkscape::Selection *selection = desktop->getSelection();
- GSList const *items = selection->itemList();
- for (; items != NULL; items = items->next) {
- SPItem *item = reinterpret_cast<SPItem *>(items->data);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (SP_IS_STAR(item)) {
Inkscape::XML::Node *repr = item->getRepr();
sp_repr_set_svg_double(repr, "inkscape:randomized",
@@ -367,11 +367,9 @@ sp_star_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl)
purge_repr_listener( tbl, tbl );
- for (GSList const *items = selection->itemList();
- items != NULL;
- items = items->next)
- {
- SPItem* item = reinterpret_cast<SPItem *>(items->data);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (SP_IS_STAR(item)) {
n_selected++;
repr = item->getRepr();
diff --git a/src/widgets/stroke-marker-selector.h b/src/widgets/stroke-marker-selector.h
index 27ac76d6f..a7ee788b8 100644
--- a/src/widgets/stroke-marker-selector.h
+++ b/src/widgets/stroke-marker-selector.h
@@ -10,14 +10,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/combobox.h>
#include <gtkmm/liststore.h>
diff --git a/src/widgets/stroke-style.cpp b/src/widgets/stroke-style.cpp
index 5ca06a795..482ca7af4 100644
--- a/src/widgets/stroke-style.cpp
+++ b/src/widgets/stroke-style.cpp
@@ -475,9 +475,9 @@ void StrokeStyle::markerSelectCB(MarkerComboBox *marker_combo, StrokeStyle *spw,
//spw->updateMarkerHist(which);
Inkscape::Selection *selection = spw->desktop->getSelection();
- GSList const *items = selection->itemList();
- for (; items != NULL; items = items->next) {
- SPItem *item = reinterpret_cast<SPItem *>(items->data);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ SPItem *item = *i;
if (!SP_IS_SHAPE(item) || SP_IS_RECT(item)) { // can't set marker to rect, until it's converted to using <path>
continue;
}
@@ -901,8 +901,8 @@ StrokeStyle::updateLine()
if (!sel || sel->isEmpty())
return;
- GSList const *objects = sel->itemList();
- SPObject * const object = SP_OBJECT(objects->data);
+ std::vector<SPItem*> const objects = sel->itemList();
+ SPObject * const object = objects[0];
SPStyle * const style = object->style;
/* Markers */
@@ -957,13 +957,12 @@ StrokeStyle::scaleLine()
SPDocument *document = desktop->getDocument();
Inkscape::Selection *selection = desktop->getSelection();
-
- GSList const *items = selection->itemList();
+ std::vector<SPItem*> items=selection->itemList();
/* TODO: Create some standardized method */
SPCSSAttr *css = sp_repr_css_attr_new();
- if (items) {
+ if (!items.empty()) {
#if WITH_GTKMM_3_0
double width_typed = (*widthAdj)->get_value();
double const miterlimit = (*miterLimitAdj)->get_value();
@@ -978,13 +977,13 @@ StrokeStyle::scaleLine()
int ndash;
dashSelector->get_dash(&ndash, &dash, &offset);
- for (GSList const *i = items; i != NULL; i = i->next) {
+ for(std::vector<SPItem*>::const_iterator i=items.begin();i!=items.end();i++){
/* Set stroke width */
double width;
if (unit->type == Inkscape::Util::UNIT_TYPE_LINEAR) {
width = Inkscape::Util::Quantity::convert(width_typed, unit, "px");
} else { // percentage
- gdouble old_w = SP_OBJECT(i->data)->style->stroke_width.computed;
+ gdouble old_w = (*i)->style->stroke_width.computed;
width = old_w * width_typed / 100;
}
@@ -1003,7 +1002,7 @@ StrokeStyle::scaleLine()
/* Set dash */
setScaledDash(css, ndash, dash, offset, width);
- sp_desktop_apply_css_recursive (SP_OBJECT(i->data), css, true);
+ sp_desktop_apply_css_recursive ((*i), css, true);
}
g_free(dash);
@@ -1144,7 +1143,7 @@ StrokeStyle::setCapButtons(Gtk::ToggleButton *active)
* that marker.
*/
void
-StrokeStyle::updateAllMarkers(GSList const *objects)
+StrokeStyle::updateAllMarkers(std::vector<SPItem*> const &objects)
{
struct { MarkerComboBox *key; int loc; } const keyloc[] = {
{ startMarkerCombo, SP_MARKER_LOC_START },
@@ -1153,9 +1152,10 @@ StrokeStyle::updateAllMarkers(GSList const *objects)
};
bool all_texts = true;
- for (GSList *i = (GSList *) objects; i != NULL; i = i->next) {
- if (!SP_IS_TEXT (i->data)) {
+ for(std::vector<SPItem*>::const_iterator i=objects.begin();i!=objects.end();i++){
+ if (!SP_IS_TEXT (*i)) {
all_texts = false;
+ break;
}
}
@@ -1167,7 +1167,7 @@ StrokeStyle::updateAllMarkers(GSList const *objects)
// We show markers of the first object in the list only
// FIXME: use the first in the list that has the marker of each type, if any
- SPObject *object = SP_OBJECT(objects->data);
+ SPObject *object = objects[0];
for (unsigned i = 0; i < G_N_ELEMENTS(keyloc); ++i) {
// For all three marker types,
diff --git a/src/widgets/stroke-style.h b/src/widgets/stroke-style.h
index 83048cb76..2605e1acf 100644
--- a/src/widgets/stroke-style.h
+++ b/src/widgets/stroke-style.h
@@ -153,7 +153,7 @@ private:
};
void updateLine();
- void updateAllMarkers(GSList const *objects);
+ void updateAllMarkers(std::vector<SPItem*> const &objects);
void updateMarkerHist(SPMarkerLoc const which);
void setDashSelectorFromStyle(SPDashSelector *dsel, SPStyle *style);
void setJoinType (unsigned const jointype);
diff --git a/src/widgets/swatch-selector.h b/src/widgets/swatch-selector.h
index c8c9983a6..4b7aa483f 100644
--- a/src/widgets/swatch-selector.h
+++ b/src/widgets/swatch-selector.h
@@ -1,14 +1,6 @@
#ifndef SEEN_SP_SWATCH_SELECTOR_H
#define SEEN_SP_SWATCH_SELECTOR_H
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
class SPDocument;
diff --git a/src/widgets/text-toolbar.cpp b/src/widgets/text-toolbar.cpp
index 3d2e6eef8..7b22e4af7 100644
--- a/src/widgets/text-toolbar.cpp
+++ b/src/widgets/text-toolbar.cpp
@@ -162,11 +162,17 @@ static void sp_text_fontfamily_value_changed( Ink_ComboBoxEntry_Action *act, GOb
fontlister->fill_css( css );
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
- sp_desktop_set_style (desktop, css, true, true); // Results in selection change called twice.
+ if( desktop->getSelection()->isEmpty() ) {
+ // Update default
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->mergeStyle("/tools/text/style", css);
+ } else {
+ // If there is a selection, update
+ sp_desktop_set_style (desktop, css, true, true); // Results in selection change called twice.
+ DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_TEXT,
+ _("Text: Change font family"));
+ }
sp_repr_css_attr_unref (css);
-
- DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_TEXT,
- _("Text: Change font family"));
}
// unfreeze
@@ -366,9 +372,10 @@ static void sp_text_align_mode_changed( EgeSelectOneAction *act, GObject *tbl )
// move the x of all texts to preserve the same bbox
Inkscape::Selection *selection = desktop->getSelection();
- for (GSList const *items = selection->itemList(); items != NULL; items = items->next) {
- if (SP_IS_TEXT(SP_ITEM(items->data))) {
- SPItem *item = SP_ITEM(items->data);
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ if (SP_IS_TEXT(*i)) {
+ SPItem *item = *i;
unsigned writing_mode = item->style->writing_mode.value;
// below, variable names suggest horizontal move, but we check the writing direction
@@ -517,11 +524,11 @@ static void sp_text_lineheight_value_changed( GtkAdjustment *adj, GObject *tbl )
// Until deprecated sodipodi:linespacing purged:
Inkscape::Selection *selection = desktop->getSelection();
- GSList const *items = selection->itemList();
bool modmade = false;
- for (; items != NULL; items = items->next) {
- if (SP_IS_TEXT (items->data)) {
- SP_OBJECT(items->data)->getRepr()->setAttribute("sodipodi:linespacing", sp_repr_css_property (css, "line-height", NULL));
+ std::vector<SPItem*> itemlist=selection->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
+ if (SP_IS_TEXT (*i)) {
+ (*i)->getRepr()->setAttribute("sodipodi:linespacing", sp_repr_css_property (css, "line-height", NULL));
modmade = true;
}
}
@@ -863,12 +870,11 @@ static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/
// Only flowed text can be justified, only normal text can be kerned...
// Find out if we have flowed text now so we can use it several places
gboolean isFlow = false;
- for (GSList const *items = SP_ACTIVE_DESKTOP->getSelection()->itemList();
- items != NULL;
- items = items->next) {
+ std::vector<SPItem*> itemlist=SP_ACTIVE_DESKTOP->getSelection()->itemList();
+ for(std::vector<SPItem*>::const_iterator i=itemlist.begin();i!=itemlist.end();i++){
// const gchar* id = reinterpret_cast<SPItem *>(items->data)->getId();
// std::cout << " " << id << std::endl;
- if( SP_IS_FLOWTEXT(SP_ITEM(items->data))) {
+ if( SP_IS_FLOWTEXT(*i)) {
isFlow = true;
// std::cout << " Found flowed text" << std::endl;
break;
@@ -1153,14 +1159,14 @@ static void sp_text_toolbox_select_cb( GtkEntry* entry, GtkEntryIconPosition /*p
//std::cout << "text_toolbox_missing_font_cb: selecting: " << family << std::endl;
// Get all items with matching font-family set (not inherited!).
- GSList *selectList = NULL;
+ std::vector<SPItem*> selectList;
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
SPDocument *document = desktop->getDocument();
- GSList *allList = get_all_items(NULL, document->getRoot(), desktop, false, false, true, NULL);
- for (GSList *i = allList; i != NULL; i = i->next) {
-
- SPItem *item = SP_ITEM(i->data);
+ std::vector<SPItem*> x,y;
+ std::vector<SPItem*> allList = get_all_items(x, document->getRoot(), desktop, false, false, true, y);
+ for(std::vector<SPItem*>::const_reverse_iterator i=allList.rbegin();i!=allList.rend();i++){
+ SPItem *item = *i;
SPStyle *style = item->style;
if (style) {
@@ -1177,7 +1183,7 @@ static void sp_text_toolbox_select_cb( GtkEntry* entry, GtkEntryIconPosition /*p
if (family_style.compare( family ) == 0 ) {
//std::cout << " found: " << item->getId() << std::endl;
- selectList = g_slist_prepend (selectList, item);
+ selectList.push_back(item);
}
}
}
diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp
index 5d52db6f2..d56b91f5e 100644
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
@@ -29,10 +29,6 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/box.h>
#include <gtkmm/action.h>
#include <gtkmm/actiongroup.h>
diff --git a/src/xml/repr-util.cpp b/src/xml/repr-util.cpp
index 7c5d2d6fc..4cbe930a1 100644
--- a/src/xml/repr-util.cpp
+++ b/src/xml/repr-util.cpp
@@ -310,6 +310,11 @@ int sp_repr_compare_position(Inkscape::XML::Node const *first, Inkscape::XML::No
pjrm */
}
+bool sp_repr_compare_position_bool(Inkscape::XML::Node const *first, Inkscape::XML::Node const *second){
+ return sp_repr_compare_position(first, second)<0;
+}
+
+
/**
* Find an element node using an unique attribute.
*
diff --git a/src/xml/repr.h b/src/xml/repr.h
index c3ba40e45..17763195a 100644
--- a/src/xml/repr.h
+++ b/src/xml/repr.h
@@ -120,7 +120,9 @@ unsigned sp_repr_set_svg_length(Inkscape::XML::Node *repr, char const *key, SVGL
unsigned sp_repr_set_point(Inkscape::XML::Node *repr, char const *key, Geom::Point const & val);
unsigned sp_repr_get_point(Inkscape::XML::Node *repr, char const *key, Geom::Point *val);
+//c++-style comparison : returns (bool)(a<b)
int sp_repr_compare_position(Inkscape::XML::Node const *first, Inkscape::XML::Node const *second);
+bool sp_repr_compare_position_bool(Inkscape::XML::Node const *first, Inkscape::XML::Node const *second);
// Searching
/**
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 000000000..0b9584631
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,478 @@
+# -----------------------------------------------------------------------------
+#
+# -----------------------------------------------------------------------------
+
+set(CMAKE_CTEST_COMMAND ctest -V)
+
+add_subdirectory(${GMOCK_DIR} ${CMAKE_BINARY_DIR}/gmock)
+
+include_directories(SYSTEM ${GMOCK_DIR}/gtest/include
+ ${GMOCK_DIR}/include)
+
+# copied from ../src/CMakeLists.txt
+# TODO resolve to shared definition
+set(sp_SRC
+ ../src/attribute-rel-css.cpp
+ ../src/attribute-rel-svg.cpp
+ ../src/attribute-rel-util.cpp
+ ../src/sp-anchor.cpp
+ ../src/sp-clippath.cpp
+ ../src/sp-conn-end-pair.cpp
+ ../src/sp-conn-end.cpp
+ ../src/sp-cursor.cpp
+ ../src/sp-defs.cpp
+ ../src/sp-desc.cpp
+ ../src/sp-ellipse.cpp
+ ../src/sp-factory.cpp
+ ../src/sp-filter-primitive.cpp
+ ../src/sp-filter-reference.cpp
+ ../src/sp-filter.cpp
+ ../src/sp-flowdiv.cpp
+ ../src/sp-flowregion.cpp
+ ../src/sp-flowtext.cpp
+ ../src/sp-font-face.cpp
+ ../src/sp-font.cpp
+ ../src/sp-glyph-kerning.cpp
+ ../src/sp-glyph.cpp
+ ../src/sp-gradient-reference.cpp
+ ../src/sp-gradient.cpp
+ ../src/sp-guide.cpp
+ ../src/sp-hatch-path.cpp
+ ../src/sp-hatch.cpp
+ ../src/sp-image.cpp
+ ../src/sp-item-group.cpp
+ ../src/sp-item-notify-moveto.cpp
+ ../src/sp-item-rm-unsatisfied-cns.cpp
+ ../src/sp-item-transform.cpp
+ ../src/sp-item-update-cns.cpp
+ ../src/sp-item.cpp
+ ../src/sp-line.cpp
+ ../src/sp-linear-gradient.cpp
+ ../src/sp-lpe-item.cpp
+ ../src/sp-marker.cpp
+ ../src/sp-mask.cpp
+ ../src/sp-mesh-array.cpp
+ ../src/sp-mesh-patch.cpp
+ ../src/sp-mesh-row.cpp
+ ../src/sp-mesh.cpp
+ ../src/sp-metadata.cpp
+ ../src/sp-missing-glyph.cpp
+ ../src/sp-namedview.cpp
+ ../src/sp-object-group.cpp
+ ../src/sp-object.cpp
+ ../src/sp-offset.cpp
+ ../src/sp-paint-server.cpp
+ ../src/sp-path.cpp
+ ../src/sp-pattern.cpp
+ ../src/sp-polygon.cpp
+ ../src/sp-polyline.cpp
+ ../src/sp-radial-gradient.cpp
+ ../src/sp-rect.cpp
+ ../src/sp-root.cpp
+ ../src/sp-script.cpp
+ ../src/sp-shape.cpp
+ ../src/sp-solid-color.cpp
+ ../src/sp-spiral.cpp
+ ../src/sp-star.cpp
+ ../src/sp-stop.cpp
+ ../src/sp-string.cpp
+ ../src/sp-style-elem.cpp
+ ../src/sp-switch.cpp
+ ../src/sp-symbol.cpp
+ ../src/sp-tag-use-reference.cpp
+ ../src/sp-tag-use.cpp
+ ../src/sp-tag.cpp
+ ../src/sp-text.cpp
+ ../src/sp-title.cpp
+ ../src/sp-tref-reference.cpp
+ ../src/sp-tref.cpp
+ ../src/sp-tspan.cpp
+ ../src/sp-use-reference.cpp
+ ../src/sp-use.cpp
+ ../src/splivarot.cpp
+ ../src/viewbox.cpp
+
+ # -------
+ # Headers
+ ../src/attribute-rel-css.h
+ ../src/attribute-rel-svg.h
+ ../src/attribute-rel-util.h
+ ../src/sp-anchor.h
+ ../src/sp-clippath.h
+ ../src/sp-conn-end-pair.h
+ ../src/sp-conn-end.h
+ ../src/sp-cursor.h
+ ../src/sp-defs.h
+ ../src/sp-desc.h
+ ../src/sp-ellipse.h
+ ../src/sp-factory.h
+ ../src/sp-filter-primitive.h
+ ../src/sp-filter-reference.h
+ ../src/sp-filter-units.h
+ ../src/sp-filter.h
+ ../src/sp-flowdiv.h
+ ../src/sp-flowregion.h
+ ../src/sp-flowtext.h
+ ../src/sp-font-face.h
+ ../src/sp-font.h
+ ../src/sp-glyph-kerning.h
+ ../src/sp-glyph.h
+ ../src/sp-gradient-reference.h
+ ../src/sp-gradient-spread.h
+ ../src/sp-gradient-test.h
+ ../src/sp-gradient-units.h
+ ../src/sp-gradient-vector.h
+ ../src/sp-gradient.h
+ ../src/sp-guide-attachment.h
+ ../src/sp-guide-constraint.h
+ ../src/sp-guide.h
+ ../src/sp-hatch-path.h
+ ../src/sp-hatch.h
+ ../src/sp-image.h
+ ../src/sp-item-group.h
+ ../src/sp-item-notify-moveto.h
+ ../src/sp-item-rm-unsatisfied-cns.h
+ ../src/sp-item-transform.h
+ ../src/sp-item-update-cns.h
+ ../src/sp-item.h
+ ../src/sp-line.h
+ ../src/sp-linear-gradient.h
+ ../src/sp-lpe-item.h
+ ../src/sp-marker-loc.h
+ ../src/sp-marker.h
+ ../src/sp-mask.h
+ ../src/sp-mesh-array.h
+ ../src/sp-mesh-patch.h
+ ../src/sp-mesh-row.h
+ ../src/sp-mesh.h
+ ../src/sp-metadata.h
+ ../src/sp-missing-glyph.h
+ ../src/sp-namedview.h
+ ../src/sp-object-group.h
+ ../src/sp-object.h
+ ../src/sp-offset.h
+ ../src/sp-paint-server-reference.h
+ ../src/sp-paint-server.h
+ ../src/sp-path.h
+ ../src/sp-pattern.h
+ ../src/sp-polygon.h
+ ../src/sp-polyline.h
+ ../src/sp-radial-gradient.h
+ ../src/sp-rect.h
+ ../src/sp-root.h
+ ../src/sp-script.h
+ ../src/sp-shape.h
+ ../src/sp-solid-color.h
+ ../src/sp-spiral.h
+ ../src/sp-star.h
+ ../src/sp-stop.h
+ ../src/sp-string.h
+ ../src/sp-style-elem-test.h
+ ../src/sp-style-elem.h
+ ../src/sp-switch.h
+ ../src/sp-symbol.h
+ ../src/sp-text.h
+ ../src/sp-textpath.h
+ ../src/sp-title.h
+ ../src/sp-tref-reference.h
+ ../src/sp-tref.h
+ ../src/sp-tspan.h
+ ../src/sp-use-reference.h
+ ../src/sp-use.h
+ ../src/viewbox.h
+)
+
+# copied from ../src/CMakeLists.txt
+# TODO resolve to shared definition
+set(inkscape_SRC
+ ../src/attributes.cpp
+ ../src/axis-manip.cpp
+ ../src/box3d-side.cpp
+ ../src/box3d.cpp
+ ../src/color-profile.cpp
+ ../src/color.cpp
+ ../src/composite-undo-stack-observer.cpp
+ ../src/conditions.cpp
+ ../src/conn-avoid-ref.cpp
+ ../src/console-output-undo-observer.cpp
+ ../src/context-fns.cpp
+ ../src/desktop-events.cpp
+ ../src/desktop-style.cpp
+ ../src/desktop.cpp
+ ../src/device-manager.cpp
+ ../src/dir-util.cpp
+ ../src/document-subset.cpp
+ ../src/document-undo.cpp
+ ../src/document.cpp
+ ../src/ege-color-prof-tracker.cpp
+ ../src/event-log.cpp
+ ../src/extract-uri.cpp
+ ../src/file.cpp
+ ../src/filter-chemistry.cpp
+ ../src/filter-enums.cpp
+ ../src/gc-anchored.cpp
+ ../src/gc-finalized.cpp
+ ../src/gradient-chemistry.cpp
+ ../src/gradient-drag.cpp
+ ../src/graphlayout.cpp
+ ../src/guide-snapper.cpp
+ ../src/help.cpp
+ ../src/id-clash.cpp
+ ../src/inkscape.cpp
+ ../src/knot-holder-entity.cpp
+ ../src/knot-ptr.cpp
+ ../src/knot.cpp
+ ../src/knotholder.cpp
+ ../src/layer-fns.cpp
+ ../src/layer-manager.cpp
+ ../src/layer-model.cpp
+ ../src/line-geometry.cpp
+ ../src/line-snapper.cpp
+ ../src/main-cmdlineact.cpp
+ ../src/media.cpp
+ ../src/message-context.cpp
+ ../src/message-stack.cpp
+ ../src/mod360.cpp
+ ../src/object-hierarchy.cpp
+ ../src/object-snapper.cpp
+ ../src/path-chemistry.cpp
+ ../src/persp3d-reference.cpp
+ ../src/persp3d.cpp
+ ../src/perspective-line.cpp
+ ../src/preferences.cpp
+ ../src/prefix.cpp
+ ../src/print.cpp
+ ../src/profile-manager.cpp
+ ../src/proj_pt.cpp
+ ../src/rdf.cpp
+ ../src/removeoverlap.cpp
+ ../src/resource-manager.cpp
+ ../src/rubberband.cpp
+ ../src/satisfied-guide-cns.cpp
+ ../src/selcue.cpp
+ ../src/selection-chemistry.cpp
+ ../src/selection-describer.cpp
+ ../src/selection.cpp
+ ../src/seltrans-handles.cpp
+ ../src/seltrans.cpp
+ ../src/shortcuts.cpp
+ ../src/snap-preferences.cpp
+ ../src/snap.cpp
+ ../src/snapped-curve.cpp
+ ../src/snapped-line.cpp
+ ../src/snapped-point.cpp
+ ../src/snapper.cpp
+ ../src/style-internal.cpp
+ ../src/style.cpp
+ ../src/svg-view-widget.cpp
+ ../src/svg-view.cpp
+ ../src/text-chemistry.cpp
+ ../src/text-editing.cpp
+ ../src/transf_mat_3x4.cpp
+ ../src/unclump.cpp
+ ../src/unicoderange.cpp
+ ../src/uri-references.cpp
+ ../src/uri.cpp
+ ../src/vanishing-point.cpp
+ ../src/verbs.cpp
+ ../src/version.cpp
+
+ # -------
+ # Headers
+ ../src/MultiPrinter.h
+ ../src/PylogFormatter.h
+ ../src/TRPIFormatter.h
+ ../src/attributes-test.h
+ ../src/attributes.h
+ ../src/axis-manip.h
+ ../src/bad-uri-exception.h
+ ../src/box3d-side.h
+ ../src/box3d.h
+ ../src/cms-color-types.h
+ ../src/cms-system.h
+ ../src/color-profile-cms-fns.h
+ ../src/color-profile-test.h
+ ../src/color-profile.h
+ ../src/color-rgba.h
+ ../src/color.h
+ ../src/colorspace.h
+ ../src/composite-undo-stack-observer.h
+ ../src/conditions.h
+ ../src/conn-avoid-ref.h
+ ../src/console-output-undo-observer.h
+ ../src/context-fns.h
+ ../src/decimal-round.h
+ ../src/desktop-events.h
+ ../src/desktop-style.h
+ ../src/desktop.h
+ ../src/device-manager.h
+ ../src/dir-util-test.h
+ ../src/dir-util.h
+ ../src/document-private.h
+ ../src/document-subset.h
+ ../src/document-undo.h
+ ../src/document.h
+ ../src/ege-color-prof-tracker.h
+ ../src/enums.h
+ ../src/event-log.h
+ ../src/event.h
+ ../src/extract-uri-test.h
+ ../src/extract-uri.h
+ ../src/file.h
+ ../src/fill-or-stroke.h
+ ../src/filter-chemistry.h
+ ../src/filter-enums.h
+ ../src/gc-anchored.h
+ ../src/gc-finalized.h
+ ../src/gradient-chemistry.h
+ ../src/gradient-drag.h
+ ../src/graphlayout.h
+ ../src/guide-snapper.h
+ ../src/help.h
+ ../src/helper-fns.h
+ ../src/icon-size.h
+ ../src/id-clash.h
+ ../src/inkscape-version.h
+ ../src/inkscape.h
+ ../src/isinf.h
+ ../src/knot-enums.h
+ ../src/knot-holder-entity.h
+ ../src/knot-ptr.h
+ ../src/knot.h
+ ../src/knotholder.h
+ ../src/layer-fns.h
+ ../src/layer-manager.h
+ ../src/layer-model.h
+ ../src/line-geometry.h
+ ../src/line-snapper.h
+ ../src/macros.h
+ ../src/main-cmdlineact.h
+ ../src/marker-test.h
+ ../src/media.h
+ ../src/menus-skeleton.h
+ ../src/message-context.h
+ ../src/message-stack.h
+ ../src/message.h
+ ../src/mod360-test.h
+ ../src/mod360.h
+ ../src/number-opt-number.h
+ ../src/object-hierarchy.h
+ ../src/object-snapper.h
+ ../src/object-test.h
+ ../src/path-chemistry.h
+ ../src/path-prefix.h
+ ../src/persp3d-reference.h
+ ../src/persp3d.h
+ ../src/perspective-line.h
+ ../src/preferences-skeleton.h
+ ../src/preferences-test.h
+ ../src/preferences.h
+ ../src/prefix.h
+ ../src/print.h
+ ../src/profile-manager.h
+ ../src/proj_pt.h
+ ../src/rdf.h
+ ../src/remove-last.h
+ ../src/removeoverlap.h
+ ../src/require-config.h
+ ../src/resource-manager.h
+ ../src/round-test.h
+ ../src/round.h
+ ../src/rubberband.h
+ ../src/satisfied-guide-cns.h
+ ../src/selcue.h
+ ../src/selection-chemistry.h
+ ../src/selection-describer.h
+ ../src/selection.h
+ ../src/seltrans-handles.h
+ ../src/seltrans.h
+ ../src/shortcuts.h
+ ../src/snap-candidate.h
+ ../src/snap-enums.h
+ ../src/snap-preferences.h
+ ../src/snap.h
+ ../src/snapped-curve.h
+ ../src/snapped-line.h
+ ../src/snapped-point.h
+ ../src/snapper.h
+ ../src/splivarot.h
+ ../src/streq.h
+ ../src/strneq.h
+ ../src/style-enums.h
+ ../src/style-internal.h
+ ../src/style-test.h
+ ../src/style.h
+ ../src/svg-profile.h
+ ../src/svg-view-widget.h
+ ../src/svg-view.h
+ ../src/syseq.h
+ ../src/test-helpers.h
+ ../src/text-chemistry.h
+ ../src/text-editing.h
+ ../src/text-tag-attributes.h
+ ../src/transf_mat_3x4.h
+ ../src/unclump.h
+ ../src/undo-stack-observer.h
+ ../src/unicoderange.h
+ ../src/uri-references.h
+ ../src/uri-test.h
+ ../src/uri.h
+ ../src/vanishing-point.h
+ ../src/verbs-test.h
+ ../src/verbs.h
+ ../src/version.h
+)
+
+get_property(inkscape_global_SRC GLOBAL PROPERTY inkscape_global_SRC)
+
+set_source_files_properties(
+ ${CMAKE_BINARY_DIR}/src/inkscape-version.cpp
+ PROPERTIES GENERATED TRUE)
+
+include_directories(${CMAKE_CURRENT_BINARY_DIR}/__/src)
+
+add_executable(unittest
+ unittest.cpp
+ doc-per-case-test.cpp
+ src/attributes-test.cpp
+ src/color-profile-test.cpp
+ src/dir-util-test.cpp
+ ${inkscape_SRC}
+ ${sp_SRC}
+ ${inkscape_global_SRC}
+ ${CMAKE_BINARY_DIR}/src/inkscape-version.cpp
+)
+
+add_dependencies(unittest inkscape_version)
+
+target_link_libraries(unittest
+ gmock_main
+
+ # order from automake
+ #sp_LIB
+ nrtype_LIB
+
+ #inkscape_LIB
+ #sp_LIB # annoying, we need both!
+ nrtype_LIB # annoying, we need both!
+
+ croco_LIB
+ avoid_LIB
+ gdl_LIB
+ cola_LIB
+ vpsc_LIB
+ livarot_LIB
+ uemf_LIB
+ 2geom_LIB
+ depixelize_LIB
+ util_LIB
+ gc_LIB
+
+ ${INKSCAPE_LIBS}
+)
+
+add_test(BaseTest ${EXECUTABLE_OUTPUT_PATH}/unittest)
+
+add_dependencies(check unittest)
+
+#
diff --git a/test/doc-per-case-test.cpp b/test/doc-per-case-test.cpp
new file mode 100644
index 000000000..da75b1e65
--- /dev/null
+++ b/test/doc-per-case-test.cpp
@@ -0,0 +1,52 @@
+/*
+ * Test fixture with SPDocument per entire test case.
+ *
+ * Author:
+ * Jon A. Cruz <jon@joncruz.org>
+ *
+ * Copyright (C) 2015 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "doc-per-case-test.h"
+
+#include "inkscape.h"
+
+SPDocument *DocPerCaseTest::_doc = 0;
+
+DocPerCaseTest::DocPerCaseTest() :
+ ::testing::Test()
+{
+}
+
+void DocPerCaseTest::SetUpTestCase()
+{
+ if ( !Inkscape::Application::exists() )
+ {
+ // Create the global inkscape object.
+ Inkscape::Application::create("", false);
+ }
+
+ _doc = SPDocument::createNewDoc( NULL, TRUE, true );
+ ASSERT_TRUE( _doc != NULL );
+}
+
+void DocPerCaseTest::TearDownTestCase()
+{
+ if (_doc) {
+ _doc->doUnref();
+ _doc = NULL;
+ }
+}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/test/doc-per-case-test.h b/test/doc-per-case-test.h
new file mode 100644
index 000000000..b6f01403a
--- /dev/null
+++ b/test/doc-per-case-test.h
@@ -0,0 +1,43 @@
+/*
+ * Test fixture with SPDocument per entire test case.
+ *
+ * Author:
+ * Jon A. Cruz <jon@joncruz.org>
+ *
+ * Copyright (C) 2015 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "gtest/gtest.h"
+
+#include "document.h"
+
+
+/**
+ * Simple fixture that creates a single SPDocument to be shared between all tests
+ * in this test case.
+ */
+class DocPerCaseTest : public ::testing::Test
+{
+public:
+ DocPerCaseTest();
+
+protected:
+ static void SetUpTestCase();
+
+ static void TearDownTestCase();
+
+ static SPDocument *_doc;
+};
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/test/src/attributes-test.cpp b/test/src/attributes-test.cpp
new file mode 100644
index 000000000..ab1c3cec6
--- /dev/null
+++ b/test/src/attributes-test.cpp
@@ -0,0 +1,618 @@
+/*
+ * Unit tests for attributes.
+ *
+ * Author:
+ * Jon A. Cruz <jon@joncruz.org>
+ *
+ * Copyright (C) 2015 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <string>
+#include <vector>
+
+#include "gtest/gtest.h"
+
+#include "attributes.h"
+
+namespace {
+
+static const unsigned int FIRST_VALID_ID = 1;
+
+class AttributeInfo
+{
+public:
+ AttributeInfo(std::string const &attr, bool supported) :
+ attr(attr),
+ supported(supported)
+ {
+ }
+
+ std::string attr;
+ bool supported;
+};
+
+typedef std::vector<AttributeInfo>::iterator AttrItr;
+
+std::vector<AttributeInfo> getKnownAttrs()
+{
+/* Extracted mechanically from http://www.w3.org/TR/SVG11/attindex.html:
+
+ tidy -wrap 999 -asxml < attindex.html 2>/dev/null |
+ tr -d \\n |
+ sed 's,<tr>,@,g' |
+ tr @ \\n |
+ sed 's,</td>.*,,;s,^<td>,,;1,/^%/d;/^%/d;s,^, {",;s/$/", false},/' |
+ uniq
+
+ attindex.html lacks attributeName, begin, additive, font, marker;
+ I've added these manually.
+
+ SVG 2: white-space, shape-inside, shape-outside, shape-padding, shape-margin
+*/
+ AttributeInfo all_attrs[] = {
+ AttributeInfo("attributeName", true),
+ AttributeInfo("begin", true),
+ AttributeInfo("additive", true),
+ AttributeInfo("font", true),
+ AttributeInfo("-inkscape-font-specification", true), // TODO look into this attribute's name
+ AttributeInfo("marker", true),
+ AttributeInfo("line-height", true),
+
+ AttributeInfo("accent-height", true),
+ AttributeInfo("accumulate", true),
+ AttributeInfo("alignment-baseline", true),
+ AttributeInfo("alphabetic", true),
+ AttributeInfo("amplitude", true),
+ AttributeInfo("animate", false),
+ AttributeInfo("arabic-form", true),
+ AttributeInfo("ascent", true),
+ AttributeInfo("attributeType", true),
+ AttributeInfo("azimuth", true),
+ AttributeInfo("baseFrequency", true),
+ AttributeInfo("baseline-shift", true),
+ AttributeInfo("baseProfile", false),
+ AttributeInfo("bbox", true),
+ AttributeInfo("bias", true),
+ AttributeInfo("block-progression", true),
+ AttributeInfo("by", true),
+ AttributeInfo("calcMode", true),
+ AttributeInfo("cap-height", true),
+ AttributeInfo("class", false),
+ AttributeInfo("clip", true),
+ AttributeInfo("clip-path", true),
+ AttributeInfo("clip-rule", true),
+ AttributeInfo("clipPathUnits", true),
+ AttributeInfo("color", true),
+ AttributeInfo("color-interpolation", true),
+ AttributeInfo("color-interpolation-filters", true),
+ AttributeInfo("color-profile", true),
+ AttributeInfo("color-rendering", true),
+ AttributeInfo("contentScriptType", false),
+ AttributeInfo("contentStyleType", false),
+ AttributeInfo("cursor", true),
+ AttributeInfo("cx", true),
+ AttributeInfo("cy", true),
+ AttributeInfo("d", true),
+ AttributeInfo("descent", true),
+ AttributeInfo("diffuseConstant", true),
+ AttributeInfo("direction", true),
+ AttributeInfo("display", true),
+ AttributeInfo("divisor", true),
+ AttributeInfo("dominant-baseline", true),
+ AttributeInfo("dur", true),
+ AttributeInfo("dx", true),
+ AttributeInfo("dy", true),
+ AttributeInfo("edgeMode", true),
+ AttributeInfo("elevation", true),
+ AttributeInfo("enable-background", true),
+ AttributeInfo("end", true),
+ AttributeInfo("exponent", true),
+ AttributeInfo("externalResourcesRequired", false),
+ AttributeInfo("feBlend", false),
+ AttributeInfo("feColorMatrix", false),
+ AttributeInfo("feComponentTransfer", false),
+ AttributeInfo("feComposite", false),
+ AttributeInfo("feConvolveMatrix", false),
+ AttributeInfo("feDiffuseLighting", false),
+ AttributeInfo("feDisplacementMap", false),
+ AttributeInfo("feFlood", false),
+ AttributeInfo("feGaussianBlur", false),
+ AttributeInfo("feImage", false),
+ AttributeInfo("feMerge", false),
+ AttributeInfo("feMorphology", false),
+ AttributeInfo("feOffset", false),
+ AttributeInfo("feSpecularLighting", false),
+ AttributeInfo("feTile", false),
+ AttributeInfo("fill", true),
+ AttributeInfo("fill-opacity", true),
+ AttributeInfo("fill-rule", true),
+ AttributeInfo("filter", true),
+ AttributeInfo("filterRes", true),
+ AttributeInfo("filterUnits", true),
+ AttributeInfo("flood-color", true),
+ AttributeInfo("flood-opacity", true),
+ AttributeInfo("font-family", true),
+ AttributeInfo("font-size", true),
+ AttributeInfo("font-size-adjust", true),
+ AttributeInfo("font-stretch", true),
+ AttributeInfo("font-style", true),
+ AttributeInfo("font-variant", true),
+ AttributeInfo("font-weight", true),
+ AttributeInfo("format", false),
+ AttributeInfo("from", true),
+ AttributeInfo("fx", true),
+ AttributeInfo("fy", true),
+ AttributeInfo("g1", true),
+ AttributeInfo("g2", true),
+ AttributeInfo("glyph-name", true),
+ AttributeInfo("glyph-orientation-horizontal", true),
+ AttributeInfo("glyph-orientation-vertical", true),
+ AttributeInfo("glyphRef", false),
+ AttributeInfo("gradientTransform", true),
+ AttributeInfo("gradientUnits", true),
+ AttributeInfo("hanging", true),
+ AttributeInfo("hatchContentUnits", true), // SVG 2.0
+ AttributeInfo("hatchTransform", true), // SVG 2.0 TODO renamed to transform
+ AttributeInfo("hatchUnits", true), // SVG 2.0
+ AttributeInfo("height", true),
+ AttributeInfo("horiz-adv-x", true),
+ AttributeInfo("horiz-origin-x", true),
+ AttributeInfo("horiz-origin-y", true),
+ AttributeInfo("ideographic", true),
+ AttributeInfo("image-rendering", true),
+ AttributeInfo("in", true),
+ AttributeInfo("in2", true),
+ AttributeInfo("intercept", true),
+ AttributeInfo("isolation", true),
+ AttributeInfo("k", true),
+ AttributeInfo("k1", true),
+ AttributeInfo("k2", true),
+ AttributeInfo("k3", true),
+ AttributeInfo("k4", true),
+ AttributeInfo("kernelMatrix", true),
+ AttributeInfo("kernelUnitLength", true),
+ AttributeInfo("kerning", true),
+ AttributeInfo("keyPoints", false),
+ AttributeInfo("keySplines", true),
+ AttributeInfo("keyTimes", true),
+ AttributeInfo("lang", true),
+ AttributeInfo("lengthAdjust", true),
+ AttributeInfo("letter-spacing", true),
+ AttributeInfo("lighting-color", true),
+ AttributeInfo("limitingConeAngle", true),
+ AttributeInfo("local", true),
+ AttributeInfo("marker-end", true),
+ AttributeInfo("marker-mid", true),
+ AttributeInfo("marker-start", true),
+ AttributeInfo("markerHeight", true),
+ AttributeInfo("markerUnits", true),
+ AttributeInfo("markerWidth", true),
+ AttributeInfo("mask", true),
+ AttributeInfo("maskContentUnits", true),
+ AttributeInfo("maskUnits", true),
+ AttributeInfo("mathematical", true),
+ AttributeInfo("max", true),
+ AttributeInfo("media", false),
+ AttributeInfo("method", false),
+ AttributeInfo("min", true),
+ AttributeInfo("mix-blend-mode", true),
+ AttributeInfo("mode", true),
+ AttributeInfo("name", true),
+ AttributeInfo("numOctaves", true),
+ AttributeInfo("offset", true),
+ AttributeInfo("onabort", false),
+ AttributeInfo("onactivate", false),
+ AttributeInfo("onbegin", false),
+ AttributeInfo("onclick", false),
+ AttributeInfo("onend", false),
+ AttributeInfo("onerror", false),
+ AttributeInfo("onfocusin", false),
+ AttributeInfo("onfocusout", false),
+ AttributeInfo("onload", true),
+ AttributeInfo("onmousedown", false),
+ AttributeInfo("onmousemove", false),
+ AttributeInfo("onmouseout", false),
+ AttributeInfo("onmouseover", false),
+ AttributeInfo("onmouseup", false),
+ AttributeInfo("onrepeat", false),
+ AttributeInfo("onresize", false),
+ AttributeInfo("onscroll", false),
+ AttributeInfo("onunload", false),
+ AttributeInfo("onzoom", false),
+ AttributeInfo("opacity", true),
+ AttributeInfo("operator", true),
+ AttributeInfo("order", true),
+ AttributeInfo("orient", true),
+ AttributeInfo("orientation", true),
+ AttributeInfo("origin", false),
+ AttributeInfo("overflow", true),
+ AttributeInfo("overline-position", true),
+ AttributeInfo("overline-thickness", true),
+ AttributeInfo("paint-order", true),
+ AttributeInfo("panose-1", true),
+ AttributeInfo("path", true),
+ AttributeInfo("pathLength", false),
+ AttributeInfo("patternContentUnits", true),
+ AttributeInfo("patternTransform", true),
+ AttributeInfo("patternUnits", true),
+ AttributeInfo("pitch", true), // SVG 2.-
+ AttributeInfo("pointer-events", true),
+ AttributeInfo("points", true),
+ AttributeInfo("pointsAtX", true),
+ AttributeInfo("pointsAtY", true),
+ AttributeInfo("pointsAtZ", true),
+ AttributeInfo("preserveAlpha", true),
+ AttributeInfo("preserveAspectRatio", true),
+ AttributeInfo("primitiveUnits", true),
+ AttributeInfo("r", true),
+ AttributeInfo("radius", true),
+ AttributeInfo("refX", true),
+ AttributeInfo("refY", true),
+ AttributeInfo("rendering-intent", true),
+ AttributeInfo("repeatCount", true),
+ AttributeInfo("repeatDur", true),
+ AttributeInfo("requiredFeatures", true),
+ AttributeInfo("requiredExtensions", true),
+ AttributeInfo("restart", true),
+ AttributeInfo("result", true),
+ AttributeInfo("rotate", true),
+ AttributeInfo("rx", true),
+ AttributeInfo("ry", true),
+ AttributeInfo("scale", true),
+ AttributeInfo("seed", true),
+ AttributeInfo("shape-inside", true),
+ AttributeInfo("shape-margin", true),
+ AttributeInfo("shape-outside", true),
+ AttributeInfo("shape-padding", true),
+ AttributeInfo("shape-rendering", true),
+ AttributeInfo("slope", true),
+ AttributeInfo("solid-color", true), // SVG 2.0
+ AttributeInfo("solid-opacity", true), // SVG 2.0
+ AttributeInfo("spacing", false),
+ AttributeInfo("specularConstant", true),
+ AttributeInfo("specularExponent", true),
+ AttributeInfo("spreadMethod", true),
+ AttributeInfo("startOffset", true),
+ AttributeInfo("stdDeviation", true),
+ AttributeInfo("stemh", true),
+ AttributeInfo("stemv", true),
+ AttributeInfo("stitchTiles", true),
+ AttributeInfo("stop-color", true),
+ AttributeInfo("stop-opacity", true),
+ AttributeInfo("strikethrough-position", true),
+ AttributeInfo("strikethrough-thickness", true),
+ AttributeInfo("stroke", true),
+ AttributeInfo("stroke-dasharray", true),
+ AttributeInfo("stroke-dashoffset", true),
+ AttributeInfo("stroke-linecap", true),
+ AttributeInfo("stroke-linejoin", true),
+ AttributeInfo("stroke-miterlimit", true),
+ AttributeInfo("stroke-opacity", true),
+ AttributeInfo("stroke-width", true),
+ AttributeInfo("style", true),
+ AttributeInfo("surfaceScale", true),
+ AttributeInfo("systemLanguage", true),
+ AttributeInfo("tableValues", true),
+ AttributeInfo("target", true),
+ AttributeInfo("targetX", true),
+ AttributeInfo("targetY", true),
+ AttributeInfo("text-align", true),
+ AttributeInfo("text-anchor", true),
+ AttributeInfo("text-decoration", true),
+ AttributeInfo("text-decoration-color", true),
+ AttributeInfo("text-decoration-line", true),
+ AttributeInfo("text-decoration-style", true),
+ AttributeInfo("text-indent", true),
+ AttributeInfo("text-rendering", true),
+ AttributeInfo("text-transform", true),
+ AttributeInfo("textLength", true),
+ AttributeInfo("title", false),
+ AttributeInfo("to", true),
+ AttributeInfo("transform", true),
+ AttributeInfo("type", true),
+ AttributeInfo("u1", true),
+ AttributeInfo("u2", true),
+ AttributeInfo("underline-position", true),
+ AttributeInfo("underline-thickness", true),
+ AttributeInfo("unicode", true),
+ AttributeInfo("unicode-bidi", true),
+ AttributeInfo("unicode-range", true),
+ AttributeInfo("units-per-em", true),
+ AttributeInfo("v-alphabetic", true),
+ AttributeInfo("v-hanging", true),
+ AttributeInfo("v-ideographic", true),
+ AttributeInfo("v-mathematical", true),
+ AttributeInfo("values", true),
+ AttributeInfo("version", true),
+ AttributeInfo("vert-adv-y", true),
+ AttributeInfo("vert-origin-x", true),
+ AttributeInfo("vert-origin-y", true),
+ AttributeInfo("viewBox", true),
+ AttributeInfo("viewTarget", false),
+ AttributeInfo("visibility", true),
+ AttributeInfo("white-space", true),
+ AttributeInfo("width", true),
+ AttributeInfo("widths", true),
+ AttributeInfo("word-spacing", true),
+ AttributeInfo("writing-mode", true),
+ AttributeInfo("x", true),
+ AttributeInfo("x-height", true),
+ AttributeInfo("x1", true),
+ AttributeInfo("x2", true),
+ AttributeInfo("xChannelSelector", true),
+ AttributeInfo("xlink:actuate", true),
+ AttributeInfo("xlink:arcrole", true),
+ AttributeInfo("xlink:href", true),
+ AttributeInfo("xlink:role", true),
+ AttributeInfo("xlink:show", true),
+ AttributeInfo("xlink:title", true),
+ AttributeInfo("xlink:type", true),
+ AttributeInfo("xml:base", false),
+ AttributeInfo("xml:space", true),
+ AttributeInfo("xmlns", false),
+ AttributeInfo("xmlns:xlink", false),
+ AttributeInfo("y", true),
+ AttributeInfo("y1", true),
+ AttributeInfo("y2", true),
+ AttributeInfo("yChannelSelector", true),
+ AttributeInfo("z", true),
+ AttributeInfo("zoomAndPan", false),
+
+ // Extra attributes.
+ AttributeInfo("id", true),
+ AttributeInfo("inkscape:bbox-nodes", true),
+ AttributeInfo("inkscape:bbox-paths", true),
+ AttributeInfo("inkscape:box3dsidetype", true),
+ AttributeInfo("inkscape:collect", true),
+ AttributeInfo("inkscape:connection-end", true),
+ AttributeInfo("inkscape:connection-end-point", true),
+ AttributeInfo("inkscape:connection-points", true),
+ AttributeInfo("inkscape:connection-start", true),
+ AttributeInfo("inkscape:connection-start-point", true),
+ AttributeInfo("inkscape:connector-avoid", true),
+ AttributeInfo("inkscape:connector-curvature", true),
+ AttributeInfo("inkscape:connector-spacing", true),
+ AttributeInfo("inkscape:connector-type", true),
+ AttributeInfo("inkscape:corner0", true),
+ AttributeInfo("inkscape:corner7", true),
+ AttributeInfo("inkscape:current-layer", true),
+ AttributeInfo("inkscape:cx", true),
+ AttributeInfo("inkscape:cy", true),
+ AttributeInfo("inkscape:document-units", true),
+ AttributeInfo("inkscape:dstBox", true),
+ AttributeInfo("inkscape:dstColumn", true),
+ AttributeInfo("inkscape:dstPath", true),
+ AttributeInfo("inkscape:dstShape", true),
+ AttributeInfo("inkscape:excludeShape", true),
+ AttributeInfo("inkscape:expanded", true),
+ AttributeInfo("inkscape:flatsided", true),
+ AttributeInfo("inkscape:groupmode", true),
+ AttributeInfo("inkscape:highlight-color", true),
+ AttributeInfo("inkscape:href", true),
+ AttributeInfo("inkscape:label", true),
+ AttributeInfo("inkscape:layoutOptions", true),
+ AttributeInfo("inkscape:object-nodes", true),
+ AttributeInfo("inkscape:object-paths", true),
+ AttributeInfo("inkscape:original", true),
+ AttributeInfo("inkscape:original-d", true),
+ AttributeInfo("inkscape:pageopacity", true),
+ AttributeInfo("inkscape:pageshadow", true),
+ AttributeInfo("inkscape:path-effect", true),
+ AttributeInfo("inkscape:persp3d", true),
+ AttributeInfo("inkscape:persp3d-origin", true),
+ AttributeInfo("inkscape:perspectiveID", true),
+ AttributeInfo("inkscape:radius", true),
+ AttributeInfo("inkscape:randomized", true),
+ AttributeInfo("inkscape:rounded", true),
+ AttributeInfo("inkscape:snap-bbox", true),
+ AttributeInfo("inkscape:snap-bbox-edge-midpoints", true),
+ AttributeInfo("inkscape:snap-bbox-midpoints", true),
+ AttributeInfo("inkscape:snap-center", true),
+ AttributeInfo("inkscape:snap-global", true),
+ AttributeInfo("inkscape:snap-grids", true),
+ AttributeInfo("inkscape:snap-intersection-paths", true),
+ AttributeInfo("inkscape:snap-midpoints", true),
+ AttributeInfo("inkscape:snap-nodes", true),
+ AttributeInfo("inkscape:snap-object-midpoints", true),
+ AttributeInfo("inkscape:snap-others", true),
+ AttributeInfo("inkscape:snap-page", true),
+ AttributeInfo("inkscape:snap-path-clip", true),
+ AttributeInfo("inkscape:snap-path-mask", true),
+ AttributeInfo("inkscape:snap-perpendicular", true),
+ AttributeInfo("inkscape:snap-smooth-nodes", true),
+ AttributeInfo("inkscape:snap-tangential", true),
+ AttributeInfo("inkscape:snap-text-baseline", true),
+ AttributeInfo("inkscape:snap-to-guides", true),
+ AttributeInfo("inkscape:srcNoMarkup", true),
+ AttributeInfo("inkscape:srcPango", true),
+ AttributeInfo("inkscape:transform-center-x", true),
+ AttributeInfo("inkscape:transform-center-y", true),
+ AttributeInfo("inkscape:version", true),
+ AttributeInfo("inkscape:vp_x", true),
+ AttributeInfo("inkscape:vp_y", true),
+ AttributeInfo("inkscape:vp_z", true),
+ AttributeInfo("inkscape:window-height", true),
+ AttributeInfo("inkscape:window-maximized", true),
+ AttributeInfo("inkscape:window-width", true),
+ AttributeInfo("inkscape:window-x", true),
+ AttributeInfo("inkscape:window-y", true),
+ AttributeInfo("inkscape:zoom", true),
+ AttributeInfo("osb:paint", true),
+ AttributeInfo("sodipodi:arg1", true),
+ AttributeInfo("sodipodi:arg2", true),
+ AttributeInfo("sodipodi:argument", true),
+ AttributeInfo("sodipodi:cx", true),
+ AttributeInfo("sodipodi:cy", true),
+ AttributeInfo("sodipodi:end", true),
+ AttributeInfo("sodipodi:expansion", true),
+ AttributeInfo("sodipodi:insensitive", true),
+ AttributeInfo("sodipodi:linespacing", true),
+ AttributeInfo("sodipodi:nonprintable", true),
+ AttributeInfo("sodipodi:open", true),
+ AttributeInfo("sodipodi:original", true),
+ AttributeInfo("sodipodi:r1", true),
+ AttributeInfo("sodipodi:r2", true),
+ AttributeInfo("sodipodi:radius", true),
+ AttributeInfo("sodipodi:revolution", true),
+ AttributeInfo("sodipodi:role", true),
+ AttributeInfo("sodipodi:rx", true),
+ AttributeInfo("sodipodi:ry", true),
+ AttributeInfo("sodipodi:sides", true),
+ AttributeInfo("sodipodi:start", true),
+ AttributeInfo("sodipodi:t0", true),
+ AttributeInfo("sodipodi:version", false),
+
+ // SPMeshPatch
+ AttributeInfo("tensor", true),
+
+ // SPNamedView
+ AttributeInfo("fit-margin-top", true),
+ AttributeInfo("fit-margin-left", true),
+ AttributeInfo("fit-margin-right", true),
+ AttributeInfo("fit-margin-bottom", true),
+ AttributeInfo("units", true),
+ AttributeInfo("viewonly", true),
+ AttributeInfo("showgrid", true),
+// AttributeInfo("gridtype", true),
+ AttributeInfo("showguides", true),
+ AttributeInfo("gridtolerance", true),
+ AttributeInfo("guidetolerance", true),
+ AttributeInfo("objecttolerance", true),
+/* AttributeInfo("gridoriginx", true),
+ AttributeInfo("gridoriginy", true),
+ AttributeInfo("gridspacingx", true),
+ AttributeInfo("gridspacingy", true),
+ AttributeInfo("gridanglex", true),
+ AttributeInfo("gridanglez", true),
+ AttributeInfo("gridcolor", true),
+ AttributeInfo("gridopacity", true),
+ AttributeInfo("gridempcolor", true),
+ AttributeInfo("gridempopacity", true),
+ AttributeInfo("gridempspacing", true), */
+ AttributeInfo("guidecolor", true),
+ AttributeInfo("guideopacity", true),
+ AttributeInfo("guidehicolor", true),
+ AttributeInfo("guidehiopacity", true),
+ AttributeInfo("showborder", true),
+ AttributeInfo("inkscape:showpageshadow", true),
+ AttributeInfo("borderlayer", true),
+ AttributeInfo("bordercolor", true),
+ AttributeInfo("borderopacity", true),
+ AttributeInfo("pagecolor", true),
+
+ // SPGuide
+ AttributeInfo("position", true)
+ };
+
+ size_t count = sizeof(all_attrs) / sizeof(all_attrs[0]);
+ std::vector<AttributeInfo> vect(all_attrs, all_attrs + count);
+ EXPECT_GT(vect.size(), size_t(100)); // should be more than
+ return vect;
+}
+
+/**
+ * Returns a vector with counts for all IDs up to the highest known value.
+ *
+ * The index is the ID, and the value is the number of times that ID is seen.
+ */
+std::vector<size_t> getIdIds()
+{
+ std::vector<size_t> ids;
+ std::vector<AttributeInfo> all_attrs = getKnownAttrs();
+ ids.reserve(all_attrs.size()); // minimize memory thrashing
+ for (AttrItr it(all_attrs.begin()); it != all_attrs.end(); ++it) {
+ unsigned int id = sp_attribute_lookup(it->attr.c_str());
+ if (id >= ids.size()) {
+ ids.resize(id + 1);
+ }
+ ids[id]++;
+ }
+
+ return ids;
+}
+
+// Ensure 'supported' value for each known attribute is correct.
+TEST(AttributesTest, SupportedKnown)
+{
+ std::vector<AttributeInfo> all_attrs = getKnownAttrs();
+ for (AttrItr it(all_attrs.begin()); it != all_attrs.end(); ++it) {
+ unsigned int id = sp_attribute_lookup(it->attr.c_str());
+ EXPECT_EQ(it->supported, id != 0u) << "Matching for attribute '" << it->attr << "'";
+ }
+}
+
+// Ensure names of known attributes are preserved when converted to id and back.
+TEST(AttributesTest, NameRoundTrip)
+{
+ std::vector<AttributeInfo> all_attrs = getKnownAttrs();
+ for (AttrItr it(all_attrs.begin()); it != all_attrs.end(); ++it) {
+ if (it->supported) {
+ unsigned int id = sp_attribute_lookup(it->attr.c_str());
+ char const *redoneName = reinterpret_cast<char const *>(sp_attribute_name(id));
+ EXPECT_TRUE(redoneName != NULL) << "For attribute '" << it->attr << "'";
+ if (redoneName) {
+ EXPECT_EQ(it->attr, redoneName);
+ }
+ }
+ }
+}
+
+/* Test for any attributes that this test program doesn't know about.
+ *
+ * If any are found, then:
+ *
+ * If it is in the `inkscape:' namespace then simply add it to all_attrs with
+ * `true' as the second field (`supported').
+ *
+ * If it is in the `sodipodi:' namespace then check the spelling against sodipodi
+ * sources. If you don't have sodipodi sources, then don't add it: leave to someone
+ * else.
+ *
+ * Otherwise, it's probably a bug: ~all SVG 1.1 attributes should already be
+ * in the all_attrs table. However, the comment above all_attrs does mention
+ * some things missing from attindex.html, so there may be more. Check the SVG
+ * spec. Another possibility is that the attribute is new in SVG 1.2. In this case,
+ * check the spelling against the [draft] SVG 1.2 spec before adding to all_attrs.
+ * (If you can't be bothered checking the spec, then don't update all_attrs.)
+ *
+ * If the attribute isn't in either SVG 1.1 or 1.2 then it's probably a mistake
+ * for it not to be in the inkscape namespace. (Not sure about attributes used only
+ * on elements in the inkscape namespace though.)
+ *
+ * In any case, make sure that the attribute's source is documented accordingly.
+ */
+TEST(AttributesTest, ValuesAreKnown)
+{
+ std::vector<size_t> ids = getIdIds();
+ for (size_t i = FIRST_VALID_ID; i < ids.size(); ++i) {
+ if (!ids[i]) {
+ unsigned char const *name = sp_attribute_name(i);
+ EXPECT_TRUE(ids[i] > 0) << "Attribute string with enum " << i << " {" << name << "} not handled";
+ }
+ }
+}
+
+// Ensure two different names aren't mapped to the same enum value.
+TEST(AttributesTest, ValuesUnique)
+{
+ std::vector<size_t> ids = getIdIds();
+ for (size_t i = FIRST_VALID_ID; i < ids.size(); ++i) {
+ EXPECT_LE(ids[i], size_t(1)) << "Attribute enum " << i << " used for multiple strings"
+ << " including {" << sp_attribute_name(i) << "}";
+ }
+}
+
+} // namespace
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/test/src/color-profile-test.cpp b/test/src/color-profile-test.cpp
new file mode 100644
index 000000000..365be687a
--- /dev/null
+++ b/test/src/color-profile-test.cpp
@@ -0,0 +1,126 @@
+/*
+ * Unit tests for color profile.
+ *
+ * Author:
+ * Jon A. Cruz <jon@joncruz.org>
+ *
+ * Copyright (C) 2015 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "gtest/gtest.h"
+
+#include "attributes.h"
+#include "cms-system.h"
+#include "color-profile.h"
+#include "doc-per-case-test.h"
+
+namespace {
+
+/**
+ * Test fixture to inherit a shared doc and create a color profile instance per test.
+ */
+class ProfTest : public DocPerCaseTest
+{
+public:
+ ProfTest() :
+ DocPerCaseTest(),
+ _prof(0)
+ {
+ }
+
+protected:
+ virtual void SetUp()
+ {
+ DocPerCaseTest::SetUp();
+ _prof = new Inkscape::ColorProfile();
+ ASSERT_TRUE( _prof != NULL );
+ _prof->document = _doc;
+ }
+
+ virtual void TearDown()
+ {
+ if (_prof) {
+ delete _prof;
+ _prof = NULL;
+ }
+ DocPerCaseTest::TearDown();
+ }
+
+ Inkscape::ColorProfile *_prof;
+};
+
+typedef ProfTest ColorProfileTest;
+
+TEST_F(ColorProfileTest, SetRenderingIntent)
+{
+ struct {
+ gchar const *attr;
+ guint intVal;
+ }
+ const cases[] = {
+ {"auto", (guint)Inkscape::RENDERING_INTENT_AUTO},
+ {"perceptual", (guint)Inkscape::RENDERING_INTENT_PERCEPTUAL},
+ {"relative-colorimetric", (guint)Inkscape::RENDERING_INTENT_RELATIVE_COLORIMETRIC},
+ {"saturation", (guint)Inkscape::RENDERING_INTENT_SATURATION},
+ {"absolute-colorimetric", (guint)Inkscape::RENDERING_INTENT_ABSOLUTE_COLORIMETRIC},
+ {"something-else", (guint)Inkscape::RENDERING_INTENT_UNKNOWN},
+ {"auto2", (guint)Inkscape::RENDERING_INTENT_UNKNOWN},
+ };
+
+ for ( size_t i = 0; i < G_N_ELEMENTS( cases ); i++ ) {
+ _prof->setKeyValue( SP_ATTR_RENDERING_INTENT, cases[i].attr);
+ ASSERT_EQ( (guint)cases[i].intVal, _prof->rendering_intent ) << cases[i].attr;
+ }
+}
+
+TEST_F(ColorProfileTest, SetLocal)
+{
+ gchar const* cases[] = {
+ "local",
+ "something",
+ };
+
+ for ( size_t i = 0; i < G_N_ELEMENTS( cases ); i++ ) {
+ _prof->setKeyValue( SP_ATTR_LOCAL, cases[i]);
+ ASSERT_TRUE( _prof->local != NULL );
+ if ( _prof->local ) {
+ ASSERT_EQ( std::string(cases[i]), _prof->local );
+ }
+ }
+ _prof->setKeyValue( SP_ATTR_LOCAL, NULL);
+ ASSERT_EQ( (gchar*)0, _prof->local );
+}
+
+TEST_F(ColorProfileTest, SetName)
+{
+ gchar const* cases[] = {
+ "name",
+ "something",
+ };
+
+ for ( size_t i = 0; i < G_N_ELEMENTS( cases ); i++ ) {
+ _prof->setKeyValue( SP_ATTR_NAME, cases[i]);
+ ASSERT_TRUE( _prof->name != NULL );
+ if ( _prof->name ) {
+ ASSERT_EQ( std::string(cases[i]), _prof->name );
+ }
+ }
+ _prof->setKeyValue( SP_ATTR_NAME, NULL );
+ ASSERT_EQ( (gchar*)0, _prof->name );
+}
+
+
+} // namespace
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/test/src/dir-util-test.cpp b/test/src/dir-util-test.cpp
new file mode 100644
index 000000000..32b3fce74
--- /dev/null
+++ b/test/src/dir-util-test.cpp
@@ -0,0 +1,63 @@
+/*
+ * Unit tests for dir utils.
+ *
+ * Author:
+ * Jon A. Cruz <jon@joncruz.org>
+ *
+ * Copyright (C) 2015 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "gtest/gtest.h"
+
+#include <glib.h>
+
+#include "dir-util.h"
+
+namespace {
+
+
+TEST(DirUtilTest, Base)
+{
+ char const* cases[][3] = {
+#if defined(WIN32) || defined(__WIN32__)
+ {"\\foo\\bar", "\\foo", "bar"},
+ {"\\foo\\barney", "\\foo\\bar", "\\foo\\barney"},
+ {"\\foo\\bar\\baz", "\\foo\\", "bar\\baz"},
+ {"\\foo\\bar\\baz", "\\", "foo\\bar\\baz"},
+ {"\\foo\\bar\\baz", "\\foo\\qux", "\\foo\\bar\\baz"},
+#else
+ {"/foo/bar", "/foo", "bar"},
+ {"/foo/barney", "/foo/bar", "/foo/barney"},
+ {"/foo/bar/baz", "/foo/", "bar/baz"},
+ {"/foo/bar/baz", "/", "foo/bar/baz"},
+ {"/foo/bar/baz", "/foo/qux", "/foo/bar/baz"},
+#endif
+ };
+
+ for ( size_t i = 0; i < G_N_ELEMENTS(cases); i++ )
+ {
+ if ( cases[i][0] && cases[i][1] ) { // std::string can't use null.
+ std::string result = sp_relative_path_from_path( cases[i][0], cases[i][1] );
+ ASSERT_FALSE( result.empty() );
+ if ( !result.empty() )
+ {
+ ASSERT_EQ( std::string(cases[i][2]), result );
+ }
+ }
+ }
+}
+
+} // namespace
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/test/unittest.cpp b/test/unittest.cpp
new file mode 100644
index 000000000..0ec8f0383
--- /dev/null
+++ b/test/unittest.cpp
@@ -0,0 +1,58 @@
+/*
+ * Unit test main.
+ *
+ * Author:
+ * Jon A. Cruz <jon@joncruz.org>
+ *
+ * Copyright (C) 2015 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "gtest/gtest.h"
+
+#include <gtkmm.h>
+
+#include "inkgc/gc-core.h"
+#include "inkscape.h"
+
+namespace {
+
+// Ensure that a known positive test works
+TEST(PreTest, WorldIsSane)
+{
+ EXPECT_EQ(4, 2 + 2);
+}
+
+// Example of type casting to avoid compile warnings.
+
+
+} // namespace
+
+int main(int argc, char **argv) {
+
+ // setup general environment
+#if !GLIB_CHECK_VERSION(2,36,0)
+ g_type_init();
+#endif
+ int tmpArgc = 1;
+ char const *tmp[] = {"foo", ""};
+ char **tmpArgv = const_cast<char **>(tmp);
+ Gtk::Main(tmpArgc, tmpArgv);
+
+ Inkscape::GC::init();
+
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :